Как добиться 30 кадров в секунду с помощью Android SurfaceView? - PullRequest
5 голосов
/ 30 января 2011

Я ищу пример кода, который показывает, как достичь 30 кадров в секунду с помощью Android SurfaceView ?Предположим, что каждый кадр рисует окружность, начиная с позиций x и y, и каждый кадр увеличивает x и y на единицу.

Дополнительный вопрос: поверх вышеупомянутого я хочу наложить другой вид для отображения текстового содержимого, чтобы любая графика быларисование показывает под этим текстовым содержанием.Как это можно сделать?

Ответы [ 3 ]

6 голосов
/ 30 января 2011

Если вам нужна высокая частота кадров, вам действительно нужно прочитать о GLSurfaceView . При нормальном виде поверхности вы будете зависеть от расчетов компоновки расходов и рендеринга, ориентированного на процессор. С GLSurfaceView вы можете разгрузить это на GPU и иметь жесткий эффективный контроль над раскладками.

3 голосов
/ 31 января 2011

Создайте поток, который делает это 30 раз в секунду:

  1. Вызовите SurfaceHolder.lockCanvas ().
  2. Рисует в Canvas (должен полностью перерисовать все пиксели).
  3. Вызовите SurfaceHolder.unlockCanvasAndPost ().

Фактически, если ваш поток просто сидит и делает это, не пытаясь сделать паузу, он будет ограничен частотой кадров экрана.

Вы должны убедиться, что этот поток правильно синхронизирован с управлением видом поверхности - например, если поверхность изменяется или разрушается, ваш код должен синхронизироваться с потоком, чтобы убедиться, что поток останавливается, пока этотслучается.

Конечно, это означает, что вы делаете программный рендеринг на холст.В зависимости от того, что вы делаете, это может быть хорошо, чтобы дать вам анимацию 30 кадров в секунду.Если нет, вам нужно использовать GLSurfaceView.В любом случае вы можете рассмотреть возможность использования этого, просто потому, что он позаботится о поточной части для вас.

2 голосов
/ 12 ноября 2011

Это может быть старая тема, но я думаю, что это может помочь другим. Вот хороший урок, который я нашел по использованию SurfaceView: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

А вот хорошая статья о том, как реализовать игровой цикл, который может помочь ограничить FPS 30: http://www.koonsolo.com/news/dewitters-gameloop/

Вы можете добавить текст прямо в свой SurfaceView, если хотите, Вот пример

public void onDraw(Canvas canvas) {
    ...
    // Add text
    Paint paint = new Paint(); 
    paint.setAntiAlias(true);
    paint.setFakeBoldText(true);               // if you like bold
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);             
}
...