UE4之Delegate:组播

本文探讨了UE4中的多播Delegate,它基于单播并维护多个单播代理。多播通过TBaseMulticastDelegate实现,关键操作如AddRaw、Broadcast涉及对代理数组的操作。Broadcast方法会遍历并执行代理,遇到执行失败则标记为需要压缩。多线程环境下,RemoveAll会检查线程安全并在合适时移除代理。AddInternal作为核心函数,负责添加代理并可能进行压缩。IsCompactable方法用于判断是否需要压缩,主要在特定的代理实例类中重写实现,确保代理的安全性和有效性。
摘要由CSDN通过智能技术生成

定义

#define FUNC_DECLARE_MULTICAST_DELEGATE( MulticastDelegateName, ... ) \
	typedef TMulticastDelegate<__VA_ARGS__> MulticastDelegateName;
	
template <typename... ParamTypes>
class TMulticastDelegate<void, ParamTypes...> : public TBaseMulticastDelegate<void, ParamTypes... >
{
   
private:
	typedef TBaseMulticastDelegate< void, ParamTypes... > Super;
};

多播的功能,基本上基于单播,因为多播只是保存了多个单播而已.
多播实际上是一个TBaseMulticastDelegate的子类, 再来看TBaseMulticastDelegate的定义,只列出部分需要讨论的代码

template <typename... ParamTypes>
class TBaseMulticastDelegate<void, ParamTypes...> : public FMulticastDelegateBase<FWeakObjectPtr>
{
   
	typedef FMulticastDelegateBase<FWeakObjectPtr> Super;

public:
	typedef TBaseDelegate< void, ParamTypes... > FDelegate;
	typedef IBaseDelegateInstance<void (ParamTypes...)> TDelegateInstanceInterface;
	
	template <typename UserClass, typename... VarTypes>
	inline FDelegateHandle AddRaw(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, void (ParamTypes..., VarTypes...)>::Type InFunc, VarTypes... Vars)
	{
   
		return Add(FDelegate::CreateRaw(InUserObject, InFunc, Vars...));
	}
	
	FDelegateHandle Add(FDelegate&& InNewDelegate)
	{
   
		FDelegateHandle Result;
		if (Super::GetDelegateInstanceProtectedHelper(InNewDelegate))
		{
   
			Result = AddDelegateInstance(MoveTemp(InNewDelegate));
		}
		return Result;
	}
	FDelegateHandle Add(const FDelegate& InNewDelegate)
	{
   
		FDelegateHandle Result;
		if (Super::GetDelegateInstanceProtectedHelper(InNewDelegate))
		{
   
			Result 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值