我到处寻找解决这个问题的方法(我可能只是盲目地看到周围的解决方案)。我的游戏目前在屏幕上渲染瓷砖地图,并且不会渲染实际上不在屏幕范围内的瓷砖。但是,每个图块都是 16x16 像素,这意味着如果屏幕上的每个像素都包含一个分辨率为 1920x1080 的图块,则要绘制 8100 个图块。
每个周期绘制那么多图块真的会杀死我的 FPS。如果我运行 800x600 分辨率,我的 FPS 会达到 ~20,而在 1920x1080 时,它的运行速度约为 3-5 FPS。这真的让我抓狂。
我尝试过线程化和使用异步任务,但那些只是闪烁屏幕。可能只是我编码不正确。
这是我目前使用的绘图代码。
// Get top-left tile-X
Vector topLeft = new Vector(Screen.Camera.X / 16 - 1,
Screen.Camera.Y / 16 - 1);
Vector bottomRight = new Vector(topLeft.X + (Screen.Width / 16) + 2,
topLeft.Y + (Screen.Height / 16) + 2);
// Iterate sections
foreach (WorldSection section in Sections)
{
// Continue if out of bounds
if (section.X + ((Screen.Width / 16) + 2) < (int)topLeft.X ||
section.X >= bottomRight.X)
continue;
// Draw all tiles within the screen range
for (int x = topLeft.X; x < bottomRight.X; x++)
for (int y = topLeft.Y; y < bottomRight.Y; y++)
if (section.Blocks[x - section.X, y] != '0')
DrawBlock(section.Blocks[x - section.X, y],
x + section.X, y);
}
有 8 到 12 个部分。每个图块由二维数组中的 char 对象表示。
画块方法:
public void DrawBlock(char block, int x int y)
{
// Get the source rectangle
Rectangle source = new Rectangle(Index(block) % Columns * FrameWidth,
Index(block) / Columns * FrameHeight, FrameWidth, FrameHeight);
// Get position
Vector2 position = new Vector2(x, y);
// Draw the block
Game.spriteBatch.Draw(Frameset, position * new Vector2(FrameWidth, FrameHeight) - Screen.Camera, source, Color.White);
}
Index() 方法只返回对应于 char 的图块的帧索引。
我想知道如何才能真正允许一次绘制这么多而不以这种方式杀死帧速率。我提供的代码显然不是很优化,还是我应该做一些特定的事情才能在不降低性能的情况下绘制这么多单独的图块?