news 2026/9/18 9:38:56

UE5一运行就崩溃:日志、D3D设备丢失与显存插件排查指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UE5一运行就崩溃:日志、D3D设备丢失与显存插件排查指南

UE5 一运行就崩溃,几乎是每个碰过虚幻引擎的人都躲不过的一道坎。有的人是双击项目图标,进度条刚走到百分之十几,窗口一闪就没了;有的人是编辑器能进去,一按播放键直接黑屏退出;还有人是打包之后在别人机器上跑得好好的,回到自己电脑上开五分钟崩一次。网上搜一圈 UE5 崩溃的修复方案,答案五花八门,从重装系统到换显卡,看得人头皮发麻,最后往往还是不知道该动哪一步。

这篇内容就是把我这些年处理 UE5 崩溃问题的思路完整摊开讲。核心目标只有一个:让你在一台已经崩溃的机器上,用最短的时间判断出崩溃属于哪一类,然后照着对应方向去修,而不是盲目重装、盲目换硬件。适合刚接触虚幻引擎的新手,也适合已经做过一两个项目、但每次遇到崩溃还是靠玄学重启的老手。文中涉及到的日志路径、错误码、启动参数、注册表设置,我都会给出具体位置和具体数值,能直接抄。

1. UE5一运行就崩溃,先分清是哪一类崩

很多人一上来就问"UE5 崩溃怎么解决",这个问题其实没法直接回答,因为"崩溃"是个结果,不是原因。就像你说"车打不着火",可能是电瓶没电,可能是没油,也可能是钥匙芯片坏了。UE5 的崩溃同理,必须先按发生时机把它切开分类,后面才谈得上对症下药。

1.1 三种崩溃形态,对应的方向完全不同

我习惯把 UE5 崩溃分成三类。第一类是启动阶段崩溃,也就是双击引擎或项目之后,连编辑器界面都没看到就退出,或者卡在加载画面直接消失。这类问题八成出在渲染后端初始化失败、显卡驱动不兼容、引擎版本与项目版本对不上、或者必要运行库缺失。它跟你的项目内容基本无关,就算新建一个空白项目也一样崩。

第二类是打开项目时崩溃,引擎本体能起来,但加载特定项目时崩。这类问题通常指向项目文件损坏、插件冲突、资源引用丢失、缓存目录里的数据烂掉了。特征很明显:换一个项目就正常,说明问题在项目侧而不在引擎侧。

第三类是运行中崩溃,编辑器能正常用,甚至能编辑半天,但一按播放、一进 PIE(编辑器内运行)、或者跑一段时间之后突然退出,日志里经常出现跟 GPU 相关的字眼。这一类是数量最多的,也是修复方案最杂的,显存、温度、超频、着色器编译、蓝图死循环都可能导致。

提示:判断属于哪一类,比记住任何一条具体命令都重要。分类错了,后面所有操作都是白费力气。

1.2 为什么我的第一反应不是重装引擎

新手最容易做的动作就是卸载重装,一装两三个小时,装完发现还是崩。原因很简单:UE5 的崩溃绝大部分不是引擎文件坏了,而是环境、驱动、项目缓存、插件这四样东西出的问题。你重装引擎,这四样一个都没动。

我现在遇到崩溃的标准流程是:先看崩溃日志确认方向,再动最便宜、最快、可回滚的操作。所谓便宜,指的是改一个设置、清一个目录、加一个启动参数,这些操作几十秒就能完成,失败了也能改回来。相比之下,重装驱动、重装引擎、重装系统,属于成本最高、信息量最低的操作,应该排在最后。

还有一点值得说:UE5 从 5.0 到 5.5,每个小版本的稳定性差异其实挺明显。有些项目在 5.1 上崩得怀疑人生,换到 5.3 就稳了;也有反过来,某些老插件只兼容到 5.2,硬上 5.4 反而天天崩。所以当你排除了环境和缓存问题之后,换一个引擎小版本重新编译项目,是一条被严重低估的修复路径。

2. 三分钟定位崩溃源:日志与错误码的正确读法

