优化 iPhone OpenGL ES 填充率

2024-02-28

我的 iPhone 上有一个 Open GL ES 游戏。我的帧率很糟糕,~20fps。在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具,它显示:

渲染器利用率:95% 至 99%

瓷砖利用率:~27%

我正在绘制很多非常大的图像并进行大量混合。如果我减少绘制的图像数量,帧速率会从 ~20 变为 ~40,但性能工具结果保持大致相同(渲染器仍然达到最大值)。我认为我受到了 iPhone 3G 填充率的限制,但我不确定。

我的问题是:如何更详细地确定瓶颈在哪里?这是我最大的问题,我只是不知道是什么在持续。如果是填充率,除了减少绘制之外,我还能做些什么来提高它吗?

我正在使用纹理图集。我尝试最小化图像绑定,尽管这并不总是可行(绘制顺序、并非所有内容都适合一个 1024x1024 纹理等)。每帧我都会进行 10 个图像绑定。这看起来很合理,但我可能是错的。

我正在使用顶点数组和 glDrawArrays。我确实没有太多的几何知识。如果需要的话我可以尝试更精确。每个图像都是 2 个三角形,我尝试对可能的事情进行批处理,尽管通常(也许一半的时间)图像是使用单独的 glDrawArrays 调用绘制的。除了图像之外,我还有大约 60 个三角形的几何体在大约 6 个 glDrawArrays 调用中渲染。我经常在调用 glDrawArrays 之前进行 glTranslate。

切换到 VBO 会提高帧速率吗?我不认为这是一个巨大的几何体量,但也许由于其他原因它更快?

是否需要注意某些可能会降低性能的事情?例如,我应该避免使用 glTranslate、glColor4g 等吗?

我在每帧 3 个位置使用 glScissor。每次使用都包含 2 次 glScissor 调用,一次用于设置,一次将其重置为原来的状态。我不知道这里是否对性能有很大影响。

如果我使用 PVRTC 渲染速度会更快吗?目前我所有的图像都是 GL_RGBA。我没有记忆力问题。

我的全屏纹理之一是 256x256。使用 480x320 是否会更好,这样手机就不必进行任何缩放?对于纹理大小还有其他一般性能建议吗?

这是我正在绘制的内容的粗略想法,按以下顺序:

1)切换到透视矩阵。 2)绘制全屏背景图 3)绘制一个半透明的全屏图像(这个有滚动纹理)。 4)画一些精灵。 5) 切换到正交矩阵。 6)画一些精灵。 7) 切换到透视矩阵。 8) 绘制精灵和其他一些纹理几何体。 9) 切换到正交矩阵。 10) 绘制一些精灵(例如游戏HUD)。

步骤 1-6 绘制一堆背景内容。 8绘制了大部分游戏内容。 10 绘制HUD。

正如您所看到的,有很多层,其中一些是全屏的,一些精灵非常大(屏幕的 1/4)。这些图层使用半透明,因此我必须按从后到前的顺序绘制它们。由于需要以正交方式绘制各个图层并以透视方式绘制其他图层,这使得情况变得更加复杂。

如果需要,我很乐意提供更多信息。预先感谢您提供有关我的问题的任何性能提示或一般建议!

Edit:

我添加了一些日志记录来查看我正在执行多少次 glDrawArrays 调用以及有多少数据。我每帧执行大约 20 次 glDrawArray 调用。通常,其中大约 1 到最多 6 个每个都有大约 40 个顶点。其余的调用通常只是 2 个顶点(一张图像)。我只是使用 glVertexPointer 和 glTexCoordPointer。


鉴于渲染器利用率基本上为 100%,这表明瓶颈在于填充、纹理和混合像素。旨在优化顶点处理(VBO 和顶点格式)或 CPU 使用(绘图调用批处理)的技术可能没有帮助,因为它们不会加快像素处理速度。

最好的选择是减少填充的像素数量,并查看不同的纹理格式,以更好地利用第一代设备上非常有限的内存带宽。尽可能使用 PVRTC 纹理,否则使用 16 位未压缩纹理。

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

优化 iPhone OpenGL ES 填充率 的相关文章

