1

我目前正在尝试为Android制作一个小游戏。
我尝试测量游戏的两个动作之间的时间,但是当我在调用该currentTimeMillis()方法后尝试调用该方法时,开始时间保持为 0 gameThread.run()(gameThread 是可运行的)。当我在run()通话之前放置它时,它会提供正确的价值。

类游戏视图:

@Override
public void surfaceCreated(SurfaceHolder holder)
{
    // at this point the surface is created and we start the gameloop
    gameThread.setRunning(true);
    gameThread.run();
    begin=System.currentTimeMillis();
}

/**
 * This is the game update method. It iterates through all the objects and
 * calls their update method
 */
public void update()
{
    for (GuiElement element : guiElements)
    {
        element.update();
    }
    count++;
    if (ball.getPosY() >= Statics.DISPLAY_HEIGTH - ball.getRadius())
    {
        Log.d(TAG, "Displayhoehe : " + Statics.DISPLAY_HEIGTH);
        Log.d(TAG, "DisplayfactorHeight : " + Statics.DISPLAY_FACTOR_HEIGHT);
        Log.d(TAG, "speedvalue : " + ball.getSpeedY());
        Log.d(TAG, "ballradius : " + ball.getRadius());
        Log.d(TAG, "am boden mit " + count + " schritten");
        gameThread.setRunning(false);
        end = System.currentTimeMillis();
        Log.d(TAG, "begin, end " + begin + " " + end);
        Log.d(TAG, "time " + (end - begin));
    }
}

类 GameThread(实现可运行)

public void run()
{
    Canvas canvas;
    Log.d(TAG, "Starting game loop");

    long beginTime; // the time when the cycle begun
    long timeDiff; // the time it took for the cycle to execute
    int sleepTime; // ms to sleep (<0 if we're behind)
    int framesSkipped; // number of frames being skipped

    while (running)
    {
        canvas = null;
        // try locking the canvas for exclusive pixel editing in the surface
        try
        {
            canvas = surfaceHolder.lockCanvas();

            synchronized (surfaceHolder)
            {
                beginTime = System.currentTimeMillis();
                framesSkipped = 0; // resetting the frames skipped
                // update game state
                gameView.update();
                // draw state to the screen
                gameView.draw(canvas);
                // calculate how long did the cycle take
                timeDiff = System.currentTimeMillis() - beginTime;
                // calculate sleep time
                sleepTime = (int) (FRAME_PERIOD - timeDiff);

                if (sleepTime > 0)
                {
                    // if sleepTime > 0 we're OK
                    try
                    {
                        // send the thread to sleep for a short period very
                        // (useful for battery saving)
                        Thread.sleep(sleepTime);
                    }
                    catch (InterruptedException e)
                    {
                    }
                }

                while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS)
                {
                    // we need to catch up (skip some draw() calls)
                    this.gameView.update(); // update without rendering
                    sleepTime += FRAME_PERIOD; // add frame period to check
                                                // if we catched up
                    framesSkipped++;
                }
            }
        }
        finally
        {
            // in case of an exception the surface is not left in an inconsistent state
            if (canvas != null)
            {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

编辑:我试图在起点记录 currentMillis() 的返回值,似乎该方法在 run() 方法完成后被调用。它不应该同步运行吗?

@Override
public void surfaceCreated(SurfaceHolder holder)
{
    // at this point the surface is created and we start the gameloop
    gameThread.setRunning(true);
    gameThread.run();
    begin=System.currentTimeMillis();
    Log.d(TAG, "currentMillis at beginning " + System.currentTimeMillis());
}

日志:

10-21 19:43:17.480: D/GameView(19767): Displayhoehe : 480
10-21 19:43:17.480: D/GameView(19767): DisplayfactorHeight : 1.0
10-21 19:43:17.480: D/GameView(19767): speedvalue : 1.6666666666666667
10-21 19:43:17.480: D/GameView(19767): ballradius : 20
10-21 19:43:17.480: D/GameView(19767): am boden mit 133 schritten
10-21 19:43:17.480: D/GameView(19767): begin, end 0 1350841397483
10-21 19:43:17.480: D/GameView(19767): time 1350841397483
10-21 19:43:17.480: D/GameView(19767): currentMillis at beginning 1350841397484

解决方案:我错误地启动了 Runnable。这是启动 Runnable 的正确方法:

gameThread.setRunning(true);
Thread t = new Thread(gameThread);
t.start();
begin=System.currentTimeMillis();
4

1 回答 1

3

那是因为你run()直接调用方法而不是调用线程的start()方法。

于 2012-10-21T17:07:07.793 回答