加载页到入场过场的黑屏桥接
March 6, 2026About 2 min
加载页到入场过场的黑屏桥接
跨关卡读档有个常见的观感问题:加载页消失得太早,玩家会先看到一帧"裸场景 + 卡顿",
然后才进入场过场。这篇讲怎么用一段黑屏把这个空窗遮住。加载页基于开源的
Asynchronous Loading Screen 插件。
问题:加载页和过场之间有空窗
跨关卡读档的画面时间线大致是:
加载页(MoviePlayer)盖住 → 关卡加载完、PostLoadMap 触发、加载页自动消失 →
流送恢复引发的卡顿还没结束 → 入场过场动画还没开始。
中间那段空窗,加载页已经撤了、过场还没起,玩家就对着一帧卡顿的空镜。问题根源是加载页
绑死在 PostLoadMap 自动消失,而真正"可以见人"的时机要晚得多。
修法:搭一座"黑屏桥"
在加载页和入场过场之间补一段纯黑,接棒即将消失的加载页:
- 在 loader 跨关卡
OpenLevel之前调用ArmHoldBlackUntilCutscene()武装黑屏; - 下一个
PostLoadMap时贴上全黑(接棒即将消失的加载页); - 在以下三个事件里最早发生的那个释放黑屏:
- 入场过场的
OnPrePlay(在执行链头部调用ReleaseHoldBlackForCutscene); - World Partition 流送稳定(
IsAllStreamingCompleted()返回 true); - 硬兜底超时(约 20s,防止前两个条件都不满足时永久黑屏)。
- 入场过场的
三选一的兜底是关键:正常路径靠过场 OnPrePlay 释放;没有入场过场的关卡靠流送完成释放;
两者都异常时靠超时保命。少了超时这条,一旦过场没触发、流送又卡死,就是死黑屏——这种
"永久黑屏"远比一帧穿帮严重,所以兜底超时不能省。
一处工程约束:loader 侧的
ArmHoldBlackUntilCutscene()调用位于SlotDataTask_Loader.cpp。
如果你的版本管理对"一个文件只能进一个改动单元"有约束(如 Perforce 的 changelist),
注意这个文件的归属,别和黑屏插件的改动混在一起拆不开。
这条黑屏过渡和存档状态恢复是两条独立的线,恢复时机那条见
World Partition 存档恢复时机。