OpenGL ES 到 Metal - 性能瓶颈差异
OpenGL ES to Metal - Performance Bottleneck Differences
我一直在维护我自己的自定义 2D 库 - 用 Objective-C / OpenGL ES 2.0 编写- 有一段时间了,用于我的个人项目(未工作)。我也尝试过 cocos2d 和 SpriteKit,但最终选择了 "reinventing the wheel" 因为
- 很好玩,
- 知识方面,我宁愿成为可以编写图形库代码的人,也不愿成为只会使用图形库的人,
- 无限的定制可能性。
现在,我正在将我的代码库转换为 Swift 并且(除了在迁移到 class 继承让位于协议等的语言时出现的所有设计差异之外)我我在想,当我在做的时候,我也应该考虑过渡到 Metal。如果有的话,为了面向未来(另外,我完全赞成学习新技术,并且说实话 OpenGL/OpenGL ES 是一个非常混乱的 "legacy" 包和向后兼容性)。
我的库是围绕各种 OpenGL (ES) 特定的性能瓶颈设计的:使用纹理图集和网格合并来减少绘制调用,首先渲染不透明精灵,最后渲染半透明精灵(从后到前排序),等等
我的问题是:这些注意事项中哪些仍然适用于 Metal,哪些我什至不必费心实施(因为它们不再是性能问题)?
Metal 仅在 IOS 支持 OpenGLES3 的设备子集上可用,因此公平地说,您需要将 Metal 与 GLES3 进行比较。
纹理图集和网格整合:
使用 Metal,CPU 绘制调用的成本低于 GLES3,并且您可以在多个线程上并行设置绘制调用。
所以这可以让你跳过地图集和合并......但这些都是很好的做法,所以如果你将它们保留在 Metal 中并使用额外的 CPU 时间来做更多的事情会更好!
请注意,在 GLES3 中,通过使用实例化和纹理数组,您还应该能够摆脱地图集并保持较低的绘制调用次数。
首先渲染不透明精灵,最后渲染半透明精灵
Metal 对此绝对不会有任何改变,这是 PowerVR GPU 基于图块的延迟渲染器的限制,无论您使用什么驱动程序,它都不会改变 GPU 硬件。无论如何,无论您使用 DirectX、OpenGL 还是 Metal ...
,在进行 3D 时,推荐在半透明之前渲染不透明是继续进行的方法
如果您受限于填充率,金属将无济于事!
一般来说,Metal 只会给你 CPU 方面的改进。
我一直在维护我自己的自定义 2D 库 - 用 Objective-C / OpenGL ES 2.0 编写- 有一段时间了,用于我的个人项目(未工作)。我也尝试过 cocos2d 和 SpriteKit,但最终选择了 "reinventing the wheel" 因为
- 很好玩,
- 知识方面,我宁愿成为可以编写图形库代码的人,也不愿成为只会使用图形库的人,
- 无限的定制可能性。
现在,我正在将我的代码库转换为 Swift 并且(除了在迁移到 class 继承让位于协议等的语言时出现的所有设计差异之外)我我在想,当我在做的时候,我也应该考虑过渡到 Metal。如果有的话,为了面向未来(另外,我完全赞成学习新技术,并且说实话 OpenGL/OpenGL ES 是一个非常混乱的 "legacy" 包和向后兼容性)。
我的库是围绕各种 OpenGL (ES) 特定的性能瓶颈设计的:使用纹理图集和网格合并来减少绘制调用,首先渲染不透明精灵,最后渲染半透明精灵(从后到前排序),等等
我的问题是:这些注意事项中哪些仍然适用于 Metal,哪些我什至不必费心实施(因为它们不再是性能问题)?
Metal 仅在 IOS 支持 OpenGLES3 的设备子集上可用,因此公平地说,您需要将 Metal 与 GLES3 进行比较。
纹理图集和网格整合:
使用 Metal,CPU 绘制调用的成本低于 GLES3,并且您可以在多个线程上并行设置绘制调用。
所以这可以让你跳过地图集和合并......但这些都是很好的做法,所以如果你将它们保留在 Metal 中并使用额外的 CPU 时间来做更多的事情会更好!
请注意,在 GLES3 中,通过使用实例化和纹理数组,您还应该能够摆脱地图集并保持较低的绘制调用次数。
首先渲染不透明精灵,最后渲染半透明精灵
Metal 对此绝对不会有任何改变,这是 PowerVR GPU 基于图块的延迟渲染器的限制,无论您使用什么驱动程序,它都不会改变 GPU 硬件。无论如何,无论您使用 DirectX、OpenGL 还是 Metal ...
,在进行 3D 时,推荐在半透明之前渲染不透明是继续进行的方法如果您受限于填充率,金属将无济于事!
一般来说,Metal 只会给你 CPU 方面的改进。