Подтвердить что ты не робот

Андроид игры, холст или opengl?

Я должен написать игру для android, мне нужно выбрать между холстом или opengl для рисования. Я прочитал, что холст не имеет хорошей частоты кадров, но что хорошего? Представьте, что вы собираетесь писать сердитую игру птиц, хватит ли рамки кадров?

4b9b3361

Ответ 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, не прибегая к кешированию текстур на диск и т.д.

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

Ответ 2

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

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

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

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

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

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

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

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

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

:)

Ответ 3

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

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

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

Ознакомьтесь с примерами App: https://market.android.com/details?id=org.anddev.andengine.examples