Профилирование и оптимизация игрового андроида
Я делаю свою первую игру для Android, которая станет трехмерной аркадной игрой с использованием OpenGLES. Я работал над этим в течение достаточно долгого времени, главным образом оптимизируя двигатель для гибкости в будущем.
В любом случае, теперь я полностью закончил с игровыми функциями и всем остальным, но это отстает от телефонов, которые НЕ МОГУТ отлаживать мой телефон. В игре довольно качественная графика для мобильной игры, поэтому ожидается небольшая задержка, но разница в производительности между запуском игры на Nexus S и MyTouch 4G огромна. В игру нельзя играть даже на младших телефонах, таких как LG Optimus(игра работает, но она слишком нестабильна, чтобы играть в нее удобно). На моем Nexus S I редко, если когда-либо, возникает прерывистое движение (я реализовал независимое движение с частотой кадров в игре), но на MyTouch 4G это гораздо чаще, хотя игра все еще играбельна.... но раздражает
Я пришел из среды разработки настольных игр, и оптимизация никогда не интересовала меня раньше. Что вы можете посоветовать, чтобы помочь мне ускорить игру?
Я пытался оптимизировать код настолько, насколько это возможно, и производительность значительно улучшилась, но, кажется, есть некоторые вещи, которые я пропустил или упускаю из виду. Это огромная игра с полным движком и множеством кода.
Я попытался отследить все распределения и убедиться, что они не были освобождены или забыты во время выполнения, чтобы GC не вызывался во время игры. Это в основном все, что я могу думать, я не знаю, что еще может сделать это отстает
И я сомневаюсь в том, что это число поли мешей, потому что, хотя они имеют высокое качество, я добавил в игру опцию, которая позволяет вам выбирать качество графики: Низкое, Среднее и Высокое, как в компьютерной игре, и разница между Low и High где-то между 600-900 вершинами! Единственное улучшение, которое я заметил, это время загрузки. Также нет никаких специальных эффектов постобработки, освещения, шейдеров, SSS в реальном времени или чего-либо подобного. Просто текстурированные лица:P
также "отставание", на которое я ссылаюсь, - это случайные зависания. Я почти уверен, что это GC, но это может быть что-то еще, так как я думаю, что я нашел и контролировал все распределения (их много). Поскольку моя игра не зависит от частоты кадров, каждый раз, когда она размораживается, игрок и враги и все "прыгает вперед", чтобы не отставать, и это делает и без того сложную игру НАМНОГО сложнее!
Я новичок в профилировании и оптимизации. Как я могу использовать инструменты отладки Android (или другие сторонние инструменты), чтобы получить более полное представление о том, как моя игра работает во время выполнения, и когда / почему она зависает, чтобы я мог их исправить.
ТАКЖЕ, бонусный вопрос:): есть ли способ посмотреть, как он будет работать на других телефонах, не имея на самом деле телефонов или не зная людей, у которых они есть? Например, как быстро он будет работать на Droid X, даже если у меня нет Droid X и нет никого, кого я знаю
3 ответа
Вы пробовали профилировать код с помощью traceview? вставить
Debug.startMethodTracing("myfile");
в onCreate, затем
Debug.stopMethodTracing();
где вы хотите, чтобы закончить запись файла. Чтобы просмотреть результаты, подключите устройство к компьютеру и запустите:
/path/to/android-sdk/platform-tools/adb pull /sdcard/myfile.trace
/path/to/android-sdk/tools/traceview ./myfile.trace
Это покажет, какие занятия занимают больше времени. Вы можете оптимизировать более медленные классы и / или переместить их в фоновый поток.
Вы упомянули, что в некоторых телефонах он работает нормально, возможно, это новые телефоны с ограничением в 24 Мб / приложение вместо ограничения в 16 Мб / приложение? Вы можете попробовать анализатор памяти в Eclipse, чтобы проверить наличие утечек памяти или ненужных больших объектов. Чтобы установить, перейдите в Справка -> Установить программное обеспечение и используйте
http://download.eclipse.org/mat/1.1/update-site/
Затем, пока вы отлаживаете в представлении DDMS, выберите Dump HPROF File (зеленое стекло с красной стрелкой), он должен открыть анализатор памяти.
Редактировать -
Кажется, вам нужно конвертировать файл Android-hprof сейчас, как описано здесь.
Прежде всего, внимательно посмотрите, что говорит logcat. Может быть, вы найдете ответ для нежелательной задержки. Во-вторых, если вы хотите проверить, как часто и сколько времени занимает выполнение методов, просто используйте DDMS. Не знаю, какую среду вы используете, но в Eclipse есть Перспектива, у которой есть опция, называемая "Профилирование метода запуска". Просто нажмите на него, затем подождите пару секунд и отмените его. Через несколько секунд вы получите потрясающий отчет. И проблема с устройствами, позвольте мне процитировать: "Если вы хотите знать, как ваше приложение работает на данном устройстве, вам нужно протестировать на этом устройстве". от 1]
[1] http://developer.android.com/guide/practices/design/performance.html
Это в основном все, что я могу придумать. Я не знаю, что еще может заставить его отставать.
Многие люди делают это, то есть оптимизируют, пытаясь думать о вещах. Это займет у вас часть пути, но только частично, особенно если программное обеспечение велико.
Фактически, вещи в коде, которые занимают время, подвергаются открытию по снимку. Вам не нужно думать о них. Вы просто позволяете программе отображать их. Вот пример.