まず、XNAフレームワークを使用して2D戦略ゲームに取り組んでいます。
ゲームに2Dの戦場の霧を実装しています。グラフィック部分はすでに完成していて、かなりうまく機能していますが、私は今、この戦場の霧の「論理」部分を実装しようとしています。
レベルを表す2Dグリッドを作成しました。各フレーム、各ユニットは、ブレゼンハムのアルゴリズムを使用して、その周りの円内のセルを更新します(これは、特定の円内にあるセルを把握するための最良の方法のようです)。これは実際に機能しています...特定の位置が表示されているかどうかを知りたい場合は、セルの状態を取得する必要があります...
問題は、スポーンされたユニットが大量にあると、ゲームの実行が非常に遅くなることです...このパフォーマンスの問題の最初の理由は、すべてのユニットが周囲のセルを更新するため、多くのセルが複数回更新されることです...しかし、私はこれに対する解決策を見ることができません...
だから...多分私はそれをこのように実装するのが間違っていたのかもしれません、あるいは私は明らかな最適化を逃しているのかもしれませんが、私はちょっと立ち往生しています...
コードは次のとおりです。
class LevelGridCell
{
public void SetVisible(float a_time)
{
if (m_visibleTime < a_time)
m_visibleTime = a_time;
}
public bool IsVisible(float a_time)
{
return (m_visibleTime != 0f && m_visibleTime >= a_time);
}
float m_visibleTime = 0;
}
class LevelGrid
{
public LevelGridCell GetAt(int a_x, int a_y)
{
return m_grid[a_x + a_y * m_width];
}
public void SetVisible(float a_time, int a_x, int a_y, float a_radius)
{
GetAt(a_x, a_y).SetVisible(a_time);
int intRadius = (int)(a_radius / m_cellSize);
int x = 0, y = intRadius, p = 1 - intRadius;
PlotSetVisible(a_x, a_y, x, y, a_time);
while (x < y)
{
x++;
if (p < 0)
p += 2 * x + 1;
else
{
y--;
p += 2 * (x - y) + 1;
}
PlotSetVisible(a_x, a_y, x, y, a_time);
}
}
private void SafeSetVisible(int a_x, int a_y, float a_time)
{
if (a_x >= 0 && a_x < m_width && a_y >= 0 && a_y < m_height)
{
GetAt(a_x, a_y).SetVisible(a_time);
}
}
private void PlotSetVisible(int xctr, int yctr, int x, int y, float a_time)
{
for (int i = xctr - x; i <= xctr + x; ++i)
{
SafeSetVisible(i, yctr + y, a_time);
SafeSetVisible(i, yctr - y, a_time);
}
for (int i = xctr - y; i <= xctr + y; ++i)
{
SafeSetVisible(i, yctr + x, a_time);
SafeSetVisible(i, yctr - x, a_time);
}
}
List<LevelGridCell> m_grid = new List<LevelGridCell>();
float m_cellSize;
int m_width;
int m_height;
}