心随674 发表于 2020-12-16 09:41

Unity2019.3 使用DXR的崩溃问题

(声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,推荐大家购买Unity正版源码)
从Unity2019.3开始,可以用RayTracing来做一些事情,比如我用来做遮挡剔除的pvs构建。
照着例子写好代码,开始跑后,就会发现一个问题,跑着跑着unity就崩溃了,(网上有个同学的例子,全速跑崩溃,一个一个点不会)基本是在这个地方:
CreateDescriptorHeap failed (xxxx)
其实也就是显存被耗光了,可以用一些辅助软件看下,如gpu-z这种,可以看到Memory used 差不多到5g-6g左右,就会崩溃。明显的资源泄漏,所以看下原因。
跟了一圈源代码发现了问题,其实unity是做了资源pool的,每个任务都有fence。他在每次做完Ray tracing后,AfterDispatch会把资源Push到pool,但是会带上这个fence。这个时候,工作不一定做完了的,他在等Freeup的时候,会被传进一个completefence参数,如果队列中的fence小于这个completefence的,表明工作做完了,然后会放到free队列,给后面的Ray tracing操作使用,不然每次来申请的时候,都会new新的资源给你。
   那么问题来了,Unity是在哪里释放资源,调用这个Freeup的呢,答案就是PresentFrame(),这个里面会wait fence完成,完事后就会一堆各种资源的释放。
   所以,各位同学,做DXR的时候,不要蒙头一直冲,要起来渲染跑一下,不然你资源始终没被放,就等着gg了。简单点就是搞个Coroutine吧,舒缓释放一下Unity的资源压力,测试了下,跑起来已经没问题了,但是注意,性能可能就损失了。其实大家也可以看到,computer shader应该也是一样的,unity应该都安排大家一帧一帧跑,不是作为工具类直接干倒。
另外,如果有源代码的同学,可以考虑自己搞个接口函数出来,然后前面部分都是一样照抄,后面可以用EndBatchModeUpdate的模式来做。
这样就不用等渲染,直接执行命令了
仅供参考
===================2020.4.30========================
今天发现一个问题,如果全速跑得话,有可能会导致一个问题,就是大家不知道有没有注意,那个RayTracingAccelerationStructure,如果我们全速跑,一般是accStruct.Release();用完了么,当然要释放,但是这里有问题问题,这个Release得源码是直接删除native 指针的。所以如果前面是走得线程得话,这里有可能会出现问题,所以我现在是加了一句这个WaitOnCpuFence
在这里等cpu端得命令执行完毕掉,这样后面得删除就没关系了,已经upload到gpu了。
页: [1]
查看完整版本: Unity2019.3 使用DXR的崩溃问题