在UE 4.22版本之前,Game线程中往渲染线程中 (Rendering Thread)压入渲染命令任务,以前使用的是ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER。 关于该宏的解释,请参考: UE4 ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER 宏blog.csdn.net/tuanxuan123/article/details/52818136 ...
可以看到游戏线程通过ENQUEUE_RENDER_COMMAND宏来创建排队任务,而渲染线程则通过调用FTaskGraphInterface::Get().ProcessThreadUntilRequestReturn(RenderThread);找到自己的工作线程,来执行任务。下面我们来简单看下ENQUEUE_RENDER_COMMAND宏。 P6.ENQUEUE_RENDER_COMMAND宏 上图左边是游戏线程向渲染线程添加图元(绘制的基本体...
ENQUEUE_RENDER_COMMAND(WakeupCommand)([DesiredRTPollPeriod](FRHICommandListImmediate&) { GRenderThreadPollPeriodMs=DesiredRTPollPeriod; }); }staticFAutoConsoleVariable CVarRenderThreadPollPeriodMs( TEXT("TaskGraph.RenderThreadPollPeriodMs"),-1, TEXT("Render thread polling period in milliseconds. If val...
UE使用一些统一的宏去把命令加入队列,包括ENQUEUE_UNIQUE_RENDER_COMMAND(TypeName,…)这些宏等,我们很自然的能够想到只要在这些宏里面执行指令的时候加入一个scopecounter就可以了,就能先统计到每个渲染指令的大入口的开销,其实ue已经这样做了,它会为每个渲染指令在STATGROUP_RenderThreadCommands这个组下面生成一个叫做...
可以看到,EnqueueUniqueRenderCommand用于将RenderCommand投递到Render线程的TaskGraph队列中。 这里顺便说下,Game线程跟TaskGraph中的ENamedThreads::GameThread对应的线程是同一个。 关于Render线程,我们还可以再深入一下,首先这个线程的创建是在RenderingThread.cpp文件中的StartRenderingThread接口中完成的,调用入口为FEngine...
1 Rhi线程的执行是由一堆有序的rhi command组成的,我们要能捕捉到具体的那一个rhi command的执行时间比较长,比如是创建场景中哪个房子的vb? 2 是在render thread的哪一个步骤塞入的渲染数据导致了这个rhi command执行的时间比较长,是在渲染阴影的时候,还是渲染basepass,还是做遮挡剔除?
//LanuchEngineLoop.cpp 是一个超级长的函数voidFEngineLoop::Tick(){//...//set FApp::CurrentTime, FApp::DeltaTime ... 应用程序的时间,游戏世界的时间GEngine->UpdateTimeAndHandleMaxTickRate();//...//Beginning of RHI frameENQUEUE_RENDER_COMMAND(BeginFrame)([CurrentFrameCounter](FRHICommandList...
RenderThread:RenderThread是一个命令队列,由GameThread充填,只要这个队列里有命令它就会持续执行,UE使用一些统一的宏去把命令加入队列,包括ENQUEUE_UNIQUE_RENDER_COMMAND(TypeName,…)这些宏等,我们很自然的能够想到只要在这些宏里面执行指令的时候加入一个scopecounter就可以了,就能先统计到每个渲染指令的大入口的开销,其...
ENQUEUE_RENDER_COMMAND(UpdateTextureRegionsData)([RegionData,bFreeData](FRHICommandListImmediate&RHICmdList) { for(uint32RegionIndex=0;RegionIndex<RegionData->NumRegions;++RegionIndex) { int32CurrentFirstMip=RegionData->Texture2DResource->GetCurrentFirstMip(); ...
ENQUEUE_RENDER_COMMAND(UpdateTextureRegionsData)([RegionData, bFreeData](FRHICommandListImmediate& RHICmdList) { for (uint32 RegionIndex = 0; RegionIndex < RegionData->NumRegions; ++RegionIndex) { int32 CurrentFirstMip = RegionData->Texture2DResource->GetCurrentFirstMip(); if (RegionData->Mi...