我知道这是一个简单的问题,但我不知道如何正确地做到我的想法。我正在使用SFML,但您不需要了解它是如何工作的。 这是我的简单代码片段,它生成切片并将其分配给贴图的2D矢量: http://www.pastie.org/2665489
在构造TilePlane
对象期间,每个操作(tilesMap[i]).push_back(tile)
花费的时间太长,我觉得我正在复制数据而不是使用更优雅的方法。那么在这种情况下,解决这个问题的好方法是什么?
答案 0 :(得分:1)
正如你所说,问题可能是(tilesMap[i]).push_back(tile)
,
当您将tile
的对象插入列表时,实际上您正在完全复制sf::Image
(因为copy-constructor
sf::Image
而被删除。)
你应该将tile
的指针放到列表中。如下所示:
...
Tile *tile_ptr = new Tile(tileset, rand() % tileset.getSize(), i*32, j*32);
(tilesMap[i]).push_back(tile_ptr);
...
别忘了,您必须在适当的时间内delete
tile_ptr
个对象。例如,在~TilePlane()
中,您必须迭代列表并delete
平铺对象。
答案 1 :(得分: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引用传递可以保证不复制或修改对象。