准备工作:
(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);
【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数据。