2011-05-21 79 views
1

嘿所以我正在製作一個簡單的文字遊戲,使用pdCurses庫和其他一些小東西有點像垂直滾動,你可以避免隨機生成的牆壁...... Theres two walls on左邊和右邊是由'X'字符和空白的黑色空間組成的,你可以在其中移動並避免'X的角色是'8',並且每當一個新線路被迫繼續前進或被X接觸時的隨機生成的「地圖」顯示出來(對於性能測試,我做了一條儘可能快的新線)。性能超時問題

但是,當「地圖」(一個字符串矢量)變得越來越大時,我遇到了一些性能問題。我不明白這個問題,但是因爲我沒有在任何時候使用它,我只是把它的一部分顯示出來(通常是56行)。

我會告訴你我有什麼,希望有人會幫助或建議一個更好的方式來完成我的遊戲。

這裏的冷凝,重要的代碼: 下面是正在像0.25-0.75秒功能(new_map也是「屏幕」類的載體構件):

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);}; 

這裏的地圖類內容的功能:

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

一般的問題似乎是,當你的數據集得到更大的東西像複製它(你似乎一直在做,例如在你的代碼片段中,你將字符串從一個向量複製到另一個)需要更長的時間。

需要考慮的事情:

  1. 你需要一個即將 關閉屏幕的數據?
  2. 你可以使用C風格的數組?這些通常會更快,您還可以更清楚地看到效率低下的情況。
  3. 試着把你的滾動看作是簡單地將數據提取到屏幕的位置。您不需要製作任何副本或移動任何數據。

至於點#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上,你可以期望每秒能完成大約一百萬次的滾動操作。

+0

我是否也可以通過將所有內容都設置爲'const&'refrerence來加快速度?那意味着沒有副本會被製作正確嗎? – Griffin 2011-05-22 01:46:12

+0

@Griffin可能但請記住,您不能重置參考,因此您可能需要一個指針。爲什麼你需要首先複製? – 2011-05-22 02:05:21

0

嘗試 unordered_map取而代之的是,隨着尺寸的增加,其性能特徵略好。 哎呀,你有你自己的Map類,與std::map無關。

無論如何,你顯示的函數肯定會隨着向量變大而變慢。你說你不需要一次全部的數據,所以其他一些數據結構可能會更好。但是,如果不瞭解更多關於你的設計的知識(我的意思是解釋你要完成的是什麼,而不是所有代碼的副本),很難推薦一個。

您可能會考慮跟蹤索引,而不是自己複製這些字符串。