-1

こんにちは。以下のコードで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メソッドに配置したログからの出力。

ここに画像の説明を入力してください

ご覧のとおり、30 fpsに制限されているようには見えません。理由はわかりませんが、私の数字は間違っているに違いありません。

第二に、私のフレーム数が時々5まで下がる理由を誰かが知っていますか?!

ありがとうございました

4

1 に答える 1

0

私は問題が何であるかを知りました:

sleepfor = (int) (30.3030303030303-frametime);

になるはずだった

sleepfor = (int) ((1000/fps)-frametime);

したがって、sleepfor =(int)(33.3333333-frametime);

それを変更し、30/31fpsでかなりうまく動作します

于 2013-02-01T02:11:00.877 に答える