关于lunarlander例子的简单问题

时间:2011-01-06 09:03:11

标签: java android performance graphics drawing

我的游戏是基于农场的例子。这是我正在使用的运行循环(非常类似于lunarlander中使用的运行循环)。即使我几乎什么都没画,我的绘画也会遇到相当大的性能问题。

我注意到以下方法。为什么要创建画布并在每个循环中设置为空?

    @Override
    public void run() 
    {
        while (mRun) 
        {
            Canvas c = null;
            try 
            {
                c = mSurfaceHolder.lockCanvas();//null
                synchronized (mSurfaceHolder) 
                {
                    updatePhysics();
                    doDraw(c);
                }
            } finally 
            {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) 
                {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }

我大多数时候都读过关于画布的任何内容,它更像是:

mField = new Bitmap(...dimensions...);
Canvas c = new Canvas(mField);

我的问题是:为什么Google的例子就是这样做的(null canvas),有什么好处,有没有更快的方法呢?

2 个答案:

答案 0 :(得分:2)

在你的例子中,你确实制作了一个新画布。但是当你说

  

为什么要创建画布并在每个循环中设置为空?

我认为不会发生这种情况。创建了'a'画布(变量),并为初学者设置为null。这就是所谓的

c = mSurfaceHolder.lockCanvas();

返回使用的画布。 (见http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas%28%29

没有像您似乎建议的那样创建“新画布”。如果出现问题,c保持为空,您可以检查它。如果它不为空,则执行解锁。

答案 1 :(得分:0)

也许你没有像在月球示例中那样在单独的线程中进行绘图。