【发布时间】:2020-12-04 18:20:33
【问题描述】:
这个问题有点抽象,但我在这里很困惑,所以我想我会问。
上下文
我使用 OpenGL 从模拟器渲染内容,然后从 GPU 内存读取帧缓冲区并将其写入 CPU。当我使用 glGetTexImage 从 GPU 内存中读取帧缓冲区时,我遇到了这个问题。 Here is the code 如果你真的想深入,有问题。
问题
有些东西阻止了我在虚幻引擎中调用 glGetTexImage(将纹理从 gpu 内存复制到 cpu 内存)。我使用的渲染器和线程与虚幻引擎使用的不同,所以我认为它不会冲突。我认为这与引擎如何与渲染线程同步有关。我在下面有一些证据。
证据与理论
y 轴是每次调用所花费的时间(以毫秒为单位),x 轴是实时的。绿色图表是我给glGetTexImage 的电话。蓝线是游戏线程处理一帧的时间,红线是渲染线程处理一帧的时间。在此示例中,我完全受 GPU 限制,游戏线程只是根据分析器(未显示)为渲染线程停止。根据该图,glGetTexImage 似乎已停止,直到大约 一两帧被渲染。我知道在Unreal Engines documentation 中是这样说的
在虚幻引擎 4 (UE4) 中,整个渲染器以自己的方式运行 游戏线程后面一两帧的线程。
任何指导都会有所帮助
如果您有任何想法或建议,我真的不希望有人确切地知道这里出了什么问题,我很高兴听到它。我不知道在虚幻引擎渲染一两帧之前,有什么机制会停止对glGetTexImage 的调用。这两个渲染器在它们的操作中是完全互斥的,我真的不确定一个渲染器如何影响另一个渲染器的操作。根据我的图形驱动程序的工作方式或其他原因,这可能是一种副作用。我尝试将 DirectX11 和 Vulkan 用于 Unreal Engine 渲染器,它们都会导致相同的问题。如果有人对正在发生的事情有任何想法或知道任何可以诊断阻塞调用的良好调试工具,我将不胜感激。
【问题讨论】:
标签: opengl synchronization unreal-engine4