性能超时问题

时间:2011-05-21 23:49:32

标签: c++ performance string vector ncurses

嘿所以我正在制作一个简单的文字游戏,使用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个月前哈哈! =)询问您是否还需要更多信息。

2 个答案:

答案 0 :(得分:2)

一般问题似乎是,随着您的数据集变得更大,比如复制它(您似乎一直在做的事情,例如在您的代码片段中,您将字符串从一个向量复制到另一个向量)需要更长的时间。 / p>

需要考虑的事项:

  1. 您是否需要即将推出的数据? 在屏幕外?
  2. 你能用C风格的数组吗?这些通常会更快,你也可以更清楚地看到效率低下的地方。
  3. 尝试将滚动视为简单地将点从您获取数据的位置移动到屏幕上。您不需要制作任何副本或移动任何数据。
  4. 作为第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)

尝试使用unordered_map,其性能特征随着大小的增长而有所改善。 oops,你有自己的Map类与{无关'{ {1}}。

无论如何,随着向量变大,你展示的功能肯定会变慢。你说你不需要同时拥有所有数据,所以其他一些数据结构可能会更好。但是,如果不了解您的设计(我的意思是对您要完成的内容的解释,而不仅仅是所有代码的副本),则很难推荐一个。

您可能会考虑以某种方式跟踪索引,而不是自己复制字符串。