unity源码调试D3D Error问题
( 声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,否则自行承担所有法律后果,郑重推荐大家购买Unity正版源码 )
1.问题
在unity build出来后,有时候经常会碰到一些dx的问题,特别是dx12, 经常会各种崩溃出现,原因是device removed, 任何不对的地方,dx12都会导致device remove, 然后 unity源码里有这个GetVersionInternal()函数就会返回NULL,导致后续所有相关的资源调用啥的,就会崩溃了。具体的大家可以看下源码。
但是dx12的崩溃不是说发生了dx error就会崩溃的,它的崩溃是延后的,所以等崩溃的时候,前面可能报了很多d3d error了,还可能有一堆的com_error, 包括崩溃的栈其实也不是最初的原因,所以我们需要一个方式,能在第一个d3d error发生的时候,能断点到那里,如果有源码,最好能对应到源码的对应的地方,这样
我们才可能有效的进行调试和修改。
2.方法
在请教过大佬后,总结下方法如下,以方便新人。
2.1安装Directx SDK
这个是必须要安装的,目前地址在: https://www. microsoft.com/en-us/dow nload/details.aspx?id=6812 ,装好后大家可以在vs上看到菜单上有这个
2.2开启debug layer
unity默认是关闭debug layer的,所以要启动调试,
需要在启动命令行上加上 -force-d3d12-debug/-force-d3d12-debug-gbv
gbv调试的作用大家可以看微软文档,但目前有些显卡加了gbv会卡住起不来,大家看情况用吧
2.3.设置dx配置
安装好dx sdk后,我们可以从2.1的菜单上直接启动directx 的控制面板
这里注意下,如果没有安装dx sdk, 可能也可以从windows的sdk上有找到dx的控制面板,但是可能启动后,没有dx12的,这样是不能调试dx12的error的,这里耽搁了点时间。
2.4.加入exe到Edit List
这个步骤必须要做,不然不会管你这个exe的
2.5.使用develop 版本或者用源码启动
如果能源码启动的,就可以直接源码启动在editor里面调试,但是很多时候,editor和winplayer里会有不一样,所以也可以build develop版本,然后用vs attach上去,也是可以调试的
2.6 设置com错误断点
这个是常用的设置方式,
3.总结
目前来说,unity对dx12的支持还是实验阶段,有些地方可能还是会莫名的崩溃(当然大部分可能代码或者shader写的比较随意导致),所以我们尽可能的把所有d3d error的都解决掉,这样才能使得我们的程序比较稳健。d3d11有些时候会屏蔽掉一些错误或者内部解决掉了,
但是在d3d12的时候就会全部暴露出来的,大家还是一个一个解决掉比较好。