日期:2014-05-20  浏览次数:20584 次

为什么程序挂起后再次进入,运行速度会变快??
我做的一个游戏程序在WTK的标准模拟器上运行正常,但它没有模拟来电中断或用户按红键强制暂停的功能,于是用MOTO的模拟器试了一下,发现   按红键Suspend程序以后再回来,   游戏速度就明显变快了,人的操作几乎反应不过来.   而其它游戏没有这个情况所以应该不是模拟器本身的问题   .
        我是用Thread.sleep()一个固定毫秒数的方法实现游戏时钟的.   为了调试,我在游戏的主while(){}循环的一头一尾处都取了一个系统时钟毫秒   数,再把这个时间差println到控制台上供观察.   发现挂起前后,这个时间差是基本相同的,但输出时间差的速度变快了.   这只能说明除了被两个   取系统时钟的语句夹着的部分以外还有另外的过程在执行,由于它的加快造成了整个程序的速度变快.     然而我的程序在游戏开始后就只有这一   个while循环在运行,也没有别的线程,为什么还会这样呢?
        甚是困惑,求高人释疑.

------解决方案--------------------
关于你中断的代码贴一下;

PS.在WTK中是可以模拟中断的,在运行起来之后选Midlet-> Pause选项
------解决方案--------------------
把你哪些可能改变和影响精灵位置和速度的方法调用处都放个打印语句,看看是否由于开启了其他线程或程序逻辑有问题而导致一帧里执行了多遍。

saltedfish

------解决方案--------------------
是不是你的线程是在 startApp里开始的?
有些虚拟机暂停/挂起後,恢复回来的时候是调用startApp的,如果你把线程的启动代码放在startApp里,那么就会造成启动2个线程
如果你多次挂起/恢复,速度变得更快,那就应该是这个问题了

解决方案:
1.把线程启动代码写在MIDlet的构造方法里,不要写在startApp里
2.定义一个boolean变量,标记是否第一次启动,startApp里判断该变量,如果是第一次启动才执行线程启动代码

private booolean firstRun=true;
public void startApp()
{
if(firstRun)
{
firstRun=false;
new Thread(....).srart();
}
}
------解决方案--------------------