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