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


接着上一篇:
CleanupEditToolRenderData=TypeName


RETURN_QUICK_DECLARE_CYCLE_STAT(TypeName, STATGROUP_RenderThreadCommands); \




#define RETURN_QUICK_DECLARE_CYCLE_STAT(StatId,GroupId) \
DECLARE_STAT(TEXT(#StatId),StatId,GroupId,EStatDataType::ST_int64, true, true, FPlatformMemory::MCR_Invalid); \
static DEFINE_STAT(StatId) \
return GET_STATID(StatId);



#define DECLARE_STAT(Description, StatName, GroupName, StatType, bShouldClearEveryFrame, bCycleStat, MemoryRegion) \
struct FStat_##StatName\
{ \
typedef FStatGroup_##GroupName TGroup; \
static FORCEINLINE const char* GetStatName() \
{ \
return #StatName; \
} \
static FORCEINLINE const TCHAR* GetDescription() \
{ \
return Description; \
} \
static FORCEINLINE EStatDataType::Type GetStatType() \
{ \
return StatType; \
} \
static FORCEINLINE bool IsClearEveryFrame() \
{ \
return bShouldClearEveryFrame; \
} \
static FORCEINLINE bool IsCycleStat() \
{ \
return bCycleStat; \
} \
static FORCEINLINE FPlatformMemory::EMemoryCounterRegion GetMemoryRegion() \
{ \
return MemoryRegion; \
} \
};



所以
RETURN_QUICK_DECLARE_CYCLE_STAT(TypeName, STATGROUP_RenderThreadCommands); 
变成了:


struct FStat_CleanupEditToolRenderData\
{ \
typedef FStatGroup_STATGROUP_RenderThreadCommands TGroup; \
static FORCEINLINE const char* GetStatName() \
{ \
return CleanupEditToolRenderData; \
} \
static FORCEINLINE const TCHAR* GetDescription() \
{ \
return Description; \
} \
static FORCEINLINE EStatDataType::Type GetStatType() \
{ \
return StatType; \
} \
static FORCEINLINE bool IsClearEveryFrame() \
{ \
return bShouldClearEveryFrame; \
} \
static FORCEINLINE bool IsCycleStat() \
{ \
return bCycleStat; \
} \
static FORCEINLINE FPlatformMemory::EMemoryCounterRegion GetMemoryRegion() \
{ \
return MemoryRegion; \
} \
};
static DEFINE_STAT(StatId) \
return GET_STATID(StatId);


第二个宏:


static DEFINE_STAT(StatId) \


#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;




所以上面的代码变成了:


struct FStat_CleanupEditToolRenderData\
{ \
typedef FStatGroup_STATGROUP_RenderThreadCommands TGroup; \
static FORCEINLINE const char* GetStatName() \
{ \
return CleanupEditToolRenderData; \
} \
static FORCEINLINE const TCHAR* GetDescription() \
{ \
return Description; \
} \
static FORCEINLINE EStatDataType::Type GetStatType() \
{ \
return StatType; \
} \
static FORCEINLINE bool IsClearEveryFrame() \
{ \
return bShouldClearEveryFrame; \
} \
static FORCEINLINE bool IsCycleStat() \
{ \
return bCycleStat; \
} \
static FORCEINLINE FPlatformMemory::EMemoryCounterRegion GetMemoryRegion() \
{ \
return MemoryRegion; \
} \
};
static struct FThreadSafeStaticStat<FStat_CleanupEditToolRenderData> StatPtr_CleanupEditToolRenderData;
return GET_STATID(StatId);




最后一个宏:


GET_STATID(StatId);
#define GET_STATID(Stat) (StatPtr_##Stat.GetStatId())


所以最后代码变成了:
struct FStat_CleanupEditToolRenderData\
{ \
typedef FStatGroup_STATGROUP_RenderThreadCommands TGroup; \
static FORCEINLINE const char* GetStatName() \
{ \
return CleanupEditToolRenderData; \
} \
static FORCEINLINE const TCHAR* GetDescription() \
{ \
return Description; \
} \
static FORCEINLINE EStatDataType::Type GetStatType() \
{ \
return StatType; \
} \
static FORCEINLINE bool IsClearEveryFrame() \
{ \
return bShouldClearEveryFrame; \
} \
static FORCEINLINE bool IsCycleStat() \
{ \
return bCycleStat; \
} \
static FORCEINLINE FPlatformMemory::EMemoryCounterRegion GetMemoryRegion() \
{ \
return MemoryRegion; \
} \
};
static struct FThreadSafeStaticStat<FStat_CleanupEditToolRenderData> StatPtr_CleanupEditToolRenderData;

return (StatPtr_CleanupEditToolRenderData.GetStatId());



所以上一篇代码

ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
CleanupEditToolRenderData,
FLandscapeEditToolRenderData*, LandscapeEditToolRenderData, this,
{
delete LandscapeEditToolRenderData;
}
);

变成了:


class EURCMacro_CleanupEditToolRenderData : public FRenderCommand 
{ 
	public: 
		EURCMacro_CleanupEditToolRenderData(OptTypename TCallTraits<FLandscapeEditToolRenderData*>::ParamType In##LandscapeEditToolRenderData): 
		 LandscapeEditToolRenderData(InLandscapeEditToolRenderData) 
		{} 
		void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) 
		{ 
			FRHICommandListImmediate& RHICmdList = GetImmediateCommandList_ForRenderCommand(); 
			delete LandscapeEditToolRenderData;
		} 

		FORCEINLINE TStatId GetStatId() const 
		{ 
			struct FStat_CleanupEditToolRenderData
			{ 
				typedef FStatGroup_STATGROUP_RenderThreadCommands TGroup; 
				static FORCEINLINE const char* GetStatName() 
				{ 
				return CleanupEditToolRenderData; 
				} 
				static FORCEINLINE const TCHAR* GetDescription() 
				{ 
				return Description; 
				} 
				static FORCEINLINE EStatDataType::Type GetStatType() 
				{ 
				return StatType; 
				} 
				static FORCEINLINE bool IsClearEveryFrame() 
				{ 
				return bShouldClearEveryFrame; 
				} 
				static FORCEINLINE bool IsCycleStat() 
				{ 
				return bCycleStat; 
				} 
				static FORCEINLINE FPlatformMemory::EMemoryCounterRegion GetMemoryRegion() 
				{ 
				return MemoryRegion; 
				} 
			};
			static struct FThreadSafeStaticStat<FStat_CleanupEditToolRenderData> StatPtr_CleanupEditToolRenderData;
			return (StatPtr_CleanupEditToolRenderData.GetStatId());
		}
	private: 
		FLandscapeEditToolRenderData* LandscapeEditToolRenderData;
};


{ 
	if(GIsThreadedRendering || !IsInGameThread()) 
	{ 
		CheckNotBlockedOnRenderThread(); 
		TGraphTask<EURCMacro_CleanupEditToolRenderData>::CreateTask().ConstructAndDispatchWhenReady(this); 
	} 
	else 
	{ 
		EURCMacro_CleanupEditToolRenderData TempCommand(this); 
		FScopeCycleCounter EURCMacro_Scope(TempCommand.GetStatId()); 
		TempCommand.DoTask(ENamedThreads::GameThread, FGraphEventRef() ); 
	} 
}

最后解释一下,

GIsThreadedRendering 是判断是否是多线程渲染,如果是多线程渲染,就发送给渲染线程,如果是不支持多线程,就直接在主线程DoTask。

被这个问题困扰了好久。。无奈了。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值