Перемещение / вращение вручную со скоростью 30-60 кадров в секунду с использованием Core Graphics - PullRequest
1 голос
/ 02 июня 2011

У меня есть цикл, работающий в отдельном потоке, обновляющем местоположение и ротацию материала, он работает с более чем достаточным FPS и в конце вызывает setNeedsDisplay для основного потока.Проблема в том, что фреймворк не вызывает drawRect достаточно раз, в среднем я получаю 10 вызовов drawRect (FPS) в секунду.Я попытался вызвать очистку CATransaction, но, похоже, это никак не отразилось на этом.Вот и все, после поворота контекста и тому подобного.Есть ли способ для меня, чтобы заставить его рисовать на более высокой частоте?Я не хотел бы использовать openGL или cocos2d, потому что код рисования работает довольно хорошо.

Ответы [ 3 ]

0 голосов
/ 04 июня 2011

Вызов setNeedsDisplay не приводит к немедленному перерисовке представления, он просто помечает представление как грязное, что приведет к его перерисовке на следующем цикле рисования.

Я думаю, что будет трудно добиться быстрой и плавной анимации с помощью метода setNeedsDisplay.

Вы пробовали вместо этого использовать базовую анимацию?

Последнее замечание: если вы используете setNeedsDisplay, всегда вызывайте его из основного потока.

0 голосов
/ 11 июля 2011

В итоге я использовал Cocos2d для анимации вращений и тому подобного. Кажется, что использование Core Graphics для ручного перемещения вещей с такими скоростями FPS слишком болезненно и потребует хакерских подходов.

0 голосов
/ 02 июня 2011

Я бы предложил настроить NSTimer в главном потоке для вызова drawRect каждые 1.0/30 или 1.0/60 секунд.

Возможно, код, работающий в отдельном потоке, слишком усердно работает с системой в целом. Поэтому основной поток не получает достаточно вычислительных ресурсов для достаточно частого обновления представления. «Более чем достаточно FPS» может быть просто потраченными впустую вычислениями, если дополнительные кадры данных никогда не показываются. Может ли отдельный поток приостановить работу после обновления местоположения и поворота и подождать, пока основной поток обновит представление, прежде чем вычислять следующее местоположение и вращение? NSTimer может отправить сообщение во второй поток для вычисления данных следующего кадра.

...