OpenGL渲染/更新循环问题

OpenGL渲染/更新循环问题,opengl,Opengl,我想知道图形(/游戏)引擎是如何处理大量异构数据的,而定制的简单渲染循环在您进行一些小更改时会变成一场噩梦 例如: 首先,假设我们的场景中有一些块 图形引擎:创建立方体并移动它们 自定义:为顶点、法线等创建立方体模板。复制并将其转换到位置,然后进行复制(例如在vbo中)。一个glDraw*呼叫就可以完成任务 第二,一些奇怪的逻辑。我们要1号、4号、7号楼。。。要在x轴上旋转,请选择2、5、8、。。。在y轴上,在z轴上,旋转速度与相机距离成线性关系 图形引擎:操纵对象的矩阵并使其工作 定制:(我认

我想知道图形(/游戏)引擎是如何处理大量异构数据的,而定制的简单渲染循环在您进行一些小更改时会变成一场噩梦

例如:

首先,假设我们的场景中有一些块

  • 图形引擎:创建立方体并移动它们
  • 自定义:为顶点、法线等创建立方体模板。复制并将其转换到位置,然后进行复制(例如在vbo中)。一个glDraw*呼叫就可以完成任务
  • 第二,一些奇怪的逻辑。我们要1号、4号、7号楼。。。要在x轴上旋转,请选择2、5、8、。。。在y轴上,在z轴上,旋转速度与相机距离成线性关系

  • 图形引擎:操纵对象的矩阵并使其工作
  • 定制:(我认为)每个对象glDraw*调用改变模型矩阵的一致性不是一个好主意,所以转换矩阵应该类似于属性?我必须每帧更新一次
  • 第三,如果到摄影机的距离小于任何常量值Q,则块应消失

  • 图形引擎:if(对象。距离(摄影机)
  • 定制:(我认为)我们的vbo无效,我们必须重新创建它
  • 再回到第一句话:感觉引擎做这些操作是免费的,而我们必须重新考虑如何提供和更新数据。当我们这样做的时候,引擎(可能,但我实际上不知道)会说:“更新你想要的任何东西,至少我会发送所有矩阵。”

    另一个例子:基于体素的世界(例如Minecraft)怎么样?在这个世界中,我们只绘制可见表面,并且我们能够投掷炸弹并摧毁许多体素。如果世界视图数据位于一个巨大的缓冲区中,我们只有一个glDraw*-调用,但每次都必须重新创建缓冲区。如果有更小的块,我们有许多glDraw*-调用,还必须操作更小的缓冲区

    那么,发送10MB的缓冲区更新数据,而不是发送1MB的2个gl*-调用,这是否划算呢?有多少更新是可以的?渲染循环应该处理延迟更新吗

    我正在寻找一个指南,一个60fps的应用程序应该能够更新/绘制每帧,以了解什么是可能的。对于我的测试,每次优化尝试都是另一个瓶颈

    我不想让那些教程说:嘿,有一个新的很酷的gl*实例调用,它非常快,但是你必须检查你的gpu是否支持它。首先,我也认为这是一个优化,而不是一个有意义的实现。

    您是否有任何想法、来源、最佳实践或经验法则,说明渲染/更新例程如何最好地协同工作

    我的问题几乎都是一样的:

    • 在今天的硬件上,每帧可以更新多少次
    • 我是否可以延迟加载数据,以便在几帧后保存数据,但不冻结我的应用程序
    • 如果距离下一次渲染还有几微秒的时间,我是否必须进行小更新并评测我的循环
    • 也许我应该实现一个实时分析器,随着时间的推移,它会感觉到更新有多昂贵,并且可以确定每帧的更新量

    谢谢。

    您的问题与“图形引擎”和“定制”示例之间的关系尚不清楚。最终,您使用“图形引擎”所做的所有更新都会转换为那些OpenGL调用

    简言之:

    在今天的硬件上,每帧可以更新多少次

    如今的PCIe带宽非常巨大(可以高达30 GB/s)。但是,要完全利用它,您必须通过整合OpenGL调用来减少事务数。更新的确切数量完全取决于硬件、驱动程序和使用它们的方式,而图形硬件是多种多样的

    这是您不想听到的答案,但不幸的是,您必须面对事实:为了减少OpenGL调用的数量,您必须使用较新版本的API。例如,与其单独设置每个统一,不如通过统一着色器缓冲区对象提交一组统一。与其单独提交每个模型的每个MVP,不如使用实例渲染。等等

    一个更激进的方法是转向一个较低级别(更新)的API,即Vulkan,其目的正是为了解决这个问题:向GPU提交工作的成本

    我是否可以延迟加载数据,以便在几帧后保存数据,但不冻结我的应用程序

    是的,您可以异步上载缓冲区对象。有关详细信息,请参阅

    如果距离下一次渲染还有几微秒的时间,我是否必须进行小更新并评测我的循环

    也许我应该实现一个实时分析器,随着时间的推移,它会感觉到更新有多昂贵,并且可以确定每帧的更新量


    如果异步执行,则不需要这些问题。

    不清楚您的问题与“图形引擎”与“自定义”示例之间的关系。最终,您使用“图形引擎”所做的所有更新都会转换为那些OpenGL调用

    简言之:

    在今天的硬件上,每帧可以更新多少次

    如今的PCIe带宽非常巨大(可以高达30 GB/s)。但是,要完全利用它,您必须通过整合OpenGL调用来减少事务数。更新的确切数量完全取决于硬件、驱动程序和使用它们的方式,而图形硬件是多种多样的

    这是您不想听到的答案,但不幸的是,您必须面对事实:为了减少OpenGL调用的数量,您必须使用较新版本的API。例如,与其单独设置每个统一,不如通过统一着色器缓冲区对象提交一组统一。与其单独提交每个模型的每个MVP,不如使用实例渲染。等等

    e