例子:
D:\Projects\Program\Engine\Engine\Source\Runtime\Landscape\Private\LandscapeRender.cpp
Line:475
D:\Projects\Program\Engine\Engine\Source\Runtime\RenderCore\Public\RenderingThread.h
Line:243
Line:225
Line:213
Line:228
具体逻辑大概是先定义一个Class,再创建一个这个Class的实例。
所以这段代码变成了:
1:定义一个类。
2:创建代码段使用刚才定义的这个类:
大概的意思是判断一下是不是多线程渲染,然后进行不同的操作,具体操作是啥,以后再研究。
D:\Projects\Program\Engine\Engine\Source\Runtime\Landscape\Private\LandscapeRender.cpp
Line:475
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
CleanupEditToolRenderData,
FLandscapeEditToolRenderData*, LandscapeEditToolRenderData, this,
{
delete LandscapeEditToolRenderData;
}
);
D:\Projects\Program\Engine\Engine\Source\Runtime\RenderCore\Public\RenderingThread.h
Line:243
#define ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(TypeName,ParamType1,ParamName1,ParamValue1,Code) \
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_DECLARE(TypeName,ParamType1,ParamName1,ParamValue1,Code) \
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_CREATE(TypeName,ParamType1,ParamValue1)
Line:225
#define ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_DECLARE(TypeName,ParamType1,ParamName1,ParamValue1,Code) \
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_DECLARE_OPTTYPENAME(TypeName,ParamType1,ParamName1,ParamValue1,,Code)
Line:213
/**
* Declares a rendering command type with 1 parameters.
*/
#define ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_DECLARE_OPTTYPENAME(TypeName,ParamType1,ParamName1,ParamValue1,OptTypename,Code) \
class EURCMacro_##TypeName : public FRenderCommand \
{ \
public: \
EURCMacro_##TypeName(OptTypename TCallTraits<ParamType1>::ParamType In##ParamName1): \
ParamName1(In##ParamName1) \
{} \
TASK_FUNCTION(Code) \
TASKNAME_FUNCTION(TypeName) \
private: \
ParamType1 ParamName1; \
};
Line:228
#define ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER_CREATE(TypeName,ParamType1,ParamValue1) \
{ \
if(GIsThreadedRendering || !IsInGameThread()) \
{ \
CheckNotBlockedOnRenderThread(); \
TGraphTask<EURCMacro_##TypeName>::CreateTask().ConstructAndDispatchWhenReady(ParamValue1); \
} \
else \
{ \
EURCMacro_##TypeName TempCommand(ParamValue1); \
FScopeCycleCounter EURCMacro_Scope(TempCommand.GetStatId()); \
TempCommand.DoTask(ENamedThreads::GameThread, FGraphEventRef() ); \
} \
}
具体逻辑大概是先定义一个Class,再创建一个这个Class的实例。
所以这段代码变成了:
1:定义一个类。
class EURCMacro_CleanupEditToolRenderData : public FRenderCommand \
{ \
public: \
EURCMacro_CleanupEditToolRenderData(OptTypename TCallTraits<ParamType1>::ParamType In##ParamName1): \
ParamName1(In##ParamName1) \
{} \
//TASK_FUNCTION(Code)
void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) \
{
FRHICommandListImmediate& RHICmdList = GetImmediateCommandList_ForRenderCommand();
//Code;
delete LandscapeEditToolRenderData;
}
//TASKNAME_FUNCTION(TypeName)
FORCEINLINE TStatId GetStatId() const \
{ \
//这个宏先不看了,等以后研究。//
RETURN_QUICK_DECLARE_CYCLE_STAT(CleanupEditToolRenderData, STATGROUP_RenderThreadCommands); \
}
private: \
ParamType1 ParamName1; \
};
2:创建代码段使用刚才定义的这个类:
{ \
if(GIsThreadedRendering || !IsInGameThread()) \
{ \
CheckNotBlockedOnRenderThread(); \
TGraphTask<EURCMacro_CleanupEditToolRenderData>::CreateTask().ConstructAndDispatchWhenReady(ParamValue1); \
} \
else \
{ \
EURCMacro_CleanupEditToolRenderData TempCommand(ParamValue1); \
FScopeCycleCounter EURCMacro_Scope(TempCommand.GetStatId()); \
TempCommand.DoTask(ENamedThreads::GameThread, FGraphEventRef() ); \
} \
}
大概的意思是判断一下是不是多线程渲染,然后进行不同的操作,具体操作是啥,以后再研究。