UE3 Streams Tips

准备工作:

1、创建Streaming manager 然后添加相对应的默认Streamers,这里包含两个:

  • FStreamingHandlerTextureStatic:Static texture streaming handler. Used to stream textures on static level geometry。
  • FStreamingHandlerTextureLevelForced:Streaming handler that bases its decision on the bForceMipStreaming flag in PrimitiveComponent。
其负责Streaming Texture的具体工作。

2、LoadPackageList For StreamingTexture

  • Load UTexture2D

  • EndLoad UObject

  • PostLoad UTexture2D

  • PostLoad UTexture:

(1)CalculateLODBias :

【1】Find LODGroup,Calc TextureMaxLoD, UsedLODBias,MinLOD,MaxLOD。

【2】At last Calc WantedMaxLOD,UsedLODBias。WantedMaxLOD:当前渲染的LOD.UsedLODBias:TextureMaxLOD - WantedMaxLOD。

(2)UpdateResource:

【1】Create a new texture resource 。
根据LOD计算出RequestedMips:RequestedMips= Min( Mips.Num() - GetCachedLODBias(), RequestedMips );不小于最小值
RequestedMips = Max( RequestedMips, NumMipTailLevels ); 不大于最大值
new FTexture2DResource:
构造了MipData,注意InOwner->ResourceMem 是在渲染线程申请的内存空间。
计算FirstMip,后于后面根据Mipmap去CreateTexture。
【2】BeginInitResource(Resource):告诉渲染线程资源初始化渲染资源。
初始化动态资源InitDynamicRHI()。
初始化静态资源InitRHI()。
RHICreateTexture2D创建渲染纹理,同时拷贝MipMap 数据到渲染资源。记得拷贝完需要释放MipData的内存。
【3】LinkStreaming():GStreamingManager->AddStreamingTexture(this);

  • The important thing is adds a new texture to the Streaming manager for link。


CalcWantedMips流程:

LoadMap:

GStreamingManager->UpdateAllResources( TimeLimit, FALSE );
UpdateResourceStreaming( 0, TRUE );

现介绍的是 NewUpdateResourceStreaming( DeltaTime, bProcessEverything ),根据优先级加载Resource。

1、AsyncWork->BlockUntilDone();先阻塞掉加载线程。
2、若是第一次进行加载处理需要执行初始化加载线程数据UpdateThreadData():

【1】从PendingStreamingTextures取出需要加载的Textures放入游戏线程StreamingTextures中。
【2】添加关卡到游戏线程中。
【3】FOR Each All StreamingTextures

【4】FOR Each TextureHandler

  • FStreamingHandlerTextureStatic :Static texture streaming handler. Used to stream textures on static level geometry.
  • FStreamingHandlerTextureLevelForced:Streaming handler that bases its decision on the bForceMipStreaming flag in PrimitiveComponent.

【5】For Each all TextureInstance

3、UpdateStreamingTextures 主要是更新所有Texture的UpdateCachedInfo,以及优先级别。

4、UpdateTextureStatus Update Io的State。允许他进入下一个阶段,IO线程加载,抑或加载完成。

5、启动线程进行异步加载。AsyncWork->DoWorkAsync()。

6、线程DoWork,主要比遍历所有需要StreamingTexture,CalcWantedMips,决定他加载的优先级别。

7、StreamTextures( bProcessEverything );所有的纹理优先级已经计算好,现在进行Streaming操作。

BeginUpdateMipCount 告诉加载线程进行可以开始进行MipUpdate加载工作。

8、加载线程中FTexture2DResource::UpdateMipCount:纹理都是Manager的

【1】根据FirstMip的大小RHICreateTexture2D( SizeX, SizeY, EffectiveFormat, Owner->RequestedMips, TexCreateFlags, NULL )。

【2】RHILockTexture2D,然后向IO线程中请求加载Mips数据IO->LoadData。

【3】主线程BlockTillAllRequestsFinished每帧都会先阻塞,并且UpdateStreamingStatus,判断现在加载加载进度。若加载完成,执行

BeginFinalizeMipCount,告诉加载线程IO线程已经加载完成。

【4】加载线程执行FinalizeMipCount,RHIUnlockTexture2D( IntermediateTextureRHI, MipIndex, FALSE )从IO线程中拷贝Mips数据。








你可能感兴趣的:(UE3 Streams Tips)