随机推荐

  • 在if语句中创建对象并稍后使用它

    我正在为中缀表示法编写一个解析器 在 if 语句中我声明了变量 newchild 否则我希望它抛出异常 但是当我超出范围时 编译器不再知道该变量 我不能在 if 语句之前声明它 因为根据我们所处的情况 该变量被分配了不同的数据类型 我可以做
  • 滚动经过一定数量的像素时位置固定

    我正在寻找一种方法 仅在向下滚动大约 170 像素后将页面的 header 元素定位为 固定 标题上方是一个横幅 因此当人们向下滚动时 我希望横幅滚动走 标题在到达窗口顶部时保持固定 页面内容在标题下方滚动 http jsfiddle ne
  • 节点 8.6 javascript 承诺:UnhandledPromiseRejectionWarning

    我有一个错误 节点 6186 UnhandledPromiseRejectionWarning 未处理的承诺拒绝 拒绝 ID 1 三p 节点 6186 DEP0018 DeprecationWarning 未处理的承诺拒绝已被弃用 将来 未
  • 当某些内容存储为数组时,Rails where 子句

    我正在运行 Rails 4 2 带有 PG 数据库 我有一个项目存储在数据库中 例如 模型Item something gt 1 2 3 我想得到Item where something include gt 3 显然这是行不通的 但是你打
  • 创建表语法在 hsql 中不起作用

    我是 hsqldb 新手 我正在开发简单的应用程序来获取用户的一些输入 因此搜索嵌入式数据库并发现 hsqldb 是满足我的要求的解决方案 我有一些创建表语法 但它抛出异常 此查询使用 Netbeans 数据库服务执行 Query CREA
  • iOS - Facebook 登录错误 - 构建 URL 时出现未知错误(com.facebook.sdk.core 错误 3)

    我正在使用 Facebook 登录我的 iOS 应用程序 该应用程序是为 iOS 8 及更高版本开发的 正在使用最新的Facebook SDK 我已遵循 Facebook 官方指南中描述的所有基本步骤 但是 当我单击登录按钮时 出现以下错误
  • 如何组织大型 Node.js 项目

    组织大型 Node js 项目有哪些好方法 例如 一个同时使用express js 和socket io 的应用程序 这将包括应用程序逻辑结构和文件系统 目前 我发现自己将大量代码放入一个主 js 文件中 并将代码放入一个巨大的全局对象中
  • Rails 3.1 强制使用 .html 而不是无扩展名

    我的一位客户希望他的新 Rails 应用程序看起来更像他的传统网站 他想知道我是否可以强制 url 具有文件扩展名 最好是 html 我不想对扩展进行硬编码routes rb as match controller action id ht
  • 难以通过网络蓝牙连接热敏打印机

    现在我正在开发能够连接热敏打印机的网络 我正在使用 Angular 框架 并且我使用库成功将热敏打印机与 USB 连接ng thermal printer 但我希望我的网络也能够通过网络蓝牙 BLE 蓝牙低功耗 连接热敏打印机 据我所知 B
  • 转换为乔姆斯基范式

    我确实需要你的帮助 我有这些作品 1 A gt aAb 2 A gt bAa 3 A gt 我应该应用乔姆斯基范式 CNF 为了应用上述规则 我应该 消除 产生式 消除单一生产 删除无用的符号 我立即陷入困境 原因是 A 是一个可为空的符号
  • 它仍然适用于在 RedHat7 上使用 pexpect 还是有替代方法来执行命令并响应提示?

    我尝试在 Redhat7 中使用 pexpect for ansible 但无法安装它 我只得到 pexpect noarch 2 3 11 el7 RHEL7 版本 或者 pexpect 是否有替代方法来执行命令并响应提示 看起来像的版本
  • 给定python代码的打印语句语法错误的原因是什么[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 编辑问题以包括期望的行为 特定问题或错误以及重现问题所需的最短代码 help minimal reproducible example 这
  • 将 Meteor 部署到 Android 设备时找不到构建工具修订版 24.0.1

    我错误地完全删除了 Android SDK 文件夹 之前我已经使用cordova phonegap多次将meteor部署到android设备上 当通过 Android Studio 重新安装 SDK 并尝试在设备中运行 Meteor 时 我
  • SQLAlchemy over MySQLdb 的目的

    为什么人们使用 SQLAlchemy 而不是 MySQLdb 它有什么优点 您不使用 SQLAlchemy 来代替 MySQLdb 您使用 SQLAlchemy 来访问 MySQLdb oursql 我听说更好并且性能更好的另一个 MySQ
  • Xcode 未反映来自 React-Native 的最新应用程序代码

    EDIT 好吧 事实证明这不是 AppStore 的问题 我从 Xcode 发布模式运行了应用程序 并且在模拟器上运行了相同的旧版本 我不知道为什么 但 Xcode 没有运行最新的 jsbundle 现在我发现this https stac
  • 在 Dart 中获取与正则表达式匹配的所有子字符串的最佳方法

    我想获取与字符串中的正则表达式匹配的子字符串列表 做这个的最好方式是什么 dart core 中的 RegExp 对象有Iterable
  • 用java下载包含资源(如图像)的完整网页

    有没有办法下载 html 网页及其所有资源 例如 图像 CSS 我知道如何使用 html 解析器通过遍历所有相关标签来做到这一点 但是没有easy way That is最简单的方法 困难的方法是编写自己的网络库 html 解析器等
  • SwiftUI 中 ObservedObject 和 StateObject 有什么区别

    如果我有一个ObservableObject在 SwiftUI 中我可以将其称为 ObservedObject class ViewModel ObservableObject Published var someText Hello Wo
  • 如何轻松分析 Oracle 包的执行是否存在性能问题?

    我在 11g R2 DB 中有一个 pl sql 包 它有相当多的相关过程和函数 我执行一个顶级函数 它做了很多事情 当前每秒处理 对于 Oracle 的 PL SQL 分层分析器 DBMS HPROF 来说 这似乎是一项不错的工作 作为一
  • 优化 iPhone OpenGL ES 填充率

    我的 iPhone 上有一个 Open GL ES 游戏 我的帧率很糟糕 20fps 在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具 它显示 渲染器利用率 95 至 99 瓷砖利用率 27 我正在绘制很多非常大的图