会看日志的人,修崩溃的速度是别人的三倍。这不是夸张,UE5 的崩溃日志写得相当详细,只要你找到对的那几行,方向基本就定了。问题在于日志文件又长又杂,一屏幕刷下来几千行,没人愿意从头读。

2.1 崩溃日志在哪,哪几行才是关键

Windows 上,引擎级日志分两个位置。一个是普通运行日志,路径类似C:\Users\你的用户名\AppData\Local\项目名\Saved\Logs\项目名.log,记录了这次运行从头到尾的所有输出。另一个是崩溃专用日志,在Saved\Crashes\目录下,每次崩溃会生成一个带时间戳的文件夹,里面有一个CrashContext.runtime-xml和一个诊断文本,这两个才是重点。

打开CrashContext.runtime-xml,你只需要盯四个字段:ErrorMessageCrashTypeCallStack的第一行、以及Misc.EngineVersionMisc.ProjectNameErrorMessage通常会直接告诉你崩溃原因,比如 D3D 设备丢失、内存分配失败、断言失败。CrashType会区分是访问违规、断言还是 GPU 崩溃。CallStack的第一行指向出问题的模块,如果是nvwgf2umx.dllatio6axx.dll这类显卡驱动文件,那方向就锁死在显卡上了。

普通日志里则是搜关键字。我常用的几个搜索词是:Fatal errorErrorWarning: FailedAssertion failedD3DGPUOut of memory。搜Fatal error基本能一次命中,因为 UE5 退出前几乎都会打这一行。

2.2 高频错误码速查与对应方向

下面这张表是我自己整理的,覆盖了日常遇到的大部分情况。看到对应字样,直接跳到后面相应的章节即可。

日志关键字 / 错误码含义优先排查方向
D3D device being lost/0x887A0006显卡设备被系统判定挂起驱动、TDR 超时、显存、超频
DXGI_ERROR_DEVICE_REMOVED/0x887A0005显卡设备被移除显卡驱动重装、显卡降频、供电
GPU Crash dump TriggeredGPU 侧发生崩溃着色器、显卡驱动、关闭超频
Out of video memory显存耗尽降低纹理质量、关闭 Nanite/Lumen、加大虚拟内存
Out of memory系统内存耗尽关后台程序、加大内存、检查内存泄漏
Assertion failed引擎内部断言失败看具体文件行号,多为插件或代码问题
Access violation reading address 0x...空指针访问蓝图/代码逻辑错误、插件不兼容
Unable to load module模块加载失败运行库缺失、引擎安装不完整

看到0x887A00060x887A0005这两个,你就可以确认这是典型的 GPU 崩溃,占了我经手崩溃案例里的一半以上,所以下一节专门讲它。

3. GPU与D3D设备移除:占大头的这一类崩溃怎么修

Unreal Engine is exiting due to D3D device being lost,这行日志估计是 UE5 玩家见得最多的一句话。它翻译成人话就是:Windows 觉得你的显卡卡住了没响应,就主动把显卡驱动重置了,而虚幻引擎这边一发现显卡没了,只能自己退出。注意,这里的关键是"Windows 觉得卡住了",也就是说,崩溃的直接原因未必是显卡真坏,很多时候只是响应超过了系统容忍的时限。

3.1 D3D 设备移除到底发生了什么

Windows 有一套叫 TDR(Timeout Detection and Recovery,超时检测与恢复)的机制。它的逻辑是:如果一个显卡指令超过默认 2 秒还没返回结果,系统就认为显卡已经卡死,于是强制重启显卡驱动,避免整个系统一起挂掉。这个过程对你来说是黑屏一两秒然后恢复,对正在进行大量渲染任务的 UE5 来说就是致命打击,因为它申请的所有显卡资源都失效了。

为什么 UE5 特别容易触发这个超时?因为 UE5 默认走 DirectX 12,开启了 Nanite、Lumen、虚拟阴影贴图这些重量级特性之后,单帧提交给显卡的工作量非常大。编译着色器的阶段更是夸张,一瞬间要提交成百上千个着色器任务。显卡一旦因为驱动效率、显存不足、温度过高而变慢,就很容易踩过那 2 秒的线。

