gpt4 book ai didi

java - Android中的Java多线程

转载 作者:行者123 更新时间:2023-12-03 13:10:06 26 4
gpt4 key购买 nike

如何解决日志猫中的问题..错误说等待时间为负数,它在模拟器和外部设备上崩溃

这是我在Java Android Activity 中的代码

public void run() {
long startTime;
long timeMills;
long waitTime;
long totalTime = 0;
int frameCount = 0;
long targetTime = 1000/FPS;

while (running){
startTime = System.nanoTime();
canvas = null;
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder){
this.gamePanel.update();
this.gamePanel.draw(canvas);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(canvas != null){
try {
surfaceHolder.unlockCanvasAndPost(canvas);
}catch (Exception e){
e.printStackTrace();
}
}
}
timeMills = (System.nanoTime() - startTime) / 1000000;
waitTime = targetTime - timeMills;
try {
this.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
totalTime += System.nanoTime() - startTime;
frameCount++;
if(frameCount == FPS){
avrageFPS = 1000 / (totalTime/frameCount) / 1000;
frameCount = 0;
totalTime = 0;
System.out.print(avrageFPS);
}
}
}

这是日志
java.lang.IllegalArgumentException: millis < 0: -136

最佳答案

您的代码执行此操作:

long targetTime = 1000/FPS;

while (...) {
startTime = System.nanoTime();
... do lots of work ...
timeMills = (System.nanoTime() - startTime) / 1000000;
waitTime = targetTime - timeMills;

如果准备和渲染框架所需的时间超过 targetTime,则 waitTime将为负数。动画的复杂性以及 FPS的值会影响这种情况发生的可能性。

最简单的解决方法是:
if (waitTime < 0) { waitTime = 0; }

这样,如果渲染花费的时间太长,并且您错过了截止日期,那么您根本就不会 sleep 。

更好的解决办法是将游戏的结构设计成不影响显示器的显示时间,而不是采用固定的帧频概念,并在落后时丢弃帧。有关此问题的更多信息,请参见图形体系结构文档的 this appendix

关于java - Android中的Java多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686142/

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