【问题标题】:What could be blocking glGetTexImage in Unreal Engine?是什么阻止了虚幻引擎中的 glGetTexImage?
【发布时间】: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


    【解决方案1】:

    在将控制权返回给您的 CPU 之前,任何需要指向客户端内存的指针的 OpenGL 函数都必须完成对该指针的访问。因此,当您在已渲染到的图像上调用 glGetTexImage 时,GPU 必须得出整个渲染过程的结论,然后将渲染的数据复制到您的内存中。

    尽管您有不同的线程向 GPU 发送工作,但 GPU 本身可能在任何特定时间只能完成一组工作。因此,它可能会在它认为合适的情况下交错执行工作,并且来自一个来源的工作竞争可能必须等待来自另一个来源的工作完成。

    因此,如果 UE 和您自己向 GPU 发送一些渲染命令,则 UE 工作可能首先到达那里。这意味着当您等待工作完成时,在等待 UE 工作完成。

    即使 GPU 确实允许同时完成多个工作队列,UE 的工作仍然会从您的工作中消耗一些 GPU 资源。它将使用您的工作可能使用的着色器执行单元和 ROP。

    简而言之,如果glGetTexImage 调用没有受到 UE 工作的影响,我会更加惊讶。

    如果您需要避免停止 CPU 线程,则需要从渲染目标执行异步读取。这意味着将pixel transfer 写入a buffer object,然后等待checking a fence sync object 完成传输,然后才从缓冲区读取数据。

    【讨论】:

    • 谢谢你,你是救生员。我真的很感激。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2018-09-01
    • 2022-07-17
    • 2015-01-13
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多