首先,我正在使用 XNA 框架开发 2D 策略游戏。
我正在为我的游戏实现 2D 战争迷雾。图形部分已经完成并且工作得很好,但我现在正在尝试实现这场战争迷雾的“逻辑”部分。
我创建了一个代表我的关卡的 2D 网格。每一帧,每个单元都使用 Bresenham 算法(这似乎是找出给定圆圈中哪些单元格的最佳方法)更新围绕它的圆圈中的单元格。这实际上有效......当我想知道给定位置是否可见时,我只需要获取单元格的状态......
问题是,当我有大量生成的单元时,我的游戏运行速度很慢......这个性能问题的第一个原因是,由于每个单元都会更新它周围的单元格,所以很多单元格都会多次更新......但是我看不到任何解决方案...
所以......也许我以这种方式实现它是错误的,或者我错过了一个明显的优化,但我有点卡住......
这是代码:
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;
}