3.2 驱动、DX11回退与TDR超时三个关键动作

修复这一类崩溃,我一般按这个顺序走,成本从低到高。

第一步,加启动参数回退到 DirectX 11。这是性价比最高的操作。右键你的项目快捷方式,在"目标"末尾加上空格和-dx11,或者-d3d11,然后启动。如果崩溃立刻消失,那基本可以确定问题出在 DX12 路径或驱动上。

"D:\Epic Games\UE_5.4\Engine\Binaries\Win64\UnrealEditor.exe" "D:\MyProject\MyProject.uproject" -dx11 -log

后面那个-log会让引擎额外弹出一个日志窗口,崩溃时你能第一时间看到输出,强烈建议加上。

第二步,重装显卡驱动,并且用清洁安装。注意不是随便点一下更新就完事。NVIDIA 用户建议用官方工具做"执行清洁安装",把旧驱动配置全部清掉。AMD 用户同理。更重要的是,不要盲目追最新驱动,某些新版驱动对 DX12 的改动会引入新的问题,遇到 UE5 崩溃时,把驱动回退到上一个稳定版本,往往直接解决。我自己就遇到过一次,更新完最新驱动后 UE5 一进 PIE 就崩,回退一版立刻恢复。

第三步,把 TDR 超时时间调长。这个操作能显著减少"其实显卡没坏、只是慢了一点就被判死"的情况。方法是在注册表里加两个值。路径是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers,新建两个 DWORD(32 位)值:

# 需要在管理员权限的 PowerShell 中执行 New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers" -Name "TdrDelay" -Value 10 -PropertyType DWord -Force New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers" -Name "TdrDdiDelay" -Value 10 -PropertyType DWord -Force

这两个值单位都是秒,默认是 2,改成 10 表示系统愿意等 10 秒再判定超时。改完必须重启电脑才生效。想恢复就把这两个键删掉。

注意:TdrDelay 调大不是"修复崩溃",而是"减少误判"。如果你的显卡确实有硬件层面的不稳定,调大之后的表现会从"崩溃退出"变成"画面卡死很久",问题依然在,只是换了个形式。

3.3 显存、虚拟内存与温度:硬件侧的三道防线

如果上面三步做完还是崩,就要往硬件侧看了。

显存是第一道防线。UE5 项目设置里,纹理质量、阴影分辨率、Lumen 的全局光照质量,都直接吃显存。如果你在项目设置里把纹理质量开到"极高",而显卡只有 8GB 显存,加载大场景时就很容易爆。快速验证方法是在项目设置里把Engine - Rendering下的纹理质量降到"中",重新打开项目试试。不崩了,就说明是显存问题,后面可以针对性优化资源,而不是一刀切降画质。

虚拟内存是第二道防线,而且被严重低估。很多人以为内存够大就不需要虚拟内存,于是手动把它设成 0 或者很小。这是个坑。UE5 在编译着色器、烘焙光照、打包资源时,会产生大量临时文件,非常依赖页面文件。正常物理内存 32GB 的机器,我一般建议把页面文件设为固定 16GB 到 32GB,放在 SSD 上,不要用系统自动管理。设置位置在"系统属性 - 高级 - 性能设置 - 高级 - 虚拟内存"。

温度是第三道防线。显卡一旦进入温度墙,核心频率会被强行拉低,渲染时间变长,TDR 超时的概率就上去了。用温度监控工具看崩溃前的 GPU 温度,如果长期在 83 度以上,清灰、换硅脂、调整机箱风道,比改任何软件设置都管用。笔记本用户还要特别注意独显与核显的切换策略,很多笔记本默认用核显跑编辑器界面、独显跑渲染,这种调度在某些驱动版本下会直接导致设备丢失,在显卡控制面板里把 UnrealEditor.exe 强制指定为独显,能省掉很多麻烦。

4. 项目侧与插件侧:那些"换个项目就好"的崩溃

