Android: onDraw слишком медленный - PullRequest
4 голосов
/ 14 августа 2011

Я создаю игру, используя Android 2.2.Основная игра Activity использует пользовательский SurfaceView:

class GameView extends SurfaceView

Насколько я понимаю, метод onDraw() требует выполнения собственного потока.Имея это в виду, я планирую добавить фоновое изображение в onDraw():

canvas.drawBitmap(wallpaper, 0, 0, paint);
paint = new Paint();

Но когда я запускаю игру, она становится очень медленной.Если я закомментирую строку new Paint(), игра ускорится.

Есть ли что-то, что я делаю не так, или есть решение моей проблемы?Например, есть ли способ уменьшить количество звонков до onDraw()?Или добавить атрибут XML в мой пользовательский класс SurfaceView?

Вот код, как я загружаю рисованные изображения.


public Bitmap loadBitmap(String image) {
        Bitmap bitmap = null;

        try {
            int id = R.drawable.class.getField(image).getInt(new Integer(0));
            bitmap = BitmapFactory.decodeResource(context.getResources(), id);
//          bitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565); 
        } catch(Exception ex) {
            Log.e("loadBitmap", ex.getMessage());
        }

        return bitmap;
    }

Вот код метода onDraw.К сожалению, я не могу все опубликовать. paint.setColor(Color.BLACK); canvas.drawRect(0, 0, getWidth(), getHeight(), paint); canvas.drawBitmap(gameLevel.getBitmap(), 0, 0, paint); // draw object(1) 320x25 // draw object(5) 50x50 each // draw object(n) 15x15 each, estimate // draw object(n) 50x50 each // collision check, draw hit tile on the image sheet</p> <p>// draw game information using canvas.drawText() timeLine++;

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Если проблема только в «paint = new Paint ();»линия, почему бы вам не создать объект Paint только один раз?Когда класс создается впервые и сделайте его переменной класса.Тогда просто используйте объект каждый раз, когда вы хотите.

1 голос
/ 14 августа 2011

Вы можете попробовать загрузить фон как RGB_565 вместо ARGB_8888 , если вы этого еще не сделали. В противном случае вы ничего не можете сделать, кроме как перейти на OpenGL

EDIT:

Options options = new Options();
options.inDither = false;
options.inJustDecodeBounds = false;
options.inSampleSize = 1;
options.mCancel = false;
options.inPreferredConfig = Config.RGB_565;

bitmap = BitmapFactory.decodeResource(context.getResources(), id, options);

Если это не поможет, другие причины могут быть:

  • Вы рисуете неправильный код
  • Вы масштабируете фон, когда рисуете
  • Вы запускаете его на эмуляторе
...