Низкий FPS с Android SurfaceView - PullRequest
       35

Низкий FPS с Android SurfaceView

4 голосов
/ 28 ноября 2011

У меня есть некоторые проблемы с моей частотой кадров, используя SurfaceView. Я делаю типичные вещи, которые я нашел в некоторых уроках (все они сказали то же самое), но я не могу достичь приличной частоты кадров на моей Samsung Galaxy S (старая, i9000).

Вот код, который у меня есть для потока цикла. FPS инициализируется в 30.

@Override
public void run() {
    long ticksPS = 1000/FPS;
    long startTime;
    long sleepTime;
    //fps checker
    long contms=0;
    long lasttimecheck = System.currentTimeMillis();
    int fps=0;
    while (running) {
        long time =  System.currentTimeMillis();
        if(contms>1000) {
            Log.v("FPS",String.valueOf(fps));
            contms=time-lasttimecheck;
            fps=1;
        }
        else {
            fps++;
            contms+=time-lasttimecheck;
        }
        lasttimecheck = time;

        Canvas c = null;
        startTime =time;
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }
        } finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
        sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 10)
                   sleep(sleepTime);
            else {
                Log.w("LOWFPS",String.valueOf(contms));
                sleep(10);
            }
     } catch (Exception e) {}
    }
}

В SurfaceView я инициализирую держатель с holder.setFormat (PixelFormat.RGBA_8888); но я не знаю, нужно ли мне что-то делать с растровыми изображениями, чтобы избежать бесполезной работы процессора (я сохраняю растровые изображения в локальных переменных, затем рисую их). Игра проста, она должна работать намного быстрее.

Частота кадров довольно случайная, иногда она работает смузи, иногда нет, но всегда ниже 30FPS.

Есть идеи ???

РЕДАКТИРОВАТЬ С ОБЪЯСНЯТЬ ОБЪЯСНЕНИЕ

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(bg, 0, 0, null); //1
    stars.draw(canvas,dx,dy);      //2
    if(playing.on()) reactors.draw_reaccio(canvas,dx,dy); //3
    gotes.draw(canvas,dx,dy);     //4
    reactors.draw(canvas,dx,dy);  //5
    sg.draw(canvas);  //6         
    sr.draw(canvas);  //7
    eraser.draw(canvas);  //8
    playing.draw(canvas); //9
    opcions.draw(canvas); //10
}

1) Рисование фона (480х800) 2) это класс, который содержит список базовых объектов (звезд) getHeight () с его координатами (x, y) и идентификатор связанного изображения (около 9 различных изображений звезд) 3) он рисует n * 2 окружностей, один с заливкой, а другой с обводкой на связанный объект (около 20 или около того) 4) Рисует основной объект игры, маленькие капли с анимацией. Есть 9 различных видов капель, и у каждого из них есть 5 связанных изображений анимации (я должен поместить 5 изображений в 1, может быть?) 5) так же, как капли, но без анимации 6-10) не имеет значения, просто нарисуйте изображение

Я полагаю, что медлительность вызвана: (2) из-за количества звездочек (4) из-за анимации, каждые 2-3 кадра меняются на другое изображение, и, возможно, это слишком много для памяти, я думаю я должен объединить все изображения всего за 1.

Частота кадров составляет около 20-22 кадров в секунду с S. Galaxy S i9000

Ответы [ 2 ]

3 голосов
/ 02 января 2012

Если вы отключите рисунок, сколько кадров в секунду вы достигнете? Просто чтобы проверить, насколько сильно работает конвейер отображения.

Я пытался следовать создать 5 растровых изображений размером 720 x 480: пиксельный формат RGB565 отобразить их на SurfaceView из цикла, похожего на ваш. Разница лишь в том, что у меня были «подготовленные растровые изображения», и я не рисовал их в цикле. Это то, что было достигнуто на телефоне Nexus-S

FPS: 55 (я пытался запустить цикл так быстро, без регулировки)

Загрузка процессора: 85%

Это когда я решил визуализировать свой SurfaceView из JNI :) !!

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

0 голосов
/ 05 января 2012

На что нужно обратить внимание: Как долго вы рисуете рутину?

Если у вас есть проблемы с ней, работающей со скоростью менее 30 FPS, я бы пересмотрел, что она спит.Это не совсем то, что может спать меньше или больше в соответствии с API, поэтому я бы удалил это сейчас и позволил бы ему работать как можно быстрее.

Я согласен с выше, пожалуйста, опубликуйте код для рисования илизакомментируйте его в вызове процедуры отрисовки и посмотрите, на каком FPS вы работаете.

В общем, с точки опроса выборки вы можете увидеть его дрожание в значении, если оно измеряется только в течение 1 секунды.

Многие отрисовки на концах работают только с делителями, равными 60. Поэтому, если вы делали много вещей, возможно, один или два дополнительных вызова приведут вас от 60/1 = 60 к / с до 60/2 = 30 к / с.

...