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

这篇博客详细介绍了虚幻4引擎中用于渲染的宏ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER的工作原理。通过例子展示了如何定义一个渲染命令类并创建其实例,该宏用于根据是否在游戏线程上运行来决定执行不同的渲染任务。在多线程渲染环境下,该宏会创建并调度任务;否则,在游戏线程上直接执行命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子:
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() ); \
} \
}





大概的意思是判断一下是不是多线程渲染,然后进行不同的操作,具体操作是啥,以后再研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值