如何在C++中正确生成SFML中的随机地形 最近我一直在尝试使用SFML和C++开发一个2D TeliRARA风格游戏。除了随机地形生成之外,一切都很正常。目前,我有一个for循环,它将位置和纹理指定给精灵数组ex:int grass[150],然后使用for循环将其绘制到屏幕上。地形生成并看起来不错,但是每次我的程序循环时,都会将多个精灵阵列绘制到屏幕上。这导致了一些严重的性能问题,因为目前大约有1400个精灵,每次我的程序循环时,只有我想要的数量的一小部分被绘制出来

如何在C++中正确生成SFML中的随机地形 最近我一直在尝试使用SFML和C++开发一个2D TeliRARA风格游戏。除了随机地形生成之外,一切都很正常。目前,我有一个for循环,它将位置和纹理指定给精灵数组ex:int grass[150],然后使用for循环将其绘制到屏幕上。地形生成并看起来不错,但是每次我的程序循环时,都会将多个精灵阵列绘制到屏幕上。这导致了一些严重的性能问题,因为目前大约有1400个精灵,每次我的程序循环时,只有我想要的数量的一小部分被绘制出来,c++,random,sfml,terrain,C++,Random,Sfml,Terrain,所以,我想问你的问题是,我如何使我的地形生成有效?有没有办法一次只清除屏幕上的一部分精灵,或者在修改精灵时只清除它?除了使用多个精灵阵列之外,还有更好的方法来创建地形吗?尝试绘制较少的瓷砖,没有必要绘制世界上的每个瓷砖,因为大多数瓷砖都不可见 仅绘制一次可在屏幕上看到的瓷砖数量,再加上一点,例如,如果屏幕只能容纳7x4瓷砖,则绘制9x6左右 这将有助于减少绘制不可见的瓷砖所花费的时间。尝试绘制较少的瓷砖,因为世界上没有必要绘制所有瓷砖,因为大多数瓷砖都不可见 仅绘制一次可在屏幕上看到的瓷砖数量,

所以,我想问你的问题是,我如何使我的地形生成有效?有没有办法一次只清除屏幕上的一部分精灵,或者在修改精灵时只清除它?除了使用多个精灵阵列之外,还有更好的方法来创建地形吗?

尝试绘制较少的瓷砖,没有必要绘制世界上的每个瓷砖,因为大多数瓷砖都不可见

仅绘制一次可在屏幕上看到的瓷砖数量,再加上一点,例如,如果屏幕只能容纳7x4瓷砖,则绘制9x6左右


这将有助于减少绘制不可见的瓷砖所花费的时间。

尝试绘制较少的瓷砖,因为世界上没有必要绘制所有瓷砖,因为大多数瓷砖都不可见

仅绘制一次可在屏幕上看到的瓷砖数量,再加上一点,例如,如果屏幕只能容纳7x4瓷砖,则绘制9x6左右


这将有助于减少绘制不可见瓷砖所花费的时间。

我认为您的问题中存在一些困惑,但以下是一些您应该关注的问题:

正如其他人指出的,只绘制屏幕上的地形图块。您不需要在每个帧上绘制整个世界

如果你的世界除了玩家的动作外没有改变或没有太大改变,你可以尝试一次性渲染它,并将渲染缓存到一个纹理中,你将显示一个与玩家在游戏中的位置相对应的良好偏移。不再通过磁贴和阵列循环。看一看。当然,如果你的玩家可以挖掘或做任何改变世界的事情,你不能永远使用这种纹理,但是每次改变后都使用它可能是一个好主意,因为与渲染相比,改变并不经常发生,所以我想你仍然可以从中受益

你提到了一系列精灵。我希望您没有为每一块草砖、每一块岩石砖等创建sf::Sprite的实例?在这种情况下,每个平铺只有一个精灵,只需更改其坐标并将其绘制到渲染目标,即可使用精灵绘制其类型的每个平铺。但我可能误解了你的问题


我认为你的问题中有一些困惑,但以下是你应该研究的几点:

正如其他人指出的,只绘制屏幕上的地形图块。您不需要在每个帧上绘制整个世界

如果你的世界除了玩家的动作外没有改变或没有太大改变,你可以尝试一次性渲染它,并将渲染缓存到一个纹理中,你将显示一个与玩家在游戏中的位置相对应的良好偏移。不再通过磁贴和阵列循环。看一看。当然,如果你的玩家可以挖掘或做任何改变世界的事情,你不能永远使用这种纹理,但是每次改变后都使用它可能是一个好主意,因为与渲染相比,改变并不经常发生,所以我想你仍然可以从中受益

你提到了一系列精灵。我希望您没有为每一块草砖、每一块岩石砖等创建sf::Sprite的实例?在这种情况下,每个平铺只有一个精灵,只需更改其坐标并将其绘制到渲染目标,即可使用精灵绘制其类型的每个平铺。但我可能误解了你的问题


你是在为世界上的每一块瓷砖绘制每一个精灵,还是仅仅为当前可见的瓷砖绘制每一个精灵?是的,世界上的每一块瓷砖,但我只生成了大约4个屏幕的区块。这并不能回答我的问题,你是在为每一块瓷砖绘制每一个精灵,甚至是那些不可见的吗?是的,我是。你认为如果我只生成屏幕上的内容就可以了吗?你是为世界上的每一块瓷砖绘制每一个精灵,还是只绘制当前可见的精灵?是的,世界上的每一块瓷砖,但我只生成了大约4个屏幕的区块。这并不能回答我的问题,你是为每一块瓷砖绘制每一个精灵吗,甚至那些看不见的?是的,我是。你认为如果我只生成屏幕上的内容,它会正常工作吗?