Я должен написать игру для android, мне нужно выбрать между холстом или opengl для рисования. Я прочитал, что холст не имеет хорошей частоты кадров, но что хорошего? Представьте, что вы собираетесь писать сердитую игру птиц, хватит ли рамки кадров?
Андроид игры, холст или opengl?
Ответ 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