如果你确认新建空白项目不崩、只有某个特定项目崩,那问题基本就在项目里了。这一类的排查思路跟 GPU 完全不一样,靠的是删和关。

4.1 缓存目录三件套的清理手法

UE5 会在项目根目录下生成三个可以被安全删除的目录:BinariesIntermediateSaved。它们分别是编译产物、中间文件、运行时数据。当引擎版本升级、插件增删、或者某次崩溃导致文件写坏时,这三个目录里的数据可能就不一致了,进而引发启动即崩。

清理顺序我一般是这样:

  1. 关闭编辑器和所有相关进程,确认没有 UnrealEditor.exe 在后台。
  2. 删除BinariesIntermediate两个目录。
  3. 进入Saved只删LogsCrashesDerivedDataCache三个子目录,其余的先留着。Saved里可能存着你的编辑器布局、自动备份、配置等,整个删掉会丢东西。
  4. 重新生成项目文件,然后打开。

在 Windows 上右键.uproject文件,选择"Generate Visual Studio project files",重新生成后再启动。对于 C++ 项目,这一步是必须的;纯蓝图项目虽然不需要编译,但重新生成一次同样能让引擎重建索引。

还有一类更隐蔽的:DerivedDataCache如果被设置到了系统盘外的一个不稳定磁盘上,或者磁盘空间不足,也会导致加载时崩溃。项目设置里搜Derived Data可以看到当前缓存路径,必要时改到一块空闲空间充足的 SSD 上。

4.2 插件冲突与第三方依赖的排查

插件导致的崩溃有个典型特征:日志里出现Unable to load module或者某个具体插件的名字,且往往在你刚装了新插件之后开始崩。UE5 生态里的第三方插件质量参差不齐,尤其是那些从 UE4 时代移植过来、或者作者已经停止维护的,装上去很容易和当前引擎版本打架。

排查方法很直接:把项目里的插件全部禁用,看还崩不崩。编辑.uproject文件,在Plugins数组里把可疑插件的"Enabled"改成false,或者直接从数组里删掉那一段。也可以启动时加-DisablePlugins参数临时绕过。

{ "FileVersion": 3, "EngineAssociation": "5.4", "Plugins": [ { "Name": "SomeThirdPartyPlugin", "Enabled": false } ] }

然后在编辑器里逐个启用,启用一个测一次,直到复现崩溃,就锁定是哪个插件的问题。这个过程有点笨,但准确率百分之百。

顺带说一句,涉及到特殊资源格式的插件,比如体积纹理、地理数据、大规模场景导入这类,往往对显存和内存要求更高,崩溃表现通常不是立即退出,而是加载到一半内存飙升然后崩。遇到这种,先把插件的相关功能关掉,确认引擎本体稳定,再单独调它的质量参数,比一上来就怀疑引擎要靠谱。

4.3 蓝图与C++代码写崩的典型情况

代码和蓝图层面的崩溃,日志里一般会出现Access violation或者Assertion failed,并且 CallStack 会指向你项目自己的模块,而不是引擎模块。这是最好辨认的一类。

蓝图侧的经典问题包括:在BeginPlay里访问一个尚未初始化的对象、在 Tick 里做无限递归、事件分发器和绑定对象的生命周期不匹配、异步加载的资源在加载完成前就被使用。C++ 侧则是空指针解引用、数组越界、在多线程里访问 UI 对象。

排查这类崩溃,-log参数之外再加一个-debug,能看到更完整的调用栈。如果项目是 C++ 的,用调试模式启动编辑器并附加到进程,崩溃时 Visual Studio 会直接停在出错的那一行。这一步对新手可能有点门槛,但一旦学会,定位速度比读日志快十倍。

还有一个容易被忽略的点:热重载。C++ 项目在编辑器里编译之后,如果没有完全重启编辑器,有时候会残留旧模块,随后在调用新代码时崩溃。遇到莫名其妙的崩溃,先关掉编辑器,删掉BinariesIntermediate,重新完整编译一次,能消掉很大一部分"幽灵崩溃"。

5. 从装机开始降低崩溃概率:环境与版本策略

修崩溃的最高境界是不让它发生。UE5 的崩溃有相当一部分其实是可以提前规避的,只要在装机、装引擎、配环境这三个环节稍微用点心。

5.1 配置选型:别让显卡成为短板

做 UE5 项目用什么电脑,这个问题没有标准答案,但有几个原则是确定的。内存比 CPU 更容易成为瓶颈,显存比内存更容易引发崩溃。我的建议是:内存 32GB 起步,做大型场景或开 Lumen 直接上 64GB;显存 8GB 是及格线,12GB 会舒服很多,做影视级场景建议 16GB 以上;固态硬盘至少留出 200GB 给引擎、缓存和项目文件,缓存目录千万别放机械盘。

显卡方面,同代产品里,显存容量的差异比频率差异更值得关注。很多人为了省预算买高频低显存版本,结果打开一个大场景就爆显存崩溃,得不偿失。CPU 只要不是特别老,影响其实没想象中大,UE5 的大部分工作负载压在显卡上。

还有一点很实际:笔记本做 UE5 项目,一定要确认电源已连接且电源计划设为高性能。电池模式下显卡会被限制功耗,性能腰斩,崩溃概率直接翻倍。

5.2 多版本引擎共存的安装顺序

很多人机器上同时装了 UE5.1、5.2、5.4 好几个版本。这时候最容易踩的坑是:先装了高版本,再装低版本时,项目文件关联被抢走。双击.uproject打开的可能不是你想要的那个版本,接着就是版本不匹配导致的崩溃。

我的做法是:先装低版本,再装高版本,最后再手动为每个重要项目指定引擎关联。.uproject文件里的EngineAssociation字段可以直接写版本号,也能写引擎安装的 GUID。多版本共存时,把每个项目的关联写死,能避免大半"打开就崩"的问题。

{ "FileVersion": 3, "EngineAssociation": "5.3" }

如果某个项目要在多个版本之间来回切换,建议用源码版引擎,通过右键切换版本再重新编译。二进制版引擎切换版本时,必须要删掉BinariesIntermediate重新生成,否则残留的编译产物会在启动时引发崩溃。

5.3 系统环境、运行库与电源计划

系统层面的东西看着琐碎,但确实是崩溃的常见来源。Visual C++ 运行库务必装全,包括 2015 到 2022 的 x86 和 x64 版本,缺一个都可能让引擎在加载某个模块时直接退出。DirectX 运行时的更新组件也建议装一下,虽然系统自带,但部分老版本系统上的组件确实偏旧。

系统盘剩余空间不要低于 20GB。UE5 在运行时会在系统盘写临时文件,空间不够时会以非常难懂的方式失败,日志里可能只写一句内存分配失败,实际是磁盘满了。

电源计划方面,Windows 自带的"平衡"模式会在后台动态调整 CPU 频率,编译着色器这种持续高负载任务容易受到影响。做 UE5 项目时,电源计划切到"高性能",并且在显卡控制面板里把电源管理模式设成"最高性能优先"。这不会提升多少帧数,但能减少莫名其妙的卡顿与超时。

6. 常见问题速查表与实战避坑心得

前面讲的都是原理和方案,最后这部分是我自己攒下来的速查清单和踩坑记录,遇到崩溃可以直接对照。

6.1 高频问题速查表

现象最可能的原因先做的动作
双击引擎无反应或一闪就退驱动或运行库问题换 DX11 启动、装全 VC++ 运行库
打开特定项目立刻崩项目缓存损坏删 Binaries、Intermediate、DerivedDataCache
一进 PIE 就崩,日志含 D3DGPU 超时调大 TdrDelay、换驱动版本、降画质
编译着色器到某个百分比必崩着色器缓存损坏清空 DerivedDataCache、切 DX11 编译一次
装配插件后开始崩插件不兼容禁用插件、逐一出价测试
大场景加载到一半崩显存或虚拟内存不足加大页面文件、降纹理质量
打包后的游戏在目标机器崩运行库缺失目标机装 VC++ 运行库、DirectX 组件
长时间运行后突然崩温度或内存泄漏监控温度、检查 Tick 里的资源申请

6.2 我自己踩过的几个坑

第一个坑:把 TdrDelay 改成了 0。有一次手滑把值设成了字符串或者 0,结果系统判定更激进,本来十分钟才崩一次变成两分钟崩一次。这个值一定要是 DWORD 类型,单位是秒,正常在 5 到 10 之间。改完记得重启,不重启不生效,我当初就是没重启,折腾了半天以为没用。

第二个坑:无脑追最新显卡驱动。前面提过,这个亏我吃过不止一次。现在我的策略是:只要当前驱动能稳定跑项目,就不主动更新。只有在明确知道新驱动修复了某个 UE5 相关问题时才动。而且更新前一定记下版本号,出问题能退回去。

第三个坑:把 DerivedDataCache 放到机械盘。当时固态空间不够,顺手改到了机械盘。结果项目打开速度慢得离谱,而且偶尔崩。原因很简单,机械盘的随机读写性能太差,着色器缓存的读写跟不上引擎的节奏,间接导致了超时。后来腾出固态空间放回去,问题消失。

第四个坑:以为崩溃日志里的第一行就是原因。实际上日志开头往往是启动信息,真正的错误在末尾或者被包裹在Fatal error那一行里。我早期的习惯是从头往下读,浪费了大量时间。正确做法是直接搜关键字,再从命中的位置往上下各看二十行。

第五个坑:在笔记本上没插电源测崩溃。当时怀疑是引擎问题,查了一整天。最后发现是电池模式下显卡被限功耗,渲染跟不上导致设备丢失。插上电源,问题当场消失。这件事之后再遇到笔记本崩溃,我第一件事就是确认电源和电源计划。

关于版本选择,还有一条经验值得单独说:如果你正在做一个长期项目,不要急着升级引擎小版本。UE5 的小版本更新有时候会引入新的渲染后端改动,你原本稳定的项目可能因为一次升级开始频繁崩溃。升级前先在复制出来的项目副本上测一周,确认稳定再动主项目,这个习惯帮我省下了好几次通宵。

最后分享一个诊断技巧:当崩溃没有任何规律、日志也看不出问题时,用-dx11 -log -nosplash这组参数启动一次。如果 DX11 下稳定,说明问题被锁死在 DX12 渲染路径,接下来所有精力就集中在驱动和显卡特性上,不用再怀疑项目内容了。反过来如果 DX11 也崩,那基本可以排除显卡渲染这条线,转向内存、插件和项目缓存方向排查。这一步能帮你把排查范围直接砍掉一半,是我这些年用得最多的一招。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 9:37:20

AI手搓脚本批量导入知识库:扫描解析投递与断点续传

折腾了大半年知识库,脚本终于跑通的那天晚上,我盯着终端里滚动的 1287 个文件名,心情有点复杂。这大概是我第一个真正意义上"纯 AI 手搓"的脚本程序——从目录遍历、文件解析到批量导入知识库的接口调用,代码里几乎每一…

作者头像 李华
网站建设 2026/9/18 9:37:15

大模型辅助工作实战:联网搜索、RAG与Prompt设计的边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 9:35:13

DubboService注解详解:分布式服务注册与配置实战

1. DubboService注解核心解析在分布式服务架构中,服务暴露与发现是核心难题。Dubbo框架通过DubboService注解,将Spring Bean自动注册为Dubbo服务,解决了服务化过程中的繁琐配置问题。这个注解本质上是对Dubbo早期Service注解的升级替代&#…

作者头像 李华
网站建设 2026/9/18 9:34:58

Windows 上 UE 项目 Linux 交叉编译打包全流程

在Windows上做UE项目的Linux打包,这件事我前前后后折腾了大概两年多,从最早UE4.27到现在的UE5.x,踩的坑足够写一本小册子。很多团队的现状是这样的:美术和策划都在Windows上工作,C程序员也用Visual Studio调试&#xf…

作者头像 李华
网站建设 2026/9/18 9:33:49

Proteus仿真51单片机实战:从流水灯到电子时钟完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华