Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于lunarlander示例的简单问题_Java_Android_Performance_Graphics_Drawing - Fatal编程技术网

Java 关于lunarlander示例的简单问题

Java 关于lunarlander示例的简单问题,java,android,performance,graphics,drawing,Java,Android,Performance,Graphics,Drawing,我的游戏基于lunarlander示例。这是我正在使用的运行循环(与lunarlander中使用的非常类似)。即使我几乎什么也没画,我也会遇到与我的绘画相关的相当大的性能问题 我注意到下面的方法。为什么每个周期都要创建画布并将其设置为空 @Override public void run() { while (mRun) { Canvas c = null; try

我的游戏基于lunarlander示例。这是我正在使用的运行循环(与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);

我的问题是:为什么谷歌的例子是这样做的(空画布),这有什么好处,有没有更快的方法呢?

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

为什么每个周期都要创建画布并将其设置为空

    @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);
                }
            }
        }
    }
我不认为会发生这种情况。创建了“a”画布(变量),并将其设置为null。那么这个叫做

c = mSurfaceHolder.lockCanvas();
返回所使用的画布。(见附件)


没有你所说的“新画布”。如果出现错误,c将保持为空,您可以检查它。如果不为空,则执行解锁。

可能您没有像Lunar示例中那样在单独的线程中进行绘制。

啊,如果您不知道,我对这一点相当陌生。使用lockCanvas方法,指定脏矩形会有任何性能优势吗?另外,您是否需要在任何地方指定画布的大小?创建一个线程,该线程将引用支架或曲面。开始。在Run()方法中,添加图形。不要忘记在显示曲面之前不要启动线程,否则您将有一个空画布。当然,只需使用holder上的回调或onSurfaceCreate方法启动线程。