программирование iPhone Quartz Slow - PullRequest
1 голос
/ 26 августа 2010

Я делаю игру, которая требует, чтобы на экране было нарисовано несколько изображений.Код, который я использую для этого:

- (void)drawRect:(CGRect)rect {
   for (i=1;i<=totalImages;i++) {
       if (imageExists[i]) {
           [image drawAtPoint:CGPointmake(imageX[i],imageY[i])];
       }
   }
} 

Этот drawRect вызывается функцией:

-(void) gameLoop {
   [self setNeedsDisplay];
}

И таймер геймплея вызывается 60 таймерами в секунду:

[NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

imageExists [], imageX [] и imageY [] - это массивы, которые я использую в своем игровом коде для создания / удаления и перемещения изображений по экрану.

Моя проблема в том, что когда у меня около 40 изображений, движущихся вокруг скорости кадров, почти вдвое меньше, чем когда было только 1 изображение.И моя игра потребует максимум 88 изображений.(это происходит только тогда, когда я тестирую его на своем iPod Touch, в симуляторе все работает нормально ...)

Мой вопрос: почему медленная функция drawrect или drawAtPoint?И как я могу это исправить?Должен ли я на самом деле использовать это для рисования изображений, или я должен изучить OpenGL ES для создания игр?

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Я рекомендую заглянуть в игровую библиотеку, например cocos2d-iphone , которая позаботится о большинстве вещей OpenGL для вас за кулисами. Он получит гораздо более высокую производительность для типичных игровых функций, чем Quartz и CoreAnimation, и включает в себя такие вещи, как физические и звуковые библиотеки для интегрированной интерактивности игры.

Первичная вещь, которую запись в OpenGL может сделать для 2D-игры, - это лучше управлять тем, что идет в видеопамять, чем тем, что остается в ОЗУ, что очень важно при перелистывании спрайтов в нужное место на экране.

0 голосов
/ 25 апреля 2011

Несколько вещей:

  • Не используйте таймер.Используйте CADisplayLink.Это как таймер, за исключением того, что он срабатывает прямо на vsync.Посмотрите на документ Apple.

  • Да, вы определенно хотите пойти по пути OpenGL | ES.Здесь проблема заключается в том, что вы перемещаете более 40 текстур из ЦП в ГП при каждом перерисовывании кадра.В OpenGL | ES вы сможете нажать всю текстуру один раз, а затем просто сказать GPU «переместить» их.Это было бы намного эффективнее.(т. е. твердые 60 кадров в секунду и очень низкая загрузка процессора).

...