我遇到了一个问题,我的应用程序需要在运行时动态加载图像。最终这是一个问题,因为无法预先加载所有内容,因为我不知道将使用哪些内容...否则,我必须上传所有内容。问题在于某些人没有好的PC,并且一直抱怨由于硬件问题而将所有图像加载到GPU上需要很长时间。
对于后一组,我的工作是根据需要上传纹理,这在大多数情况下都是有效的。问题在于,在应用程序中,有时需要延迟上传一系列图像的时间,并且由于上传而存在延迟。
我正在研究如何解决此问题,我有一个想法:用户希望获得流畅的体验,并且如果没有立即加载而是没有纹理,则可以。这很容易,因为我可以在后台上载,然后就对象应该放置的位置什么都不画,然后在完成后将其变为现实。这是可以接受的,因为无论如何,上载通常都非常快,但是它们的速度很慢,以至于某些人的上载速度会低于60 fps,这会造成结结。平均而言,它会造成1-3帧的停顿,因此上传文件的解析速度很快,平均不到50ms。
我的解决方案是尝试使用PBO进行一些类似异步的上传。问题是我无法在线找到上载完成时间的方法。有办法吗?
我认为有四个选项:
这引出我一个问题:我可以告诉何时异步将像素上传到纹理吗?
答案 0 :(得分:2)
Fence sync objects告知以前发出的 all 条命令何时完成执行。这包括异步像素传输操作。因此,您可以在传输后发布围栏,并使用同步对象工具检查完成的时间。
您这里遇到的烦人的问题是,它的粒度非常粗。测试围栏还包括测试是否还完成了任何非传输命令,尽管事实上这两个操作可能是由独立的硬件处理的。因此,如果在开始传输之前渲染的帧之前传输完成,则仍然不会设置围栅。但是,如果一次触发大量纹理上传,则传输操作将主导结果。