2011-10-09 76 views
1

我知道這是一個簡單的問題,但我不知道如何正確執行我的想法。我正在使用SFML,但不需要了解它是如何工作的。 這裏是我的簡單的代碼片段生成的瓷磚,並將它們分配到瓷磚的2D矢量: http://www.pastie.org/2665489構造類的性能問題,C++

TilePlane對象的構造,每個操作(tilesMap[i]).push_back(tile)花費的時間太長了,我覺得我的數據複製而不是使用更優雅的方法。那麼在這種情況下,解決這個問題的好方法是什麼?

回答

1

您的代碼中存在很多性能問題。如果瓶頸確實來自push_back,那麼您應該採取Masoud的建議並將指針推到數組上,而不是數值。

另一個建議是,你聲明的功能和構造使用的引用 - 例如:的

Tile::Tile(const Tileset& tileset, int tileId, int posX, int posY) 

代替

Tile::Tile(Tileset tileset, int tileId, int posX, int posY) 

按值傳遞的參數將強制拷貝被創建,這可能是昂貴的。通過const引用傳遞保證對象不被複制或修改。

+0

感謝它的解決。這個問題確實來自於我沒有傳遞對tileset的引用,所以每次都會複製整個tileset。 我習慣了沒有複製對象的Java – lezebulon

+0

很高興幫助! :) –

1

正如你說也許問題是(tilesMap[i]).push_back(tile), 當你插入的tile的對象名單,其實你正在複製的是sf::Image完全(的sf::Imagecopy-constructor東陽)。

您應該將指針tile s添加到列表中。類似下面:

... 
     Tile *tile_ptr = new Tile(tileset, rand() % tileset.getSize(), i*32, j*32); 

     (tilesMap[i]).push_back(tile_ptr); 
... 

不要忘記,你必須在正確的時間deletetile_ptr對象。例如在~TilePlane()中,您必須迭代瓦片對象的列表和delete