Android SurfaceView 的低 FPS

Car*_*les 5 android frame-rate bitmap surfaceview

我在使用 SurfaceView 时遇到了一些帧速率问题。我正在做我在一些教程中找到的典型内容(所有教程都说一样),但我无法在我的三星 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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

在surfaceView中,我用holder.setFormat(PixelFormat.RGBA_8888)初始化持有者;但我不知道是否必须对位图做一些事情以避免无用的 CPU 工作(我将位图保存在局部变量中,然后绘制它们)。游戏很简单,运行起来应该更快。

帧速率是相当随机的,有时可以正常工作,有时则不能,但总是低于 30FPS。

有任何想法吗???

编辑 ONDRAW 解释

@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
}
Run Code Online (Sandbox Code Playgroud)

1) 绘制背景 (480x800) 2) 这是一个类,其中包含“getHeight()”基本对象(星星)及其坐标 (x,y) 和关联图像的 ID(大约 9 个不同的星星图像)列表) 3) 它绘制 n*2 个圆圈,一个带有填充,另一个带有每个相关对象的描边(大约 20 个左右) 4) 它绘制游戏的主要对象,带有动画的小水滴。有 9 种不同类型的水滴,每个水滴都有 5 个相关的动画图像(我应该将 5 个图像放入 1 个中吗?) 5)与水滴相同,但没有动画 6 到 10)不相关,它只是绘制一个图像

我猜速度慢是由于:(2)因为星星的数量(4)因为动画,女巫每2-3帧更改为不同的图像,也许它对内存来说太多了,我想我应该合并所有图像都集中在 1 中。

S. Galaxy S i9000 的帧速率约为 20-22 FPS

pea*_*sea 3

如果禁用绘图,您能达到多少 fps?只是为了检查显示管道占用了多少。

我尝试过创建 5 个尺寸为 720 x 480 的位图:pix 格式 RGB565 从与您类似的循环将它们显示在 SurfaceView 上。唯一的区别是我有“准备好的位图”并且没有循环绘制它们。这是在 Nexus-S 手机上实现的结果

FPS:55(我尝试以最快的速度运行循环,无需调节)

CPU负载:85%

这是我决定从 JNI 渲染我的 SurfaceView 的时候:)!!

做一个类似的实验,看看你的设备在“没有”绘图操作的情况下能够限制多少。如果看起来不错,那么您可以分析是否可以在预算范围内适应您的绘图操作。