首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

WPF/Silverlight 遊戲開發教程(三十九之三):Silverlight 引擎優化成果總結(下)

     編輯:關於C語言

2) 改進「托盤式」主位地圖移動模式

感謝「內Cool超人」點醒:主角與所有物件可放同一 Canvas,ZIndex 照常處理,實現托盤式移動。畫面效能無提升,但配合 Coordinate 相依性屬性回調,可去除遍歷所有物件位置迴圈,邏輯效能大幅提升。

3) 隱藏遠離視窗的精靈物件

Web 遊戲必須處理,大幅減少不必要呈現與運算:

if ((Math.Abs(sprite.Coordinate.X - Leader.Coordinate.X) > this.ActualWidth / 2) || (Math.Abs(sprite.Coordinate.Y - Leader.Coordinate.Y) > this.ActualHeight / 2))
{
    sprite.Visibility = Visibility.Collapsed;
    sprite.Timer.Stop();
}
else
{
    if (!sprite.Timer.IsEnabled) { sprite.Visibility = Visibility.Visible; sprite.Timer.Start(); }
}

輔助計時器 0.5 秒間隔判斷,超出可視範圍隱藏並停止切幀,否則恢復。對整體效能決定性關鍵。網遊可擴展二級範圍:一級為可視範圍,二級更遠則移除釋放資源。

4) 改進即時障礙物系統

兩障礙物陣列 (0-255,0 障礙,非 0 可通。1 標識無物體可通區,10-19 標識傳送點。可擴展:20 水域、21 沙漠等,移動播對應腳步聲更逼真)。A* 移動時先去除精靈腳底障礙區 (HoldWidth/HoldHeight),啟動尋路,找到路徑後補回:

SetSpriteObstruction(sprite, 1);
AStarMove(sprite, GetSpriteEdge(enemy));
sprite.UseAStarMove = true;
SetSpriteObstruction(sprite, 0);

SetSpriteObstruction 實作:

private void SetSpriteObstruction(QXSprite sprite, byte sign)
{
    int x = (int)(sprite.Coordinate.X / gridSizeX);
    int y = (int)(sprite.Coordinate.Y / gridSizeY);
    for (int m = x - sprite.HoldWidth; m <= x + sprite.HoldWidth; m++)
        for (int n = y - sprite.HoldHeight; n <= y + sprite.HoldHeight; n++)
            if (fixedObstruction[m, n] != 0) varyObstruction[m, n] = sign;
}

僅在固定障礙非 0 處標記動態值,避免覆蓋地形資訊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved