RedZero9 发表于 2022-12-28 10:37

UE5中如何修复 GPU 驱动程序崩溃?

GPU 崩溃是什么样的

在图形密集型项目中工作时,您可能会遇到 GPU 崩溃。发生这种情况时,您将看到如下所示的窗口。


它后面通常跟着一个 Unreal Engine Crash Reporter 窗口。


为什么会发生 GPU 崩溃

Windows 已实施保护措施,以防止应用程序因使用过多内存、进程完成时间过长以及其他各种原因而锁定。在这些情况下,Windows 将终止 GPU 驱动程序,从而导致应用程序崩溃。
当您遇到 GPU 崩溃时,调用堆栈和日志可能包含消息,例如“GPUCrash - 由于 D3D 设备丢失而退出 - D3D 挂起”和“DXGI_ERROR_DEVICE_REMOVED,原因:DXGI_ERROR_DEVICE_HUNG”。
GPU 崩溃的发生可能有多种原因,例如:

[*]内存不足 (OOM)
[*]执行昂贵的操作时超时(TDR 事件)
[*]引擎代码中的错误
[*]驱动程序中的错误
[*]操作系统中的错误
[*]硬件有问题
由于这些原因,在像虚幻引擎这样的应用程序中,不可能总是知道为什么会发生崩溃,并且可能无法在应用程序级别避免崩溃。以下部分为您提供了一些调试选项,以帮助确定根本原因以及您可以采取的一些预防措施。
调试 GPU 崩溃

当 Unreal Engine 中发生崩溃时,您可能希望首先查看 Crash Reporter 生成的调用堆栈和包含信息的日志文件,以帮助了解正在发生的事情。然而,当 GPU 崩溃发生时,CPU 调用堆栈并没有真正指出崩溃的真正原因,而只是表明 GPU 崩溃发生时 CPU 在做什么。因此,它不提供可操作的信息。
您可以使用两个调试命令行参数来输出包含有用信息的日志。

[*]-gpucrashdebugging收集 GPU 进度并在调试 GPU 崩溃时跟踪当前 GPU 状态。
[*]-d3ddebug提供有关 D3D 管道的信息。
我们强烈建议不要一起使用这些命令行参数。您应该分别使用每个标志运行引擎以生成日志。
使用这些命令行中的每一个运行引擎并发生崩溃后,日志将保存在/Saved/Logs文件夹中。
当应用程序在 Windows 中崩溃时,它会生成转储文件,这些文件也有助于诊断崩溃。您可以在 Microsoft 的 Visual Studio 文档中了解有关在 Visual Studio 调试器中使用转储文件的更多信息。
解决 GPU 内存不足 (OOM) 问题

如果 GPU 内存不足,可能会导致崩溃。这在很大程度上取决于所使用的 RHI,有些比其他的更有弹性,并且在 OOM 事件的情况下,它们可能会变慢而不是死掉。
要了解为什么会发生内存不足崩溃,请从Windows 任务管理器开始并使用性能选项卡。在这里,您可以选择您的 GPU (1) 并查看其可用内存以及当前消耗的内存量 (2)。



Windows 任务管理器显示 GPU 的当前统计信息,包括其可用内存和当前消耗量。

打开并运行项目后,您可以看到消耗了多少 GPU 内存与可用内存。如果您接近可用内存限制,则很可能是导致崩溃的问题。在这种情况下,请尝试以下操作:

[*]关闭其他可能消耗大量 GPU 内存的程序。
[*]使用较低分辨率的纹理、较低分辨率的网格、剔除以减少场景中的对象等来简化场景。
[*]使用较低的屏幕分辨率。

[*]在编辑器中工作时,您可以使用关卡视口屏幕百分比以较低的分辨率进行渲染。

[*]在编辑器中工作时,如果打开了多个视口,请关闭除一个以外的所有视口。
[*]避免禁用 Niagara 或光线追踪等主要功能。

[*]绕过这些组件会改变很多事情,这可能导致关于 GPU 崩溃原因的无效结论。

了解操作(TDR 事件)导致的 GPU 超时

当 CPU 向 GPU 发送命令进行计算时,CPU 会设置一个计时器来计算 GPU 需要多长时间才能完成运算。如果 CPU 检测到操作花费的时间过长(默认情况下,在 Windows 中为两秒),它会重置驱动程序,导致 GPU 崩溃。这称为 TDR 事件(或超时检测和恢复)。
理想情况下,引擎永远不应向 GPU 发送触发 TDR 事件的大量工作。相反,引擎应该能够将任务分成更小的块,以避免 TDR。为了避免这些类型的事件,您可以通过编辑 Windows 注册表来增加超时发生所需的时间(请参阅下面的步骤How to Resolve TDR Events)。
具有光线追踪的 TDR 事件

硬件光线追踪的成本特别高,并且在启用时更有可能触发 TDR 事件。一些昂贵的光线追踪过程(例如非常大分辨率下的光线追踪全局照明)可能需要很长时间才能渲染并可能触发 TDR 事件。
最昂贵的光线追踪通道(全局照明和反射)提供了一种使用以下控制台变量以图块而不是单个通道渲染通道的方法:

[*]r.RayTracing.GlobalIllumination.RenderTileSize
[*]r.RayTracing.Reflections.RenderTileSize
当通道的图块大小大于 0 时,这些通道将呈现 N x N 像素图块,其中每个图块都作为单独的 GPU 命令缓冲区提交。这允许在不触发超时检测的情况下进行高质量渲染。
如何解决 TDR 事件

避免 TDR 事件的一种方法是通过编辑 Windows 注册表项来增加 Windows 触发事件所需的时间。在本指南中,您将创建两个新的注册表项:TdrDelay和TdrDiDelay。

[*]TdrDelay设置超时阈值。它是 GPU 延迟来自处理处理和内存 (VRAM) 的 GPU 调度程序的抢占请求的秒数。
[*]TdrDdiDelay设置操作系统 (OS) 允许线程离开驱动程序的时间量。在该时间过去后,发生超时延迟故障。
要了解有关注册表项的更多信息,请参阅 Microsoft 关于Tdr Registry Keys的文档。
更改 Windows 操作系统上的注册表项可能会产生意想不到的后果,并且需要完全重新安装 Windows。虽然在本教程中添加或编辑注册表项不会导致这些后果,但我们建议您在继续之前备份您的系统。对于因修改系统注册表而对您的系统造成的任何损害,Epic Games 概不负责。
您需要向图形驱动程序添加两个注册表项。按照以下步骤添加注册表项。

[*]在 Windows 操作系统搜索栏中键入“运行” 。打开运行应用程序。


2.在搜索字段中,键入“regedit”。单击确定打开注册表编辑工具。


3.导航到注册表编辑工具左侧导航的GraphicsDrivers部分。这个的位置是Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers。


需要将注册表项添加到GraphicsDrivers文件夹,而不是其任何子文件夹。请务必选择正确的文件夹。
4.您需要的注册表项称为TdrDelay.如果此注册表项已存在,请双击以对其进行编辑。如果尚不存在,请右键单击右侧窗格并选择新建 > DWORD(32 位)值。


5.将基数设置为十进制。将TdrDelay的值设置为60。单击“确定”完成。




6.您需要一个名为 的第二个注册表项TdrDdiDelay。如果此注册表已存在,请双击以对其进行编辑。如果它尚不存在,请右键单击右侧窗格并选择新建 > DWORD(32 位)值以创建它。
7.将基数设置为十进制。将值TdrDdiDelay设置为60。单击“确定”完成。




8.您的注册表现在应该包括TdrDelay和TdrDdiDelay。



9.关闭注册表编辑器。
10.重新启动计算机以使这些更改生效。
通过添加这些注册表项,Windows 现在将等待 60 秒,然后确定应用程序的处理时间过长。
尽管这是一种基于渲染来抑制 GPU 崩溃的好方法,但这并不能解决所有崩溃问题。如果您尝试一次处理太多数据,无论您设置超时延迟多长时间,GPU 都可能超时。这个解决方案只是为了给你的显卡多一点时间。
调查引擎代码、驱动程序和操作系统中的错误

