我正在开发一款名为“Space RPG”的Android游戏 - 目前大多数Galaxy S4和HTC One手机上出现了这个错误。这是所有Java的问题。
游戏会卡住,当我尝试调试进程并暂停相关线程时,它不会暂停,并且会出现一个“悬而未决的”(spin-on-suspend)错误。线程转储让我看到它在一个while循环中,该循环以越来越大的距离步长迭代到所需的“结束位置”,以找到“起始位置”。
这就是事情变得烦人的地方。我可以验证,尽管条件是while(true),但循环不能无限期运行,它不可能运行超过200次,然后我的break语句被调用(代码在我尝试的每部其他电话上都可以工作,这是支持此断言的背景)。
为了帮助缓解我对此事情的担忧,我在循环中添加了一个简单的递增变量,如果它超过1000,它将记录一些内容,以便我可以看到它确实运行了太多次,以防某些变量设置错误或其他原因。 当计数器代码存在时,就不会出现任何崩溃/挂起。也没有看到任何日志表明它运行了超过1000次。 如果我删除此计数器,则每次播放5-10秒后都会出现挂起(在此期间while循环可能已运行10次,尽管这有所不同)。
因此,我的问题是,到底是怎么回事?为什么这些新手机(但似乎没有任何旧手机)在没有递增变量的循环中有问题,而且工作有效并且不持续太长时间?线程如何在该循环中停滞不前,添加额外的计数器变量如何修复问题?
这项工作是在opengl渲染线程上完成的,如果这很重要。
据我所知,大多数S4都会出现这种情况,但至少有一个S4没有出现。我今天使用的那个正在发生。这让我想知道它是否可能与特定的Android、Java、Dalvik或手机上的其他东西有关,但不幸的是,我没有从S4中获得任何详细信息(即不会发生错误的那个)。
如果您能提供任何帮助、指导、思路或进一步阅读等方面,将不胜感激,非常感谢。
游戏会卡住,当我尝试调试进程并暂停相关线程时,它不会暂停,并且会出现一个“悬而未决的”(spin-on-suspend)错误。线程转储让我看到它在一个while循环中,该循环以越来越大的距离步长迭代到所需的“结束位置”,以找到“起始位置”。
这就是事情变得烦人的地方。我可以验证,尽管条件是while(true),但循环不能无限期运行,它不可能运行超过200次,然后我的break语句被调用(代码在我尝试的每部其他电话上都可以工作,这是支持此断言的背景)。
为了帮助缓解我对此事情的担忧,我在循环中添加了一个简单的递增变量,如果它超过1000,它将记录一些内容,以便我可以看到它确实运行了太多次,以防某些变量设置错误或其他原因。 当计数器代码存在时,就不会出现任何崩溃/挂起。也没有看到任何日志表明它运行了超过1000次。 如果我删除此计数器,则每次播放5-10秒后都会出现挂起(在此期间while循环可能已运行10次,尽管这有所不同)。
因此,我的问题是,到底是怎么回事?为什么这些新手机(但似乎没有任何旧手机)在没有递增变量的循环中有问题,而且工作有效并且不持续太长时间?线程如何在该循环中停滞不前,添加额外的计数器变量如何修复问题?
这项工作是在opengl渲染线程上完成的,如果这很重要。
据我所知,大多数S4都会出现这种情况,但至少有一个S4没有出现。我今天使用的那个正在发生。这让我想知道它是否可能与特定的Android、Java、Dalvik或手机上的其他东西有关,但不幸的是,我没有从S4中获得任何详细信息(即不会发生错误的那个)。
如果您能提供任何帮助、指导、思路或进一步阅读等方面,将不胜感激,非常感谢。
float vel = 1.0f; // final velocity is 1. We are working backwards to find out what the starting velocity will need to be.
int i = 0;
double xmath = Math.sin(rot* (Math.PI/180.0f)); // component of velocity for x,y direction based on rotation
double ymath = Math.cos(rot* (Math.PI/180.0f));
while (true) {
/* with this section uncommented, the stall never happens...
++i;
if (i>1000) {
// Something went rather wrong
vel = 91.0f; // LOG WAS HERE, now has a fallback value justincase
break;
}
*/
vel *= 1.2f;
dx -= vel* xmath;
dy += vel* ymath;
if (distance < (float)Math.sqrt(dx*dx+dy*dy)) {
break;
}
}
// Give the ship a velocity that is appropriate for the distance remaining
_AI.Ship.Velocity = vel;