嘿所以我正在制作一个简单的文字游戏,使用pdCurses库和一些其他小东西,有点像垂直卷轴,你可以避免随机生成的墙.... 左边和右边的两面墙由'X'字符和空白的黑色空间组成,你可以在其中移动并避开'X'你的角色是'8'并且你被迫继续向前或被X的每个人触摸时间显示随机生成的“地图”的新行(对于性能测试,我尽可能快地显示新行。)
然而,由于“地图”(字符串向量)变得越来越大,我遇到了一些性能问题。我不明白这个问题,因为我不是在任何时候都使用它,我只是拉出部分显示(通常是56行)。
我会告诉你我有什么,希望有人会帮助或建议一个更好的方法来完成我的游戏。
以下是精简的重要代码: 这里的函数类似于.25-.75秒(new_map也是“Screen”类的向量成员):
void Insert(const Map& map, int y1, int y2) {for ( int mc = y1, nm= 0; mc< map.Contents().size() && mc< y2; mc++, nm++)
new_map[nm] = map.Contents(mc);};
这是Map类的内容函数:
string Contents(int Y) {return contents[Y];};
char Contents(int Y, int X) {return contents[Y][X];};
vector <string> Save() {return save;};
最后我设置了 main(),以便屏幕尽快更新......这不是那么快哦和L1是我的“地图”之一” ... 生成添加到地图的新行,因为它永远不会结束:
double refreshes= 0;
for (bool quit = false; quit != true;)
{ double newTime= myStopwatch.ElapsedTime()- refreshes;
theScreen.Insert(L1, 0+refreshes, nrows+refreshes);
refreshes++;
if(L1.Contents().size()<= nrows+refreshes+2)
L1.generate();}
感谢您的帮助或提示!!我知道这很糟糕但我刚开始编程2个月前哈哈! =)询问您是否还需要更多信息。
答案 0 :(得分:2)
一般问题似乎是,随着您的数据集变得更大,比如复制它(您似乎一直在做的事情,例如在您的代码片段中,您将字符串从一个向量复制到另一个向量)需要更长的时间。 / p>
需要考虑的事项:
作为第1点的示例,您可能更喜欢将屏幕行存储在列表中,并执行以下操作:
std::list<string> screen;
// fill up with your initial screen.
generate(line); // generate your new line
screen.push_back(line); // to add a line
screen.pop_front(); // remove a line from the top
它并不完美(有内存管理和幕后复制),但它会胜过复制和累积所有屏幕线。
作为第2点的示例,请考虑以下代码:
char screen[25][80];
for(int y = 0; y < 25; y++)
{
for(int x = 0; x < 79; x++)
{
screen[y][x] = screen[y][x+1];
}
}
这将“滚动”屏幕左侧一个字符。它将继续以恒定且非常快的速度运行 - 在任何现代CPU上,您每秒可以完成大约一百万次这样的滚动操作。
答案 1 :(得分:0)
尝试使用 oops,你有自己的unordered_map
,其性能特征随着大小的增长而有所改善。Map
类与{无关'{ {1}}。
无论如何,随着向量变大,你展示的功能肯定会变慢。你说你不需要同时拥有所有数据,所以其他一些数据结构可能会更好。但是,如果不了解您的设计(我的意思是对您要完成的内容的解释,而不仅仅是所有代码的副本),则很难推荐一个。
您可能会考虑以某种方式跟踪索引,而不是自己复制字符串。