虚幻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() ); \
} \
}
大概的意思是判断一下是渲染线程还是主线程,然后进行不同的操作,具体操作是啥,以后再研究。
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() ); \
} \
}
大概的意思是判断一下是渲染线程还是主线程,然后进行不同的操作,具体操作是啥,以后再研究。
相关文章推荐
- hdu 1247 Hat’s Words(字典树)
- MyEclipse------executeBatch()使用方法
- 2012年的Android之旅:梦想、学习、坚持、自信、淡定
- 白帽、黑帽SEO和灰帽seo的关系
- C++面向对象编程分享05----20160326_李楚煌
- (p231)15.5-4最优二叉搜索树(n^2和n^3)
- Go语言学习(六)函数
- 第四周学习进度条
- 精准剖析白帽SEO和黑帽SEO的区别
- USACO-Section 3.3 Riding the Fences(欧拉回路)
- Python入门 之 列表生成式
- codeforces 540C Ice Cave【BFS】
- nginx基本操作指令
- <div+css页面布局课堂笔记>4---与盒子相关的CSS属性
- 初识RxJava(入门篇)
- jquery复选框 选中事件 及其判断是否被选中
- 15电气 齐振昊 实验名称:15个数排序
- hdu1257最少拦截系统
- 分析Java堆
- 支付宝公众账号商户网关的搭建, RSA密钥对生成