这是我如何使用 Surface View 调整 FPS 的示例。查看 Run 方法以了解 FPS 的工作原理。
1:我们获取更新前的时间并渲染到屏幕上。
2:完成所有工作后,我们再次获得时间。
3:1000 毫秒是一秒,40 FPS 是常态。
4:经过时间=开始时间-结束时间;
5:因此,如果 elaspedTime 小于 25,那么它至少可以达到 40 FPS。
6:如果 elaspedTime = 5 毫秒,那么它的执行速度为 1000 / 5 = 200 FPS
7:如果您在同一线程上运行更新程序和渲染程序,您可以让线程休眠几毫秒。这样你就不会更新很多次。
8:希望它有所帮助 这个类是一个基本的游戏类,即使他们在 Galaxy S 6 上运行它,它也能保持游戏运行和 40 fps。你需要自己进行必要的更改来调整它。
public class MySurfaceView extends SurfaceView implements Runnable {
long time = 0, nextGameTick = 0;
SurfaceHolder myHolder;
Thread myThread = null;
boolean myRunning = false;
public MySurfaceView(Context context) {
super(context);
myHolder = getHolder();
}
@Override
public void run() {
while (myRunning) {
nextGameTick = System.currentTimeMillis();
if (!myHolder.getSurface().isValid())
continue;
Update();
Render();
time = nextGameTick - System.currentTimeMillis();
time = (time <= 0) ? 1 : time;
if (time <= 25)
sleepThread(25 - time);
Log.d("FrameRate", String.valueOf(1000 / time));
}
}
public void pause() {
myRunning = false;
while (true) {
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
myThread = null;
}
public void resume() {
myRunning = true;
myThread = new Thread(this);
myThread.start();
}
public void sleepThread(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void Render() {
// TODO Render to Screen
}
private void Update() {
// TODO Update
}
}