您的位置:首页 > 其它

虚幻4:有关渲染宏的解释。

2016-03-26 17:56 183 查看
例子:

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() ); \

} \

}

大概的意思是判断一下是渲染线程还是主线程,然后进行不同的操作,具体操作是啥,以后再研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: