繁体   English   中英

使用Android SurfaceView的低FPS

[英]Low FPS with android 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) {}
    }
}

在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
}

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

如果禁用绘图,你实现了多少fps? 只是为了检查显示管道的占用量。

我曾尝试过创建大小为720 x 480的5位图:像素格式RGB565在类似于你的循环中在SurfaceView上显示它们。 唯一的区别是我有“准备好的位图”而没有在循环中绘制它们。 这是在Nexus-S手机上实现的

FPS:55(我试图快速运行循环,没有规定)

CPU负载:85%

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

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

需要考虑的事项:你画了多长时间的常规服用?

如果你在30 FPS下运行有问题,我会重新考虑让它睡觉。 这不是一个确切的事情,根据API可以睡得更少或更多,所以我暂时删除它,让它尽可能快地运行。

我同意上述内容,请发布绘图代码或将其注释到绘图程序的调用中,看看你正在运行的FPS。

通常,从采样的角度来看,如果测量时间超过1秒,您可能会看到它的抖动值。

许多后退端只能在60的除数中工作。所以如果你做了很多东西,可能会有一两个额外的调用将你从60/1 = 60 fps带到60/2 = 30 fps。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM