2012-03-06 3 views
1

Я играю с API Android с долгосрочной перспективой разработки 2D-игры. Обычно я мог бы жить с использованием только Canvas для рисования спрайтов в качестве графических элементов для моей игры. Я хотел бы иметь возможность рисовать много рисунков для визуальных эффектов, но кажется, что версии Android до Honeycomb (3.0, уровень API 11) don't support hardware acceleration.Аппаратное ускорение pre-Honeycomb

Я не уверен, что это значит. Я не могу заставить себя поверить, что чертеж сделан процессором, пиксель за пикселем!?! Если у меня появятся эффекты, такие как свечение, эффекты объектива и т. Д. ... Я буду рисовать каждый пиксель довольно много раз. Имею ли я право полагать, что обычный процессор смартфонов не сможет справиться с этим при ~ 30 FPS?

У меня нет такой роскоши, чтобы таргетировать версии для Android> = 3.0, так как они constitute 8% уже не очень большого Android-рынка. Должен ли я тратить время на OpenGL (я новичок в OpenGL)? Если я это сделаю, вы думаете, что я получу что-либо, наложив GLSurfaceView на заботу о эффектах поверх пользовательского вида Android, используя Canvas, чтобы сделать рисунок иначе. Или это по какой-то причине плохая идея смешать эти два?

+0

Просто обратите внимание, что теперь, согласно Википедии, версии 3.0 (Honeycomb) до 4.4 (KitKat) больше похожи на 75% установленной базы. http://en.wikipedia.org/wiki/File:Android_historical_version_distribution_-_vector.svg – mlepage

ответ

4

О, боже, да. Кроме того, если вы настроите предварительные устройства Android 3, переход от SurfaceView (с вызовами Canvas.drawXxx()) к OpenGlSurface отлично работает. Мало того, что у вас есть более быстрые кадры (обновления) в секунду, но потребление памяти намного лучше.

Вот некоторые моменты, которые я заметил:

  • Если вы хотите сделать (многоканальный) спрайтов анимации, делая их с изображениями, загруженными в OpenGL текстур и отображаются на четырехъядерных OpenGL дает много больше пространства памяти. Это связано с тем, что в то время как обычные объекты Bitmap ограничены пределом памяти для Android-процессов (что примерно такое же, как 16-48 Мб, в зависимости от устройства и версии Android), создавая текстуры OpenGL из этих изображений (и очищая iamges сразу после) не имеет этого ограничения. Вы ограничены только суммарной памятью на устройстве, которая составляет LOT более 16-48 мегабайт.

Во-вторых, но все же связано с этим, с Android 2 и ниже, отслеживая, сколько памяти занимает битмап-экземпляр, намного сложнее, поскольку эти намерения не сообщаются против памяти кучи Java. Они выделяются в другом пространстве памяти. Короче говоря, еще одна проблема, если вы используете OpenGL.

  • Простые анимации, такие как поворот изображения, превращаются в бриз с OpenGL. Вы просто текстурируете квадроцикл, а затем вращаетесь так, как хотите. Эквивалент анимации Sprite состоит в том, чтобы последовательно отображать разные (повернутые версии) изображения. Это лучше для потребления и скорости памяти.

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

  • Само собой разумеется, что делать простые эффекты, такие как пульсирующий свет, влияющий на какой-либо графический элемент, намного проще с OpenGL (где вы просто делаете свет и пульсируете, и все горит соответственно), а не имитировать это с помощью SurfaceView и испечь в спрайтах.

Я на самом деле начал небольшой asteriod обороны, как игра с SurfaceView и Canvas, а затем быстро перешел на OpenGL для указанных выше причин. Короче говоря, игра теперь выглядит лучше, и, хотя она первоначально работала на 16 ИБП на Samsung TEOS и 30 UPS на Optimus LG 2x, теперь он работает на 33 ИБП на Teos и около 80 ИБП на LG 2x.

+0

Вы бы рекомендовали смешивать GLSurfaceView с другими поверхностями, отличными от GL, для мирских элементов, таких как кнопки. Я мог бы жить с процессором, копируя изображение кнопки 20x20 на пиксель экрана по пикселям, если это только накладные расходы. Есть ли другие существенные накладные расходы? – enobayram

+0

На самом деле вы не можете добавить свои стандартные виджеты Android через GLSurfaceView. Я старался избегать этого в своей игре, но это возможно, и нет скоростной фиксированной скорости. Во всяком случае, я рекомендую первое, что вы делаете, когда вы запускаете GLSurface, чтобы отображать ИБП в углу, таким образом вы будете знать быстро, когда вы просто делаете что-то, что замедляет работу. –

Смежные вопросы