Проблема производительности с созданными классами, C ++ - PullRequest
1 голос
/ 09 октября 2011

Я знаю, что это простая проблема, но я не знаю, как правильно делать то, что я имею в виду.Я использую SFML, но вам не нужно понимать, как это работает.Вот мой простой фрагмент кода, который генерирует плитки и присваивает их 2D-вектору плиток: http://www.pastie.org/2665489

Во время создания объекта TilePlane каждая операция (tilesMap[i]).push_back(tile) занимает слишком много времени, и ячувствую, что я копирую данные вместо того, чтобы использовать более элегантный метод.Итак, что в этом случае является хорошим методом для решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 09 октября 2011

В вашем коде много проблем с производительностью. Если узкое место действительно исходит от push_back, вы должны принять предложение Масуда и вставить указатели на массив, а не значения.

Другое предложение заключается в том, что вы объявляете свои функции и конструкторы для использования ссылок - например:

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

вместо

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

Передача параметра по значению приведет к созданию копии, которая может быть дорогой. Передача по константной ссылке гарантирует, что объект не будет скопирован или изменен.

1 голос
/ 09 октября 2011

Как вы сказали, возможно, проблема в (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 объектов листов.

...