unity3d

出现d3d11问题导致编辑器崩溃

出现d3d11问题导致编辑器崩溃


升级到Unity 6,有时出现下面这种D3D11的问题,会导致编辑器崩溃。

在 Windows 系统中,当显卡由于长时间忙碌而被重置时,可能会导致这个不可恢复的错误。在部分情况下,如果不及时处理,还可能出现 BSOD(蓝屏死机)VIDEO_TDR_FAILURE 。如果检测到当前 TDR 值 低于 10 秒,就会弹出提示窗口。


为什么 GPU 驱动会崩溃?

为了防止渲染或 GPU 计算任务长时间占用系统,Windows 操作系统会在渲染时间超过几秒时强制终止 GPU 驱动。驱动被终止后,相关的应用程序会随之崩溃。

由于 GPU 渲染或计算任务的时间长短与多种因素有关(例如 GPU 性能、驱动版本、操作系统、网格大小、纹理大小等),因此无法从应用程序层面预估并避免此类崩溃。

Windows 系统中有一个注册表键值用于指定系统等待 GPU 响应的时间长度(即 TDR 值 )。应用程序无法直接修改这个设置,但用户可以手动调整。

更多信息参考官方文档:TDR 注册表键文档


以下是多个用户尝试并验证过的解决方案,希望能帮助你快速解决问题。如有新方法,欢迎补充。

可以优先尝试6:修改 TDRDelay 和 TDRDdiDelay 值。

如果不行的话,再试试其他方法。因为造成这个问题的原因比较多。


解决方案列表

1. 在 Windows 设置中指定首选显卡

通过设置让 Unity 使用你的独立显卡,而非集成显卡(通常性能较差)。

  • 路径:
    设置 > 系统 > 显示 > 图形设置 > “选择要设置首选项的应用” > 桌面应用 > 浏览
  • 选择你的 Unity 编辑器路径(unity.exe),然后点击“选项”,设置为“高性能”。
  • 提示: 可通过任务管理器的性能选项卡确认 Unity 是否使用集成显卡。

2. 在 Nvidia 控制面板中指定显卡设置

确保在 Nvidia 控制面板中,为 Unity 编辑器设置使用独立显卡。

  • 路径:
    打开 Nvidia 控制面板 > 管理 3D 设置 > 程序设置
    unity.exe 指定独立显卡。

3. 将 Unity 添加到杀毒软件白名单

某些杀毒软件可能干扰 Unity 的运行,可尝试将 unity.exe 添加到白名单中。

  • 如果问题仍未解决,可暂时关闭杀毒软件测试(但不建议长期关闭)。

4. 删除项目的 Library 文件夹
  • 方法:
    关闭 Unity 后,删除项目目录下的 Library 文件夹。重新打开项目时,Unity 会自动重建此文件夹。
  • 效果: 有用户反馈此操作能解决问题。

5. 进行 Windows 就地升级
  • 方法:
    下载 Windows 最新版本的安装程序,执行“就地升级”。
    • 在安装过程中选择“保留我的文件”以及“保留我的应用”。
    • 效果: 一些用户反馈此操作能修复系统问题。

6. 修改 TDRDelay 和 TDRDdiDelay 值
  • 原理: 增加显卡响应的超时时间,以防止 Windows 过早重置显卡。
  • 风险: 设置不当可能导致系统不稳定,甚至蓝屏死机(BSOD)。
  • 修改方法:
    参考 Adobe 官方教程

7. 添加 Unity 启动参数 -force-d3d11 或 -force-d3d12
  • 方法:
    • 打开 Unity Hub,点击项目名称右侧的“...” > 高级项目设置。
    • 在“命令行参数”中输入 -force-d3d12-force-d3d11,然后保存并打开项目。
  • 效果: 强制 Unity 使用指定的图形 API,可能解决设备重置问题。

8. 禁用集成显卡
  • 方法:
    在设备管理器中禁用集成显卡。
    • 注意: 如果你的设备只有一张显卡,请不要尝试此方法。

补充建议

  • 更新显卡驱动程序:
    确保显卡驱动程序是通过官方网站(如 Nvidia 官网)下载的最新版本。
  • 联系显卡厂商支持:
    Nvidia 用户可以通过 Nvidia 官方支持 联系工程师寻求帮助。

参考:

1. Failed to present D3D11 swapchain due to device reset/removed. List of Solutions - Unity Engine - Unity Discussions

2. https://helpx.adobe.com/substance-3d-painter/technical-support/technical-issues/gpu-issues/gpu-drivers-crash-with-long-computations-tdr-crash.html

Unity中ab包压缩方案 LZMA 和LZ4

LZMA

1.LZMA采用流压缩方式(stream-based),压缩率会比LZ4更高,体现在包体更小,但是问题也很严重。LZMA只支持顺序读取,所以加载AB包时,需要将整个包解压,会造成卡顿和额外内存占用。这也是为什么在有些复杂UI上首次打开会造成卡顿。

2.加载AB包后将所有资源进行了缓存,导致了如果AB包资源利用率在短时间利于率不高的时候,造成了很高的内存浪费。

3.一套引用计数规则非常复杂,当资源过多的时候建立引用关系都是很费时的,其中的常驻包的设置逻辑也是非常具有不确定性。

LZ4优化

1.LZ4采用块压缩方式(chunk-based),块压缩的数据被分为大小相同的块,被分别压缩,虽然压缩率不及LZMA,但是读取效率比LZMA高非常多

2.LZ4压缩的AB包,使用LoadFromFile()或LoadFromStream()只会加载AB包的Header,相比于直接加载解压整块AB包,效率更进一步提高。另外一个很重要的点,由于可以只加载Header,因此AB包可以做到一旦加载到内存后就再不卸载,此时只需要管理从AB包中读取出来的资源的生命周期。

3.对于之前使用引用计数的优化,由于Unity原本资源管理就是使用引用计数去维护,这里再建立一套内部的引用计数,不仅多余而且很浪费CPU资源,而且效果不一定很好。这个时候我们可以建立一套弱引用管理体系,通过弱引用去持有资源,在触发Resource.UnloadUnusedAssets()再去清除弱引用失效的对象。

将LZMA的压缩方式修改为LZ4

将打包参数添加BuildAssetBundleOptions.ChunkBasedCompression即可

BuildAssetBundleOptions buildOption = BuildAssetBundleOptions.IgnoreTypeTreeChanges | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.ChunkBasedCompression; LZ4读取AB包 //读取ab包 AssetBundle.LoadFromFileAsync(url) 这里需要注意一点的就是,LoadFromFileAsync与WWW或UnityWebRequest区别在于是在windows下不需要file://前缀


原文链接:https://blog.csdn.net/qq_38721111/article/details/129184791