0

当您SurfaceView在 Android 中使用 s 时,尤其是在将它们设置为布局的一部分时(通过将 s 添加SurfaceView到布局 XML 中),性能是一个至关重要的方面。

就我而言,它View每隔几秒更新一次(包含扑克游戏中的扑克牌,具有一些效果和触摸事件的移动),并且由于它是更大布局的一部分,我遇到的问题是这SurfaceView会减慢其余部分我Activity的用户界面,即其余的Activity冻结一小段时间,然后它被更新,因此没有显示一小段时间。

public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
    ...
}

在其onDraw()方法中,有一些Bitmaps 被绘制到黑色背景上。在该类内部,启动了一个线程,该线程不断调用View'sonDraw()方法:

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class SurfaceThread extends Thread {

    private SurfaceHolder mSurfaceHolder;
    private MySurface mSurface;
    private boolean mRunning = false;

    public HandThread(SurfaceHolder surfaceHolder, MySurface surface) {
        mSurfaceHolder = surfaceHolder;
        mSurface = surface;
    }

    public SurfaceHolder getSurfaceHolder() {
        return mSurfaceHolder;
    }

    public void setRunning(boolean run) {
        mRunning = run;
    }

    @Override
    public void run() {
        Canvas c;
        while (mRunning) {
            c = null;
            try {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    if (c != null) {
                        mSurface.onDraw(c);
                    }
                }
            }
            finally { // when exception is thrown above we may not leave the surface in an inconsistent state
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }

}

Activity不幸的是,这会不时减慢我的速度,这意味着大约有冻结。经常是 0.5 秒。

有没有可能加快速度?我试图放弃Threadandinvalidate()每次调用onTouchEvent(),但这也不起作用。

我认为必须有一种方法来提高性能,因为它SurfaceView的更新频率很低。有几秒钟没有任何反应,但是当用户触摸 时View,东西会四处移动,直到手指抬起。

4

1 回答 1

1

您需要分析真正导致这些停顿的原因。跟踪典型运行并查看实际占用 CPU 时间的内容。很有可能,某些事情导致 UI 冻结,您正在做很多应该移动到另一个线程的工作。

您还希望避免不必要的工作。您肯定要查看的内容是确保在后台循环中(包括对 的调用onDraw)尽可能避免创建新对象。这将减少垃圾收集,这也可能导致打嗝。如果可能的话,还要避免或最小化在此处加载位图。

于 2013-01-23T00:54:24.753 回答