0

所有使用 SurfaceView 的示例似乎都使用了执行繁忙循环的 run 方法。这是一种有效的方法吗?我能看到的所有代码都遵循月球着陆器示例中的这个范例。但是,创建繁忙的 while 循环似乎是编写多线程应用程序的一种奇怪方式。绘图代码不应该等待绘图命令队列或类似的东西。我会以这种方式实现它,但是我看到的代码量如下所示,这让我提出了一个问题……在 SurfaceView 上绘制线程的最佳语义是什么。

public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        // DO DRAWING HERE
                    }
                } finally {

                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
4

1 回答 1

1

我不知道在这种情况下什么是最佳实践,但我已经成功地在我的应用程序中使用了该示例的略微修改版本。由于我响应触摸输入(而不是不断更新画布),我添加了一个标志来测试是否需要完成绘图。我还在每次刷新后添加了睡眠以限制系统负载。这是我在 try 块中的代码:

            if(mPanel.needsRefresh()) {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    mPanel.onDraw(c);
                }
            } else {
                SystemClock.sleep(10);
            }
于 2012-12-05T20:57:20.143 回答