Сначала я написал свою игру с использованием Canvas, но затем мне пришлось переключиться на OpenGL по следующим причинам:
Используя Canvas, ваши спрайты хранятся в куче (если вы специально не кешируете их на диск), это накладывает ограничение на общий размер ваших спрайтов в зависимости от телефона - не хорошо! Я обнаружил, что это было около 42 МБ на моем телефоне - обратите внимание, что это несжатый размер растровых изображений. Если у вас есть несколько типов сущностей, каждый с разной анимацией, вы можете очень быстро достичь этого размера.
OpenGL сохраняет ваши ресурсы спрайта отдельно в куче, что значительно увеличивает объем доступной памяти.
Холст не очень хорошо масштабируется. Чем больше вызовов .draw (...) вы делаете, тем медленнее он будет выполняться. Отношения довольно линейные.
Используя OpenGL, вы можете объединять вызовы для отрисовки вместе, чтобы повысить производительность.
Это может быть пугающе, начиная с OpenGL, что делает Canvas привлекательным. Однако из опыта я хотел бы только начать с OpenGL. Я бы порекомендовал «кусать пулю» и использовать OpenGL, если вы делаете игру.
Чтобы немного упростить начало работы, я написал несколько полезных служебных классов, которые сделают для вас все самое интересное OpenGL. Они позволяют вам делать простые вызовы .draw (..), аналогичные при использовании Canvas. Следующее видеоурок поможет вам начать:
http://www.youtube.com/watch?v=xc93rN2CGNw
РЕДАКТИРОВАТЬ: 03/04/13
Похоже, что по мере появления новых устройств и операционных систем Android, Google увеличила производительность Canvas. Пользователь класса служебной программы, который я описал выше, после некоторого тестирования вернул мне следующее электронное письмо:
Рисование 500 спрайтов в случайных местах по холсту в каждом кадре.
Вот результаты: Huawei Honor (Gingerbread, одноядерный 1,4 ГГц):
SpriteBatcher: 19-20 FPS, холст: 23-24 FPS
Nexus 7 (JellyBean, 4 ядра 1,3 ГГц): SpriteBatcher: 29-30 FPS,
Холст: 57-58 кадров в секунду
Теперь, в своем ответе этому пользователю я объяснил, что это может быть связано с неэффективностью написанного мной служебного класса SpriteBatcher. Однако по собственному опыту работы с Canvas на HTC Desire под управлением Froyo 2.2 я могу сказать, что это был явно более медленный спрайт для спрайта!
В более поздних операционных системах и устройствах он мог перегнать по эффективности, но некоторые пункты в моем первоначальном ответе все еще действительны. Например, обходя исключение OutOfMemoryException, не прибегая к кешированию текстур на диск и т. Д.
Если я узнаю больше, я продолжу обновлять этот ответ.