安卓上起编译pso的服务改为异步后,会导致开头一些pso未能编译

之前项目在安卓上遇到了anr问题,合入了官方的修改​https://github.com/EpicGames/UnrealEngine/commit/364614974946a3d1f69f8401323e9338befcf7e3\#diff\-063f4a369a45f86905cd559b517545104cc1f19fa88eda4f8fed271fd6f19903

但是也引入了新的问题,​预编译pso不全。在安卓编译pso的服务起来前,生成的编译任务在开始执行时就会return并没有真正执行,所以会漏掉开头一部分pso的编译。项目用的是4.27的引擎,但是看ue5上也是有这个问题的。

执行pso编译的时候会调到​函数PrepareGFXBoundShaderState,CanCreateExternally里面会由于服务未都准备好而return false,进而导致不会走后面的编译。项目目前是起4个服务,在有的机器上全起来可能会有8s左右,所以之前会遇到anr问题,这个8s可能会导致很多重要的pso没有真正编译导致进入游戏后会卡。

有什么推荐的修改办法吗?​

void FOpenGLDynamicRHI::PrepareGFXBoundShaderState(const FGraphicsPipelineStateInitializer& Initializer)
{   ...
    const bool bCanCreateExternally = CanCreateExternally(bIsPreCachePSO);
     if (!bCanCreateExternally)
    { ...
      return;
     }
          ...
}


[Attachment Removed]

Hi,

你好,从代码上看,确实有这种可能性,我感觉可以考虑先调用FShaderPipelineCache::PauseBatching,然后检查服务是否启动好,如果好了之后在Resume。

[Attachment Removed]

现在是这么做的,先暂停之后再继续。想着有没有别的更好的办法,比如使用未加入服务之前的方式来编译。

[Attachment Removed]

我咨询一下同事的意见,等有反馈了给你回复。

[Attachment Removed]

同事的意见是,他觉得如果在RHI线程Precache PSO,会导致游戏非常卡顿,没法玩,所以宁愿不做Pre Cache。

[Attachment Removed]