最近我一直在尝试使用SFML和c ++开发2D Terraria风格的游戏。一切都在为随机地形生成完全期待。目前,我有一个for循环,它将位置和纹理分配给一个精灵数组(例如:int grass [150]),然后使用for循环将其绘制到屏幕上。地形生成并且看起来没问题但是,每次我的程序循环时,都会将多个精灵数组绘制到屏幕上。这导致了一些严重的性能问题,因为每次我的程序循环时,目前大约有1400个精灵(只有游戏结束时我想要的数量的一小部分)被绘制出来。
所以,我的问题是如何有效地生成地形?有没有办法一次只清除屏幕上的一部分精灵,或者仅在修改时清除精灵?除了使用多个精灵数组之外,还有更好的方法来创建地形吗?
答案 0 :(得分:3)
尝试绘制更少的图块,不需要绘制世界上的每个图块,因为大多数图块都不可见。
仅绘制一次可在屏幕上显示的图块数量加一点,例如,如果屏幕只适合7x4平铺,则可以在9x6左右绘制。
这将有助于减少尝试绘制不可见的图块所花费的时间。
答案 1 :(得分:1)
我认为你的问题有一些混淆,但这里有一些你应该研究的观点:
正如其他人所指出的,只能在屏幕上绘制实际的地形图块。你不需要在每一帧画出整个世界。
如果你的世界没有改变(或者除了玩家的动作之外没有太大变化),你可以尝试一劳永逸地渲染它并将这个渲染缓存到你要显示的纹理中(使用对应于玩家的游戏内位置的良好偏移)。不再循环使用切片和数组。看看RenderTexture
。当然,如果你的玩家可以挖掘或做任何改变世界的东西,你就不能永远使用这个纹理,但是在每次改变之后做这件事可能是个好主意,因为与渲染相比,改变不会经常发生,所以我想你仍然可以从中受益。
你提到了一系列精灵。我希望你没有每个草砖,每块岩砖等sf::Sprite
的实例?如果你这样做,只有每个图块的一个精灵,并使用它来绘制其类型的每个图块,只需更改其坐标并将其绘制到渲染目标。但我可能误解了你的问题。