【问题标题】:Display List generation显示列表生成
【发布时间】:2009-10-31 15:34:32
【问题描述】:

我正在开发一个使用 OpenGL 提供的显示列表的应用程序。我的想法是为重复性任务调用显示列表,例如转换和服务器状态集。 实际上,该实现允许每个可渲染对象有两个显示列表。在这两种情况下,显示列表不包含顶点、法线等,而只包含矩阵和服务器状态。

我现在的问题是如何决定何时生成显示列表:在某些情况下,生成显示列表的属性可能会发生变化,从而导致显示列表的新编译(想想鼠标移动会旋转对象)。

仅当在 N 个渲染循环中未更改属性时才生成显示列表是否合适?如何量化这个 N?我应该禁用临时特定的显示列表吗?

注意:可以在 Renderable (187:201) 和 RenderState (315:356) 找到源代码。抱歉识别(我认为这是我的 VS ......)我现在才注意到。 :(

OT:如何重新格式化唯一标识? :)

【问题讨论】:

    标签: c# performance opengl rendering


    【解决方案1】:

    说实话,我建议不要使用显示列表。它们已被 OpenGL 标准弃用。相反,您应该使用顶点缓冲区(查看glDrawArraysglDrawElements)。

    然后,您不必担心重新生成显示列表,只需设置顶点数组即可。

    【讨论】:

    • 我已经使用了缓冲区对象。在仅 OpenGL 3 的实现中,可以排除显示列表管理,但在大多数卡上,显示列表允许避免大量 PInvoke;此外,还可以有效地显示缓存命令和数据列表,从而提高渲染性能(例如,在光照期间预先计算逆矩阵)。
    • 您是否测试过您确实获得了性能提升?这取决于很多事情;此外,您可以(如果您对性能感兴趣,可能应该)自己预先计算和存储光照矩阵。
    • 每帧绘制相同的简单场景(棋盘)100次,应用程序在没有显示列表的情况下需要3,31秒;而启用显示列表需要 2.74 秒,从而加快了 15%(并且应用程序仅对两种服务器状态使用显示列表)
    【解决方案2】:

    请记住,答案并未考虑是否使用显示列表。 (编辑:显示列表可以在旧系统上使用,并且可以提高这些系统的性能)。

    N 数量应与存储在显示列表中的数据数量成正比。显示列表的重新编译应在显示列表中包含的数据发生变化时进行,但如果数据变化频繁,则重新编译过程可能会延迟到验证数据稳定为止。

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多