2015-02-20 2 views
-1

Я делаю простую 2d-игру в Android. Однако, даже с несколькими изображениями на экране, я сталкиваюсь с проблемами с fps (около 15-25 и довольно stuttery).Как эффективно отображать изображения в Android

В настоящее время я использую холст и просто настраиваю изображение каждого кадра со всем, что мне нужно для отображения на нем.

Вот некоторые из моих визуализации кода:

public void render(Painter g) { 
    g.setColor(Color.rgb(208, 244, 247)); 
    g.fillRect(0, 0, GameMainActivity.GAME_WIDTH, GameMainActivity.GAME_HEIGHT); 
    g.setColor(Color.rgb(139,69,19)); 
    g.fillRect(0, 1400, GameMainActivity.GAME_WIDTH, GameMainActivity.GAME_HEIGHT - 1400); 
    g.drawImage(Assets.background3stone, currentBackground3X, 141); 
    g.drawImage(Assets.background3stone, currentBackground3X + 3459, 141); 
    g.drawImage(Assets.background2stone, currentBackground2X, 141); 
    g.drawImage(Assets.background2stone, currentBackground2X + 3459, 141); 
    g.drawImage(Assets.ground, currentBackground1X, 760); 
    g.drawImage(Assets.ground, currentBackground1X + 3000, 760); 
    renderNews(g); 
    renderButtons(g); 
    g.drawImage(Assets.leaderboard, 40, 180, 148, 148); 

    g.drawImage(Assets.achievements, 40, 354, 148, 148); 

    g.drawString("FPS: " + frameValue, 50, 200); 
} 

Этот код выполняется для каждой итерации цикла игры.

Кто-нибудь знает какие-либо способы оптимизации моей работы? В настоящее время я перерисовываю буквально все кадры, есть ли способ не перерисовывать статические изображения? Переключение на openGl поможет?

Спасибо!

ответ

0

Переключение на openGL всегда поможет. Но ваша проблема заключается в том, что вы рисуете непосредственно на экране. Не делай этого. Нарисуйте растровое изображение, затем blit растровое изображение на экране за одну операцию. Производительность будет намного выше. Это также позволит вам сделать рисунок на 2-й поток и только нарисовать на главном экране.

+0

Я слышал, что opengl действительно запутывает, чтобы переключиться на. Это правда? Если да, то может ли libgdx упростить переход? – mongy910

0

Перед переключением на openGL вы можете попытаться не перерисовать изображение самостоятельно, а просто переместить его. Вам просто нужно установить новые LayoutParams для вашего изображения. Вы также можете посмотреть на TranslateAnimation на случай, если вы будете перемещать материал мягко. Или вы используете матричное преобразование.

+0

Что значит просто установить новые LayoutParams? Я думал, что каждый раз, когда меняется местоположение изображения, его нужно перерисовать на холст? – mongy910

+0

Да, его нужно перерисовать на экране, но файл ресурсов не нужно снова загружать, не создавать растровые изображения, размер рассчитывать и т. Д. Это намного быстрее. Вы можете сохранить массив ImageViews, чтобы указать на нарисованные, а затем просто переместить его. http://stackoverflow.com/questions/10141244/android-please-explain-how-to-properly-move-a-view –

1

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

Однако, если вы предпочитаете не использовать игровые движки, я бы рекомендовал использовать OpenGL, чтобы получить некоторый импульс. Вы также можете получить некоторый импульс путем оптимизации ваших изображений. Попробуйте уменьшить размеры изображений и не используйте слишком большие изображения. Также попробуйте эффективно загрузить изображения в программу.

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