【问题标题】:The concept of 'sending' data to the GPU in OpenGL ESOpenGL ES 中“发送”数据到 GPU 的概念
【发布时间】:2017-05-13 03:01:02
【问题描述】:

我只在台式计算机上使用过 Direct3D 和 OpenGL,我的脑海中有这样一个概念,即每当需要更新缓冲区时,您需要通过 glBufferData()/glBufferSubData() 等调用将此数据发送到 GPU,并且应该不惜一切代价尽量减少这种事情。

由于 OpenGL ES 适用于手机等嵌入式系统,而且我认为这些设备没有专用的 GPU RAM,我想知道如果在一台设备 (Android) 上与另一台设备 (Android) 上编译,这样的 API 调用是否会做完全不同的事情设备(Windows 台式计算机)。无论是在 OpenGL 还是 OpenGL ES 上,这些调用看起来都是相同或相似的,我想知道我是否在 Windows 上编写我的程序,它是否可以在移动设备上运行。我的猜测是,在移动设备上,这些函数调用会将数据加载到系统 RAM 中,而在台式机上,如果 GPU 可用,它将被发送到 GPU RAM。

如果是这种情况,那么移动设备是否有优势,因为数据只保存在一个地方,从不发送到其他任何地方(即,发送到 GPU)?

【问题讨论】:

    标签: mobile graphics opengl-es gpu


    【解决方案1】:

    唯一显着的区别是,在一种情况下,通过 PCIe(桌面)进行 DMA 传输,在另一种情况下,它只是系统 RAM(移动)中驱动程序拥有的缓冲区的 memcpy。

    在这两种情况下,它都可能相对昂贵(例如,内存分配、数据复制,以及在某些系统上可能需要维护缓存),因此仍应尽可能减少它。在游戏关卡开始时将资源上传到所需的任何位置,然后从那时起引用它们,效率要高得多。

    【讨论】:

    • 请注意,他们不太可能使用 DMA 将智能手机内存从一个缓冲区复制到另一个缓冲区。这样它就不会在进行复制时占用 CPU。但是,它可能会减慢内存访问速度(即,通常为 CPU 保留的内存周期将与该 DMA 共享——与 GPU 使用的周期相反,后者肯定与 CPU 交错。)
    • 在芯片组上会有所不同,但是对任意客户端内存进行 DMA 处理会很痛苦,除非您拥有完全一致的共享页表。仅设置映射和固定页面本身就很昂贵。这是可能的,但在移动设备上还不常见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多