Игра для Android с использованием SurfaceView, Canvas - Drawable или Bitmap - PullRequest
4 голосов
/ 28 декабря 2011

Я занимаюсь разработкой игры на SurfaceView.Он включает в себя около 15-20 изображений, некоторые из которых имеют большое разрешение в среднем 320х400.У меня два вопроса -

  1. Я использую изображения как Drawable и использую draw(canvas) метод рисования для рисования изображений на экране.Я вижу, что в некоторых играх люди используют Bitmap вместо Drawable для рисования изображений на экране, в чем разница между использованием изображений как Drawable или Bitmap в игре для Android.Какой из них более эффективен при использовании памяти и имеет хорошие характеристики при рисовании на холсте?

  2. Сейчас я создаю массивы Drawable и создаю объект Drawable из всех изображений, используемых в игре, и помещаю ихв соответствующий массив, так как все изображения требуются во время игры.Я хочу знать, что лучше - загружать все изображения в Drawable при запуске или создавать Drawable Object, когда нам это нужно, и обнулять другие, которые не отображаются, и повторять этот процесс каждый раз, когда изображения показываются или удаляются с экрана.Будет ли повторение процесса создания и обнуления объектов иметь какой-либо плохой эффект или это лучше, чем загрузка всех изображений одновременно?

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 августа 2012
  1. Согласно моему опыту, растровое изображение быстрее, чем рисуемое.Я тестирую приложение, которое работает со скоростью 40-45 кадров в секунду с рисованием, а с растровым изображением я получаю 57-59 кадров в секунду.Это потому, что люди используют их для игр.

  2. Если у вас достаточно памяти, я рекомендую сначала загрузить все изображения.Если вы начинаете создавать и уничтожать объекты, он будет часто вызывать сборщик мусора, и это будет очень медленно.Если вам не нужна высокая производительность, создание и уничтожение объектов уменьшат использование памяти.Если вы пытаетесь создать игру, возможно, эта ссылка может помочь.

Google I / O 2009 - Написание игр в реальном времени для Android , особенно мин. 22:30Быстрый код Java

2 голосов
/ 22 августа 2012

Говоря из личного опыта, вы должны использовать Растровые изображения вместо Drawables . Это даст лучшие результаты.

Растровое изображение наилучшим образом подойдет вашим параметрам, поскольку все, что вам нужно (насколько я могу судить), это изображение, которое будет отображаться на экране.

Drawable имеет более широкий охват (документация с сайта Android Dev.):

Drawable - это общая абстракция для «чего-то, что можно нарисовать». Чаще всего вы будете иметь дело с Drawable как тип ресурса извлекается для рисования вещей на экране; класс Drawable предоставляет общий API для работы с базовым визуальным ресурсом это может принимать различные формы. В отличие от View, Drawable не иметь возможность получать события или иным образом взаимодействовать с Пользователь.

Обязательно загрузите все свои растровые изображения перед началом игры; Это чистый подход. Если вы этого не сделаете, ваша игра может отставать из-за GC.

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

public static Bitmap foo;

Затем в вашем классе деятельности вы можете загрузить эти растровые изображения (я обычно помещаю свои растровые изображения в папку «Активы»):

NB. Вероятно, лучше создать класс с именем LoadScreen или SplashScreen, который позаботится обо всей инициализации. Если вы сделаете это таким образом, вам нужно будет передать ссылку на ваш класс активности этому классу.

Assets.foo = readAssetsBitmap("foo.png");

public Bitmap readBitmapFromMemory(String filename) {
        Bitmap defautBitmap = null;
        File filePath = getFileStreamPath(filename);
        FileInputStream fi;
        try {
            fi = new FileInputStream(filePath);
            defautBitmap = BitmapFactory.decodeStream(fi);

        } 
        catch (FileNotFoundException e) {
            e.printStackTrace();

        }

        return defautBitmap;

    }

Когда пользователь решает выйти из игры, вы должны выгрузить все растровые изображения следующим образом:

disposeBitmap(Assets.foo);

public void disposeBitmap(Bitmap bitmap) {
        bitmap.recycle();
        bitmap = null;

    }

Надеюсь, это поможет.

...