한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › L1 客户端游戏进程

存储设备过慢导致资源流式加载滞后 Slow storage stalls asset streaming

原因 ID cg-asset-stream · 主责 研发团队·客户端开发 · 配合 外部·外部

在含图示和实验的完整版中打开此卡片 →

在 HDD 这类慢速存储设备上,开放世界读取纹理、模型的速度跟不上移动,实体会晚出现,游戏也会因等待读取而一卡一卡。

起因 骑坐骑、传送等快速移动,或进入人多的地方,一下子需要大量新纹理、模型 → 结果 HDD 等慢速存储设备达不到所需的读取速度,读取请求堆积,部分加载还会让主线程一直等到完成 → 画面表现 纹理有一段时间是模糊的,建筑、角色出现得晚,等待读取的瞬间出现一卡一卡、卡住

症状
隐身/幽灵实体, 一卡一卡, 卡住
因素
停顿
谁会遇到
只有我
何时出现
移动中/切换地图时, 人多的时候
负责方
主责 研发团队·客户端开发 · 配合 外部·外部
研发团队要做的事
采用不在主线程等待读取的异步流式加载,根据移动方向和速度提前读取,先显示低分辨率贴图(mipmap)和简化模型、之后再替换,快速移动时流式加载跟不上就暂时限制移动速度或使用加载界面,在最低配置和推荐配置中写明是否需要 SSD。
外部要做的事
引导玩家把游戏装在 SSD 上,并检查同一块硬盘上是否有下载或杀毒扫描在运行。
数值参考
据 Microsoft 的说明,早期机械硬盘每秒读取几十 MB,NVMe SSD 每秒读取几 GB,上一代游戏的流式加载每秒用量在 50 MB 左右。以 SSD 速度为前提、读取量远超于此的游戏放到 HDD 上运行,读取很容易跟不上移动。
监控图上
仅部分偏高 · 帧尖峰次数(按存储设备类型)、磁盘读取延迟
查看位置
快速移动的同时,记录 Windows 性能监视器的 PhysicalDisk\Avg. Disk sec/Read(单次读取的平均耗时)、Current Disk Queue Length 与 PresentMon 帧耗时。开发版本中查看 Unreal 的 stat Streaming、stat AsyncLoad,以及 Unity Profiler 的 AssetBundle.asset/allAssets 警告(加载完成前就请求结果,主线程只能等待)
确认依据
快速移动时磁盘读取延迟和队列飙升,同一时刻帧耗时冲高,或纹理、实体出现得晚。同一场景在 SSD 上运行就消失
排除依据
磁盘空闲而纹理模糊,看“显存(VRAM)不足”;同一地点第二次去就正常,看“主线程同步加载/Shader 编译”
确认手段
需在玩家侧环境确认
深入了解
如果只在第一次停住、之后正常,更接近“主线程同步加载/Shader 编译”;只在存储设备慢的 PC 上每次移动都重复出现,就是这个原因。显存不够、纹理被反复卸载和加载的“显存(VRAM)不足”同样会让纹理模糊,所以要同时看磁盘读取等待和显存占用。杀毒软件的实时扫描在每次打开游戏文件时都会介入,读取会更慢。

出处

  1. DirectStorage is coming to PC Microsoft
    早期机械硬盘每秒几十 MB,NVMe SSD 每秒几 GB,上一代游戏的资源流式加载预算约为每秒 50 MB;开放世界游戏边移动边实时读取、丢弃远景
  2. Texture and mesh loading Unity
    同步上传在主线程的一帧内读取并上传,造成明显停顿;异步上传则分多帧流式加载
  3. Texture Streaming Overview for Unreal Engine Epic Games
    流式加载器按视点调高或调低纹理分辨率(mip),大部分计算在异步工作线程完成,并优先加载画面上可见的 mip
  4. Profiler markers reference Unity
    AssetBundle.asset/allAssets 警告:加载完成前就请求结果,主线程停下来等待
  5. Stat Commands in Unreal Engine Epic Games
    stat Streaming(流式纹理的内存占用和数量)、stat AsyncLoad(异步加载统计)
  6. Windows Performance Monitor Disk Counters Explained Microsoft
    Avg. Disk sec/Read 是单次读取完成所需的平均时间(I/O 延迟),Current Disk Queue Length 是测量瞬间的磁盘队列长度
  7. PresentMon Capture Application (README-CaptureApplication.md) Intel
    用 FrameTime(帧与帧之间的 CPU 时间)录制每帧耗时
  8. About regular quick and full scans with Microsoft Defender Antivirus Microsoft
    实时保护在每次打开、关闭文件时都会扫描

相关原因

同一层:L1 客户端游戏进程

其他层中同样导致“隐身/幽灵实体”的原因

查看含图示和实验的原卡片