У меня на iPhone настроена очень упрощенная «игра». Все движется, вращается, вы можете взаимодействовать с ними и т. Д. В симуляторе он работает нормально, но на устройстве он набирает около 0,25 FPS, и он настолько медленный, что, по-видимому, не успевает распознать касания.
Первоначально это было просто использование UIView с массивом Item
s, каждый из которых имел функции Tick и Draw. В начале приложения я запустил таймер, который срабатывает со скоростью 60 FPS, который вызывает Tick, а в конце Tick - [self setNeedsDisplay];
Это работало так ужасно медленно, что я превратил класс Item
в подкласс класса CALayer
, перемещая слой, а не перерисовывая элементы. Однако я перемещал CALayer
вручную, кадр за кадром, и это, по-видимому, бесполезно. Это было все еще слишком медленно. Поэтому я сказал ему переместиться к конечному пункту назначения и дал ему длину, равную количеству тиков, которые потребуются, чтобы добраться туда.
Это сработало нормально, но бывают случаи, когда, если вы взаимодействуете с чем-то, оно должно перестать двигаться таким образом и вместо этого делать что-то еще. Поэтому я вернулся к перемещению каждого тика, и вместо того, чтобы просто установить новую позицию, я также обернул ее в транзакцию CAT и присвоил транзакции ту же длину, что и тик.
Работает нормально, но возникает новая проблема: если я хочу что-то анимировать, мне все равно придется использовать [self setNeedsDisplay] каждый тик, который вызывает drawInContext:
, и это, похоже, major slow нерешенный вопрос.
Разве нет способа нарисовать все вручную, как я делал раньше? Я просто делал вызовы CGContext *, и в симуляторе все работало нормально! Было бы хорошо работать, если бы я реализовал нечто подобное на J2ME или во встроенном C ++. Что мне не хватает? Мне действительно нужно учить OpenGL, чтобы делать какую-нибудь интересную ручную анимацию?