找回密码
 立即注册
查看: 680|回复: 0

Unity2019.3 使用DXR的崩溃问题

[复制链接]
发表于 2020-12-16 09:41 | 显示全部楼层 |阅读模式
(声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,推荐大家购买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了。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 06:29 , Processed in 0.140650 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表