大家好我试图用下面的代码将我的FPS限制为30,但我不确定它是否有效。
while (runthread){
c = null;
timestart = System.currentTimeMillis(); //Get time at start of loop for FPS calc
try{
c=mySurfaceHolder.lockCanvas(); //Set c (Canvas) to locked
synchronized(mySurfaceHolder){
framesskipped = 0; // resetting frames skipped (as this is about to render to the screen, the frames skipped variable is only incremented when the onDraw() method is skipped, once it's run, reset it back to 0 for the next count
doDraw(c); //Draw game world
updateMenu(); //Update game logic
}
}
finally{
if (c != null){
mySurfaceHolder.unlockCanvasAndPost(c); //Unlock and post
}
}
//work out timings
timeend = System.currentTimeMillis(); //get end time for current frame (for FPS)
frametime = timeend-timestart; //Set the frametime variable to the time the frame took to render & update (end time - start time)
sleepfor = (int) (30.3030303030303-frametime); // this is the time that the thread will sleep for if <target time (1000/33 = apx. 30FPS
if (sleepfor>0){ // If the 'sleepfor' variable is >0 then set the thread to sleep for it's value (expressed in milliseconds)
try {
MainThread.sleep(sleepfor); //send thread to sleep for value of sleepfor (determined above).
} catch (InterruptedException e) {} //in case of exception
} //close if statement
while (sleepfor<0 && framesskipped<maxframesskipped){ //if sleepfor is < 0 (ie, frame took longer to render than target time and the maxframesskipped has not reached it's limit)
updateMenu(); //Update game logic only
sleepfor+=33; //time to sleep plus the time frame took to render
framesskipped++; //add one to framesskipped variable so this only skips a certain number of frames
frame=0;
}
我在onDraw方法中记录的日志输出。
正如你所看到的,它看起来并不局限于30fps,我不知道为什么,我的数字一定是错的。
其次,任何人都有任何想法为什么我的帧数不时下降到低至5?!
谢谢
答案 0 :(得分:0)
我发现了问题所在:
sleepfor = (int) (30.3030303030303-frametime);
应该是
sleepfor = (int) ((1000/fps)-frametime);
所以 sleepfor =(int)(33.3333333-frametime);
更改了它并且在30/31 fps时运行得相当不错