Android SurfaceView 的低 FPS

2023-12-29

我在使用 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? 只是为了检查显示管道占用了多少。

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

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

CPU负载:85%

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android SurfaceView 的低 FPS 的相关文章

随机推荐

  • 用于信标的 CoreBluetooth

    我有一个需要信标范围的项目 我查看了很多示例代码 它们都使用CLLocationManager and CLBeaconRegion 我的问题是didRangeBeacons每秒仅调用一次回调 尽管我没有找到任何专门针对信标的代码示例 但我
  • 如何在没有完成块的情况下在 NSURLSession 中获取服务器响应数据

    我在用NSURLSession用于背景图片上传 根据上传的图像 我的服务器给了我响应 我确实在我的应用程序中进行了相应的更改 但是当我的应用程序在后台上传图像时 我无法获得服务器响应 因为没有完成块 有没有办法在不使用完成块的情况下获得响应
  • iPhone 应用程序转换为 iPad? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想将我的应用程序转换为通用应用程序 谁能推荐一些好的教程来实现这一目标 我需要将 Interface
  • Node JS 插件 - NAN 与 N-API? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一个使用 Node js 插件和 C 的项目 我遇到了两个可以使用的抽象库 NAN 和 N API 但是我无法决定应该使用哪一个
  • 线程“main”中的异常 java.lang.NoSuchFieldError: DEF_CONTENT_CHARSET

    您好 我尝试从 java 应用程序中的 solr 数据库中索引一行 我已经添加了必要的罐子 但我不断收到此错误 我的 solr 模式是正确的 我发出请求只是将新行添加到我的数据库中 我也希望它被索引 这是错误 SLF4J Failed to
  • 如何从交互式图表中抓取 json 数据?

    I have a specific section of a website https understat com player 2097 that I want to scrape data from and here s the sc
  • 当屏幕上的数据正常时,在 CSV 文件导出中获取“System.Collections.Generic.List`1[System.String]”

    我是 PowerShell 新手 尝试从 Hyper V 中获取虚拟机名称及其关联 IP 地址的列表 我在屏幕上得到的信息很好 但是当我尝试导出到 csv 时 我得到的所有 IP 地址是System Collections Generic
  • Javadoc 无法识别文档标题选项/标志

    我通过 gradle 使用 doclet 运行 javadoc 当我运行 javadoc doclet 任务时 我收到下一个错误 error invalid flag doctitle 之后是下一个使用表 usage javadoc opt
  • 为什么 UILabel 没有初始化?

    代码来自斯坦福大学CS193p 我添加了一个 NSLog 来查看 标签似乎没有被初始化 任何想法 interface AskerViewController
  • 变量内部的 jQuery 选择器?

    您好 我正在尝试获取另一个 HTML 文件中具有特定类的所有 DIV 的 ID 要加载我使用的文件 get blocks html function data here I don t know how 现在我正在寻找这样的东西 data
  • 如何使用RelativeLayout实现以下结果?

    图片 http img838 imageshack us img838 1402 picse png http img838 imageshack us img838 1402 picse png 如何制作图中的布局 2 仅使用Relati
  • 按组从前一行减去值

    在 R 中 假设我有这个数据框 Data id date value 2380 10 30 12 21 01 2380 10 31 12 22 04 2380 11 1 12 22 65 2380 11 2 12 23 11 20100 1
  • Swing GroupLayout:调整大小和限制组件大小

    我在用着GroupLayout管理一些动态生成的数据输入表单中的组件 布局或多或少像这样 label A field A label B field B label C field C 我使用 2 个并行组进行水平布局 使用一个顺序组进行垂
  • UEFI引导加载程序

    我正在考虑开发一个简单的 首先 UEFI 引导加载程序来加载 ELF 映像 并且想知道是否有人有一个很好的切入点 可以进入任何现有项目 或者我可以用来开始使用的示例 另外 我想知道是否有人有让虚拟机运行 EFI 应用程序的经验 我已经设置了
  • 子进程会发生什么?

    如果子进程的父进程未经等待就突然终止 会发生什么情况 子进程也会死吗 孩子得到重新定义为init http en wikipedia org wiki Orphan process
  • linux Wayland 显示多用户

    我使用摇摆合成器 当我在控制台中更改用户时 我无法显示 wayland 图形界面 它与 X 应用程序一起使用 su otherUser myApplicationWayland error XDG RUNTIME DIR not set i
  • Windows 上的 Apache / PHP 因正则表达式而崩溃

    我发现以下 PHP 代码在 Windows Apache 服务器上运行时会崩溃
  • Google Firebase 功能部署失败 - 我该怎么办?

    错误信息 Error There was an error deploying functions firebase debug log 包含以下内容 debug 2021 11 16T12 12 16 165Z Error Failed
  • 如何在 NestJS 中提供静态图像

    我开始学习 MEAN 堆栈 当我访问 Express 时 我发现 Express 框架中存在一个额外的层 称为 NestJS 它拥有我想要的一切 并且具有类似 Angular 的语法 因此对我来说非常完美 但每一个新步骤都是一场噩梦 文档根
  • Android SurfaceView 的低 FPS

    我在使用 SurfaceView 时遇到了一些帧速率问题 我正在做我在一些教程中找到的典型内容 所有教程都说一样 但我无法在我的三星 Galaxy S 旧款 i9000 上达到像样的帧速率 这是我的循环线程的代码 FPS 初始化为 30 O