引擎代码、驱动程序或操作系统中的错误也可能导致 GPU 崩溃。当 OOM 和 TDR 事件作为根本原因被消除后,您可以执行这些常见操作来开始调查 GPU 崩溃的原因。

[*]-gpucrashdebugging使用和运行引擎-d3ddebug(如前所述单独运行)。
[*]-onethread使用和运行引擎-forcerhibypass以强制引擎仅使用一个线程运行。这有助于确定潜在问题是否是线程/计时问题。
[*]运行引擎r.RDG.Debug=1以提供有关未正确设置的渲染过程的信息。
[*]运行引擎r.RDG.ImmediateMode=1以强制渲染依赖图(RDG) 在创建后立即执行通道。它可以为您提供更有意义的调用堆栈。请注意,这可能会给您带来误导性线索,因为它还会改变其他内容。它仍然值得用于调查目的。
[*]切换到不同的 RHI。例如,如果您使用的是 DirectX 12 (DX12),则可以切换到 DirectX 11 (DX11)。如果崩溃只发生在其中之一,这可能有助于确定问题是在更高级别还是更低级别。请注意,某些功能仅适用于特定的 RHI(例如硬件光线追踪仅受 DX12 支持)。
[*]对您的场景使用 A/B 测试:

[*]打开和关闭渲染过程以检查是否发生崩溃。很多时候,问题是通过错误,进行这种类型的检查可以很好地了解发生了什么。
[*]打开和关闭渲染功能,例如 Lumen、Nanite、Ray Tracing。请注意,其中一些可能需要重新启动系统。
[*]隐藏/显示场景中的特定对象。如果问题与特定资产相关,这可以隔离。

在考虑 GPU 崩溃是否与特定驱动程序相关时,上述所有信息均适用,您还应该获得最新的可用驱动程序。您可能还想与制造商核实此驱动程序可能导致的已知问题。
在考虑 GPU 崩溃是否与操作系统有关时,上述所有信息均适用。此外,对于 Windows,我们强烈建议使用版本 20H2。您可以通过按Windows键并输入winver来了解您使用的是哪个版本的 Windows 。
本地配置不够,如何解决Unreal渲染速度的问题?

Unreal虚幻引擎电脑配置的要求是比较高,特别是实时渲染,前期的硬件成本是比较高,这里有一个简单的节省硬件成本的方法,使用赞奇超高清云工作站,即使本地普通的电脑也能运行UE5软件,且普通电脑也能享受行业最高端的CPU和GPU,极大提高制作效率和使用体验,且使用方便快捷,全面支持3D应用软件插件运行,随时调用百余款软件插件,高效作业。
赞奇超高清云工作站可以为UNREAL 用户提供云端制作输出方案,提高工作效率。为Unity用户提供灵活、高效、低成本的云端烘焙服务,享受游戏制作的乐趣。用户在全国各地通过赞奇超高清云工作站直接连接服务器,共享一套资产, 可以直接在赞奇超高清云工作站上制作 / 修改工程文件,减少数据传输成本,高性能云办公选赞奇超高清云工作站!
赞奇超高清云工作站支持专业10bit色深、YUV444真彩无损显示。4K60帧的高清显示,让设计师处理高速动态视频时体验依然流畅。动画设计、影视特效等内容云端制作,快人一步。赞奇超高清云工作站行业领先配置、多规格高性能GPU机型,可秒级启动百万核算力资源,万核渲一图。极致稳定的计算性能,满足单集群上万台机器并发渲染,可以满足移动办公、人工智能、工业仿真、三维建模、视觉设计、影视制作、教育培训、动画渲染、娱乐畅玩等多场景应用。
页: [1]
查看完整版本: UE5中如何修复 GPU 驱动程序崩溃?