【问题标题】:Optimise OpenGL ES 2.0 2D drawing using dirty rectangles使用脏矩形优化 OpenGL ES 2.0 2D 绘图
【发布时间】:2011-04-23 21:53:22
【问题描述】:

是否可以通过使用脏矩形来优化 OpenGL ES 2.0 绘图?

就我而言,我有一个 2D 应用程序需要绘制背景纹理(在 iPad 上为全屏),然后在每一帧上绘制几个 VBO 的内容。问题是这些 VBO 可能包含数百万个顶点,需要花费长达几秒钟的时间才能将所有内容绘制到显示器上。但是,实际上每帧只会更新一小部分显示。

这种优化是否可行,如何(或者更恰当地说,在哪里)实现?是否需要将某种剪裁平面传递到顶点着色器中?

【问题讨论】:

    标签: ios ipad optimization rendering opengl-es-2.0


    【解决方案1】:

    如果您使用glViewport 设置区域,则会相应地调整剪裁。然而,这发生在顶点着色器阶段之后,就在光栅化之前。由于 GL 无法知道您自己的顶点程序的结果,因此在应用顶点程序之前它无法对任何顶点进行排序。在那之后,它确实如此。它的效率取决于实际的 GPU。

    因此,您必须将对象分类并拆分为更小的(例如矩形有界)图块,并自行在视野范围内对其进行测试以获得完整性能。

    【讨论】:

    • 感谢您的回复。只是检查一下-您是说简单地调整视口会产生一些的性能优势;如果我想要最好的优化,我需要检查每个元素的边界,只绘制那些落在脏矩形内的元素?我是否认为片段着色器通常比顶点着色器使用更多的计算能力?当然,我会对此进行测试,但我想知道您是否知道我在裁剪阶段丢弃 95% 的顶点会获得什么样的收益?
    • 调整视口会消除大部分要绘制的片段。但是,GPU 旨在以不错的帧速率绘制整个屏幕,因此如果您处于“几秒钟”状态,这可能不是您的瓶颈。因此,设置视口是一个简单但薄弱的优化。所以我认为你需要在每次重绘时摆脱大部分顶点处理。您也不想通过 CPU 检查数百万个顶点。因此,一个简单的解决方案是将您的几何图形切成 64x64 像素的图块并仅绘制触摸的图块。
    • 大部分时间顶点被渲染(作为“画笔”笔触)到纹理,我很容易获得 60fps,但是我不时需要在每个顶点的基础上重绘笔触并执行模板测试。 “几秒钟”仅在从 VBO 绘制过多(用户定义)的顶点数量时发生,但是我希望尽可能将性能保持在 20fps 或以上。在这种情况下平铺此类数据并非易事(不同的纹理,可变大小的 VBO ......等),但我确信如果裁剪还不够,这将是。非常感谢您的帮助。
    猜你喜欢
    • 2013-07-11
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多