Android-игра: Canvas или OpenGL? - PullRequest
       55

Android-игра: Canvas или OpenGL?

21 голосов
/ 09 января 2012

Я должен написать игру для Android, и мне приходится выбирать между Canvas или OpenGL для рисования.Я читал, что у Canvas нет хорошей частоты кадров, но что хорошего?Представьте, что вы собираетесь написать игру типа Angry Birds, хватит ли частоты кадров Canvas?

Ответы [ 3 ]

48 голосов
/ 07 ноября 2012

Сначала я написал свою игру с использованием 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, не прибегая к кешированию текстур на диск и т. Д.

Если я узнаю больше, я продолжу обновлять этот ответ.

4 голосов
/ 09 января 2012

Все зависит от типа игры, которую вам нужно реализовать.

Учитывая, что вы запрашиваете реализацию холста, я полагаю, вы имеете в виду чистую игру 2D-спрайтов.

Если спрайтов не так много, а их число очень мало, правда в том, что потенциально вы хотите заметить большую разницу (учтите, что во многих играх с базовой 2D-графикой используется холст).

Если производительность имеет значение или у вас естьочень большое количество спрайтов, поэтому стоит внедрить систему на основе OpenGL.

Учтите, что при использовании OpenGL вы выиграете от использования выделенного аппаратного обеспечения графического процессора, так что ваш процессор будет загружен из-за нагрузки графического рендеринга.

Более того, вы получите гораздо большую гибкость, чем реализация холста, использующая эффекты наложения, освещения и постобработки.На самом деле нет никаких ограничений в том, что вы можете сделать.

Простой пример - вращение и масштабирование, при котором использование трехмерного движка, такого как OpenGL, очень дешево и дает отличные результаты.

Canvas действительно долженПринято для простых реализаций.

PS Если вы выбираете OpenGL ES 2.0 и программируемый конвейер, у вас действительно нет никаких ограничений в том, что вы достигаете (свечение, размытие и тысячи различных опций).В этом случае предел действительно является нашей фантазией.

:)

1 голос
/ 09 января 2012

Если вы собираетесь делать такую ​​большую игру, вам определенно стоит подумать об использовании AndEngine: http://www.andengine.org/

При правильном использовании это отличная помощь.К сожалению, в коде нет документации.Но с форумом на сайте все в порядке.И даже здесь, на ТАК, появляется все больше и больше вопросов, касающихся AndEngine.К счастью, есть множество хороших примеров для начала.

AndEngine использует OpenGL - так что вам не придется возиться с возможными низкими частотами при рисовании на холсте.

ПроверьтеПримеры применения: https://market.android.com/details?id=org.anddev.andengine.examples

...