Android FPS, как сделать это плавнее? - PullRequest
2 голосов
/ 27 декабря 2011

У меня проблемы с построением основного игрового цикла для моей игры.Я на начальном этапе, и все, что я хочу сделать, это перемещать мяч с постоянной скоростью (например, 3) через нижнюю часть экрана.Положение шара обновляется в методе обновления главной панели и рисуется в части рендеринга, как и ожидалось.Ничего исключительного в механизме.Мяч движется, но он определенно не плавный, визуальный эффект тихий и тревожный. Я измерил время реализации этих методов, и общее время реализации этой пары составляет около 3-4 миллисекунд.В этих условиях, что подходит FPS?Подходят ли заданные значения констант? Что в моем механизме отсутствует или нет?Заранее большое спасибо.блок кода в основном потоке.

private final static int MAX_FPS = 200;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
private final static int    MAX_FRAME_SKIPS = 5;

public void run() {

    initTimingElements();
    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;
    long beginTime2;

    long diff1;
    long diff2;

    sleepTime = 0;

    Canvas canvas;
    Log.d(TAG, "Starting game loop");
    while (running) {
        canvas = null;
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                beginTime = System.currentTimeMillis();
                framesSkipped = 0; 

                this.gamePanel.update();
                diff1=System.currentTimeMillis()-beginTime;
                beginTime2=System.currentTimeMillis();
                this.gamePanel.render(canvas);
                diff2=System.currentTimeMillis()-beginTime2;



                timeDiff = System.currentTimeMillis() - beginTime;
                sleepTime = (int) (FRAME_PERIOD - timeDiff);

                if (sleepTime > 0) {
                    try {
                        Thread.sleep(sleepTime);
                    } catch (InterruptedException e) {
                    }
                }                   
                while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
                    this.gamePanel.update();
                    sleepTime += FRAME_PERIOD;
                    framesSkipped++;
                }
                if (framesSkipped > 0) {
                    Log.d(TAG, "Skipped:" + framesSkipped);
                }
                framesSkippedPerStatCycle += framesSkipped;
                storeStats();
            }
        } finally {
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
}

1 Ответ

0 голосов
/ 27 декабря 2011

Попробуйте использовать TimerTask, который срабатывает каждые 60 мс или около того.
Это то, что я делаю, пока не перестану лениться, чтобы сделать правильную реализацию, но она работает хорошо.Просто помните, что run () будет выполняться в другом потоке, поэтому используйте runOnUIThread () для запуска любого кода, который вам нужен.

...