эффективный рендеринг Android - PullRequest
0 голосов
/ 01 июля 2011

Я прочитал довольно много учебных пособий по программированию игр на Android, и все они в основном предоставляют то же решение, что и рисование игры, в котором вращается выделенная нить, как это:

public void run() { 
    while(true) { 
        if(!surfaceHolder.getSurface().isValid()) continue; 
        Canvas canvas = surfaceHolder.lockCanvas(); 
        drawGame(canvas); /* do actual drawing here */
        surfaceHolder.unlockCanvasAndPost(canvas); 
    }
} 

теперь мне интересно, разве это не расточительно?Предположим, у меня есть игра с очень простой графикой, поэтому фактическое время в drawGame мало;затем я буду рисовать одни и те же вещи, крадя процессор из других потоков;возможность может быть пропустить рисунок и немного поспать, если состояние игры не изменилось, что я мог бы проверить, имея поток обновления состояния, поддерживающий подходящий флаг состояния.Но, возможно, есть и другие варианты.Например, нельзя ли синхронизировать с рендерингом, чтобы я не слишком часто публиковал обновления?Или я что-то упускаю, и это именно то, что делает lockCanvas, то есть блокирует и не сжигает процессор до нужного времени?

Заранее спасибо

L.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Я бы сказал, что уроки, которые вы видели, неверны, вы действительно хотите подождать в основном цикле.16 миллисекунд будут целевым временем кадра в примере ниже

public void run() { 
    while(true) { 
        long start = System.currentTimeMillis();
        if(!surfaceHolder.getSurface().isValid()) continue; 
        Canvas canvas = surfaceHolder.lockCanvas(); 
        drawGame(canvas); /* do actual drawing here */
        surfaceHolder.unlockCanvasAndPost(canvas); 
        long frameTime =  System.currentTimeMillis() - start;
        try {
            Thread.sleep(Math.max(0, 16 - ( frameTime )));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
} 
0 голосов
/ 01 июля 2011

Вам не нужно рисовать холст из цикла в потоке, вы можете сделать это по запросу, как при перемещении пальца по экрану.

Если анимация не интенсивная, можно использовать только пользовательский вид, а затем сделать недействительным () вид из некоторого события пользовательского ввода.

Также возможно остановить поток, а затем создать и запустить его снова столько раз, сколько необходимо в одном и том же классе SurfaceView.

...