发现一个可以追踪特定资源加载耗时的功能,分享给大家,举例如下:
适用情景:比如游戏跑着跑着突然画面卡了一下
- 解决步骤:
- 使用SessionFrontEnd确定是由于资源加载造成的卡顿,如:
2. 增加命令行参数 TrackBootLoading ,重新启动UE4编译器
3. 过滤输出窗口,查看LogStreaming输出
4. 知道是什么资源耗时比较多,剩下的就是具体情况具体分析拉
- 关键代码位置在这里,有兴趣的可以查看一下
UObject* StaticLoadObjectInternal(UClass* ObjectClass, UObject* InOuter, const TCHAR* InName, const TCHAR* Filename, uint32 LoadFlags, UPackageMap* Sandbox, bool bAllowObjectReconciliation, FUObjectSerializeContext* InSerializeContext)
{
SCOPE_CYCLE_COUNTER(STAT_LoadObject);
UE_LOG(LogUObjectGlobals, Warning, TEXT("Hypen StaticLoadObjectInternal InName(%s)#FileName(%s)#GFrameNumber(%d)"), InName, Filename, GFrameNumber);
check(ObjectClass);
check(InName);
FScopedLoadingState ScopedLoadingState(InName);
//余下代码略
}
- 建议扩展方法:
一般我们做游戏的,都会把资源放在其他线程进行加载,所以这个日志的收集可能要区分一下是否由GameThread输出,可以这样简单改一下:
if (IsInGameThread())
{
FScopedLoadingState ScopedLoadingState(InName);
}