Rap*_*Cpp 5 optimization performance
我正在开发一款类似于桌面游戏风险的游戏,或者是全面战争系列的竞选部分.我目前有一个区域系统的工作实现,但由于性能不佳,游戏在某些命令后挂起.我敢肯定有可能做得更好.
我希望能够呈现一张地图,例如世界地图,并将其划分为区域(例如国家).我希望能够通过点击它们,向它们发送单位以及获取相邻区域来选择区域.
地图由3个文件定义:
"Region Name" "Region Color" "Game-related information" ["Adjacent Region 1", "Adjacent Region 2", ...]'这种颜色图的一个例子:
(所有白色部分在当前实现中评估到相同的区域.想象它们都有不同的颜色).
当我加载这些文件时,我首先加载彩色图像.然后我加载文本文件并遍历每一行.我按照自己的意愿创建了具有正确设置的区域.这里没有真正的性能影响,因为它只是简单地读取数据.然后制作一堆Region对象,并给出正确的颜色.
在这个阶段,一切正常.我可以点击区域,询问彩色图像的像素数据,并通过遍历列表中的所有区域,我可以找到与该特定像素的颜色匹配的区域.
然而,这里是性能影响的地方:
每个玩家都有一堆单位.我希望能够在一个地区产生这些单位.假设我想在红色区域中生成一个单位.我浏览了文件中的所有像素,当我点击红色时,我将单位放在那里.
for(int i = 0; i < worldmap.size(); i++) {
for(int j = 0; j < worldmap[i].size(); j++) {
if(worldmap[i][j].color == unit_color) {
// place it here
}
}
}
Run Code Online (Sandbox Code Playgroud)
简单地看一下这个伪代码就可以看出这种方法效果不佳.无论如何,不是以合理的速度.
另一个问题是我想在"漂亮的"地图上为玩家所拥有的区域着色.让我们说玩家一拥有三个区域:蓝色,红色和绿色.然后,我浏览世界地图,在彩色图像上找到蓝色,红色和绿色像素,然后在透明版本的播放器颜色中在"漂亮的"地图上着色这些像素.
然而,这也是一个非常繁重的操作,需要几秒钟.
由于这是一个基于回合制的游戏,所以它不是那么大的交易,游戏慢慢减少.但是,我不喜欢我写这个丑陋的代码.我已经考虑了其他选项,例如将某个区域的每个点存储为浮点数,但这会对内存造成巨大压力(64位乘以3000x1000分辨率的图像很多).
我想知道是否为此创建了算法,或者我是否应该尝试使用更多内存来缓解处理器.我已经寻找其他游戏以及他们如何做到这一点,但无济于事.我还没有找到关于这个或文章的一些源代码.
我故意不在这个问题中放入太多代码,因为它已经相当冗长,并且代码对我的应用程序的其他部分有很多依赖性.但是,如果需要解决问题,我会尽快发布一些内容.
提前致谢!
问题1:在X和Y方向上以步长10遍历颜色图。这会将考虑的像素数减少 100 倍。如果每个国家/地区包含至少 10x10 像素的正方形,则适用。
问题 2:这里最好的解决方案是执行一次,而不是每个玩家一次或每个区域一次。创建一个从区域颜色到玩家颜色的查找表,迭代区域图的所有像素,并查找要应用的相应玩家颜色。
它可能有助于将区域颜色图减少到 RGB 332(总共 8 位)。您可能不需要那么多精细的 lila 色调,并且仅使用一个字节颜色可以使查找表变得更加容易,只需一个包含 256 个元素的普通数组就可以了。考虑到您的地图为 3000x1000 像素,这也会将地图大小减少 6 MB。
另一件需要考虑的事情是您是否真的需要 3000x1000 像素分辨率的区域图。漂亮的地图可能有那么大,但区域地图可以以 1500x500 像素分辨率重新采样。您的边框看起来足够厚(超过 2 个像素),因此区域分辨率损失 1 个像素并不重要。然而,它会将区域地图再减少 2.25 MB。大小为 750 kB,现在可能适合 CPU 缓存。
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |