我知道這是一個簡單的問題,但我不知道如何正確執行我的想法。我正在使用SFML,但不需要了解它是如何工作的。 這裏是我的簡單的代碼片段生成的瓷磚,並將它們分配到瓷磚的2D矢量: http://www.pastie.org/2665489構造類的性能問題,C++
在TilePlane
對象的構造,每個操作(tilesMap[i]).push_back(tile)
花費的時間太長了,我覺得我的數據複製而不是使用更優雅的方法。那麼在這種情況下,解決這個問題的好方法是什麼?
我知道這是一個簡單的問題,但我不知道如何正確執行我的想法。我正在使用SFML,但不需要了解它是如何工作的。 這裏是我的簡單的代碼片段生成的瓷磚,並將它們分配到瓷磚的2D矢量: http://www.pastie.org/2665489構造類的性能問題,C++
在TilePlane
對象的構造,每個操作(tilesMap[i]).push_back(tile)
花費的時間太長了,我覺得我的數據複製而不是使用更優雅的方法。那麼在這種情況下,解決這個問題的好方法是什麼?
您的代碼中存在很多性能問題。如果瓶頸確實來自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引用傳遞保證對象不被複制或修改。
正如你說也許問題是(tilesMap[i]).push_back(tile)
, 當你插入的tile
的對象名單,其實你正在複製的是sf::Image
完全(的sf::Image
copy-constructor
東陽)。
您應該將指針tile
s添加到列表中。類似下面:
...
Tile *tile_ptr = new Tile(tileset, rand() % tileset.getSize(), i*32, j*32);
(tilesMap[i]).push_back(tile_ptr);
...
不要忘記,你必須在正確的時間delete
tile_ptr
對象。例如在~TilePlane()
中,您必須迭代瓦片對象的列表和delete
。
感謝它的解決。這個問題確實來自於我沒有傳遞對tileset的引用,所以每次都會複製整個tileset。 我習慣了沒有複製對象的Java – lezebulon
很高興幫助! :) –