Android 安卓:onDraw太慢了

Android 安卓:onDraw太慢了,android,canvas,surfaceview,ondraw,Android,Canvas,Surfaceview,Ondraw,我正在用安卓2.2构建一个游戏。主游戏活动使用自定义表面视图: class GameView extends SurfaceView 据我所知,onDraw()方法需要执行自己的线程。考虑到这一点,我计划在onDraw()中添加一个背景图像: 但是当我执行游戏时,它变得非常慢。如果我注释掉new Paint()行,游戏速度会加快 是我做错了什么,还是我的问题有解决办法?例如,有没有办法减少对onDraw()的调用次数?或者将XML属性添加到我的自定义SurfaceView类 下面是我如何加载可

我正在用安卓2.2构建一个游戏。主游戏
活动
使用自定义
表面视图

class GameView extends SurfaceView
据我所知,
onDraw()
方法需要执行自己的线程。考虑到这一点,我计划在
onDraw()
中添加一个背景图像:

但是当我执行游戏时,它变得非常慢。如果我注释掉
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
方法的代码。 不幸的是,我不能发布所有内容。

油漆。设置颜色(颜色。黑色);
drawRect(0,0,getWidth(),getHeight(),paint);
drawBitmap(gameLevel.getBitmap(),0,0,paint);
//绘制对象(1)320x25
//绘制对象(5)每个50x50
//绘制对象(n)每个15x15,估计
//绘制对象(n)每个50x50
//碰撞检查,在图像工作表上绘制碰撞平铺

//使用canvas.drawText()绘制游戏信息 时间线++;


提前谢谢

您可以尝试加载背景,而不是在尚未加载的情况下加载背景。否则,除了切换到OpenGL之外,您没有什么可以做的

编辑:

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);
如果这没有帮助,其他原因可能是:

  • 您的绘图代码是错误的
  • 绘制背景时可以缩放背景
  • 你可以在模拟器上运行它

如果问题只是“paint=new paint();”行,为什么不只创建一次paint对象?第一次创建类时,将其设置为类变量。然后,您可以随时使用该对象。

恐怕该行会返回一个错误。我已经检查了API,BitmapFactory.decodeResource的3个参数必须是(上下文、int-id、选项)。不幸的是,它感觉只是毫秒的差异。我已经将onDraw方法的基本部分放置在了lockCanvas()和unlockCanvasAndPost()之间的后台线程中?那样的话,我不知道。是的。但这不是因为图像的文件大小是一个可能的原因吗?墙纸的当前文件大小已经在500KB左右了?实际上,该行在
onCreate()
上执行一次。 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

// draw game information using canvas.drawText() timeLine++;
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);