Почему у меня плохая производительность при рендеринге разных изображений с помощью UIImage на iPhone - PullRequest
1 голос
/ 13 апреля 2009

Я использую UIImage для рендеринга игровой карты из блоков 32х32. Код выглядит следующим образом

for( int x = 0; x < rwidth; ++x)
{
    for(int y = 0; y < rheight; ++y)
    {
        int bindex = [current_map GetTileIndex:x :y];
        CGPoint p;
        p.x = x * tile_size_x;
        p.y = y * tile_size_x;
        [img_list[bindex] drawAtPoint:p];
    }
}

В итоге получается около 150 плиток. Моя проблема в том, что когда я запускаю этот код, мое время рендеринга уменьшается до 2-3 кадров в секунду.

Я думал, что iPhone был заполнен границей, однако, если я заставлю bindex = 1 (то есть отрендерить один и тот же блок 150 раз), я получу полную частоту кадров.

Не могу поверить, что рендеринг из разных UIImages стоит так дорого.

Может кто-нибудь сказать, пожалуйста, что я делаю не так ...

О, я забыл упомянуть мой список изображений, созданный из большой страницы текстуры с использованием CGImageCreateWithImageInRect.

Спасибо Рич

1 Ответ

1 голос
/ 13 апреля 2009

Взломайте инструменты и профилируйте свой код. Похоже, вы рисуете в UIView, и они на самом деле не оптимизированы для игр .. Поскольку UIViews имеют слоистую подложку, drawAtPoint: необходимо нарисовать изображение несколько раз (для закадровых буферов), прежде чем оно появится на экране.

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

Приблизительно в порядке скорости (от самой медленной к самой быстрой):

  • UIImage (обычно используется, если у вас есть несколько больших изображений)
  • CALayers (если вам нужно точное управление анимацией или у вас примерно от 20 до 100 плиток / изображений)
  • Текстуры OpelGL (что нужно использовать большинству игр)
...