gpt4 book ai didi

java - Android 游戏循环 : How to reach an average of 60 FPS?

转载 作者:行者123 更新时间:2023-11-30 09:37:08 25 4
gpt4 key购买 nike

我在我的 HTC Wildfire S 上看过 Airplane Madness 游戏以恒定的平均 60 FPS 渲染屏幕。我一直试图在同一部智能手机上模仿结果,但我就是不明白为什么我的程序平均只有 15 FPS?

您可能会问,如何查看 Airplane Madness 的帧速率?在设置中有一个选项可以切换 FPS 计数器。我将我的设置为已启用。

这是我的代码。这是我的游戏循环。有一些有趣的结果:

    public void run() {
// Average FPS for Android is 15 on Test Phone is 13 through 15.
// Max FPS is 20.
// Occasional bursts of FPS60 may occur.
long now, lastTime = System.nanoTime();
double process = 0.0;
final double NSperTick = 1000000000.0 / 60.0;
while (running) {
now = System.nanoTime();
process += (now - lastTime) / NSperTick;
lastTime = now;
boolean ticked = false;
while (process >= 1) {
process -= 1;
tick();
ticked = true;
}
if (ticked) {
render();
}
swap();
try {
Thread.sleep(2);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}

任何人都可以告诉我我做错了什么,需要改进什么等等,以便我可以获得平均 60 FPS 吗?这个游戏循环,在 Java 中运行时 (不是 Android),它运行得很好,所以我不确定是什么逻辑部分影响了我智能手机的帧速率。

提前致谢。


编辑:看起来我需要让 Man 知道所有功能。

private void render() {
synchronized (holder) {
if (holder.getSurface().isValid()) {
Canvas c = holder.lockCanvas();
c.drawRGB(0x44, 0x55, 0xff);
ball.render(c);
holder.unlockCanvasAndPost(c);
}
}
}

private void swap() {
}

private void tick() {
float[] values = {meter.X, meter.Y, meter.Z};
ball.tick(values);
handler.tick(ball);
}

下面是我检查游戏平均 FPS 的方法:

public void run() {
// Average FPS for Android is 15 on Test Phone is 13 through 15.
// Max FPS is 20.
// Occasional bursts of FPS60 may occur.
long now, lastTime = System.nanoTime();
int frames = 0;
double process = 0.0;
long frameTime = System.currentTimeMillis();
final double NSperTick = 1000000000.0 / 60.0;
while (running) {
now = System.nanoTime();
process += (now - lastTime) / NSperTick;
lastTime = now;
boolean ticked = false;
while (process >= 1) {
process -= 1;
tick();
ticked = true;
}
if (ticked) {
//render();
frames++;
}
swap();
try {
Thread.sleep(2);
}
catch (InterruptedException e) {
e.printStackTrace();
}
if (frameTime <= System.currentTimeMillis() - 1000)
{
Log.d("FrameRate", Integer.toString(frames));
frameTime += 1000;
frames = 0;
}
}
}

这是 DDMS 的结果:

03-12 14:29:21.008: D/FrameRate(3533): 14
03-12 14:29:22.061: D/FrameRate(3533): 15
03-12 14:29:23.048: D/FrameRate(3533): 14
03-12 14:29:24.033: D/FrameRate(3533): 14
03-12 14:29:25.018: D/FrameRate(3533): 14
03-12 14:29:26.000: D/FrameRate(3533): 14
03-12 14:29:27.056: D/FrameRate(3533): 15
03-12 14:29:28.047: D/FrameRate(3533): 14
03-12 14:29:29.026: D/FrameRate(3533): 14
03-12 14:29:29.995: D/FrameRate(3533): 14
03-12 14:29:31.037: D/FrameRate(3533): 15
03-12 14:29:32.015: D/FrameRate(3533): 14

编辑 2:还有更多信息:

我已经在 render() 函数中注释掉了这段代码:

synchronized (holder)

但是,我仍然只能达到 14 到 15 FPS。这是我无法突破的限制吗?

最佳答案

我不明白为什么要在渲染循环中进行同步。这是一种糟糕的形式,因为它可能会锁定您的渲染线程,如果应用程序出于任何原因无法立即获取锁,就会导致应用程序出现卡住。获取锁也需要时间。

如果您的数据组织方式需要锁定渲染线程,则需要重构您的设计。

永远不要在 UI 线程中同步!

关于java - Android 游戏循环 : How to reach an average of 60 FPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com