使 GL 纹理异步上传并弄清楚何时完成上传



>我遇到了一个问题,我的应用程序需要在运行时动态加载图像。这最终成为一个问题,因为不可能预先加载它们,因为我不知道将使用哪些......否则我必须上传所有内容。问题是有些人没有好的PC,并且一直在抱怨由于硬件不好,将所有图像加载到GPU需要很长时间。

我对后一组的解决方法是根据需要上传纹理,这在很大程度上是有效的。问题是,在申请过程中,有时需要上传一系列图像时会出现延迟,并且由于上传而出现延迟。

我正在研究如何解决这个问题,我有一个想法:用户想要流畅的体验,如果纹理没有立即加载而是不存在,也可以。这很容易,因为我可以在后台上传,然后不绘制对象应该在的位置,然后在完成后将其存在。这是可以接受的,因为无论如何上传通常都很快,但它们足够慢,以至于某些人会将其降至 60 fps 以下,从而导致一些卡顿。平均而言,它会导致 1-3 帧卡顿,因此上传确实可以快速解析,平均不到 50 毫秒。

我的解决方案是尝试使用 PBO 进行一些类似异步的上传。问题是我无法在网上找到如何判断上传何时完成。有没有办法做到这一点?

我认为有四种选择:

  1. 有一种方法可以在OpenGL 3.1以后做我想做的事情,那就是
  2. 不可能这样做(1(,但我可以放置一个围栏,然后检查围栏是否完成,但是我以前从未这样做过,所以我不确定它在这种情况下是否有效
  3. 这是不可能的,但我可以假设所有内容都将在 50 毫秒<上传,并使用某种时间戳来判断它是否可绘制,只是希望是这样(如果时间>
  4. 纹理上传无法做到这一点,我被困住了

这让我想到了我的问题:我能知道何时将像素异步上传到纹理吗?

防护同步对象告知所有先前发出的命令何时完成其执行。这包括异步像素传输操作。因此,您可以在传输后发出围栏,并使用同步对象工具检查何时完成。

你在这里遇到的烦人的问题是它非常粗粒度。测试防护还包括测试是否有任何非传输命令也已完成,尽管这两个操作可能由独立的硬件处理。因此,如果在开始传输之前渲染的帧完成传输完成渲染之前完成传输,则仍然不会设置围栏。但是,如果您一次启动大量纹理上传,那么传输操作将主导结果。

最新更新