由于这个问题有一些兴趣,我会回答。
最好的方法是有一个单独的画布线程。“单独的”画布只能通过SurfaceView
. LunarLanding 就是一个很好的例子。每一帧都是单独计算的,而不是主视图,只共享 CPU 时间,而不是绘图时间。因此更快,即使结合了例如顶部的常规视图和底部的动画视图。
但是,如果您处于该共享环境中,则必须设置一个时间间隔。该间隔用于 FPS 上限。如果您没有设置 FPS 上限,那么 CPU 将疯狂运行以获得良好的动画效果,SurfaceView
如果它是单独的。将其限制在 60fps 甚至更低的速度可以有效地绘制所有视图,而不会出现 CPU 过载。
所以请从 API 演示中查看月球着陆的绘图线程并设置 FPS 上限。
private long timeNow;
private long timeDelta;
private long timePrevFrame;
private void capFps(int fps) {
timeNow = System.currentTimeMillis();
timeDelta = timeNow - timePrevFrame;
try {
//ps 你总是可以为 60FPS 设置 16 而不是 1000/fps 以避免每次计算
Thread.sleep((1000 / fps) - timeDelta);
} catch (InterruptedException e) {
}
timePrevFrame = System.currentTimeMillis();
}
然后绘图线程将如下所示:
@Override
public void run() {
Canvas c;
while (run) {
c = null;
sleepFps(60, false);
try {
synchronized (surfaceHolder) {
c = surfaceHolder.lockCanvas(null);
widgetView.doDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}