イベントディスパッチャーのバインドによる負荷について

お世話になっております。

今回は特定の問題への対処法というような形ではないので、質問として曖昧にはなっていますが、
ご容赦ください。

ゲームフローを考える際に、どこかの時点からイベントディスパッチャーをイベントとバインドし、
一連の処理が完了したことをcallして、次の演出に移るようにゲーム全体で大きな塊としてのフローを
制御したいと考えております。

そこで、イベントディスパッチャーとイベントのバインドはtick処理によってディスパッチャーの状態を監視し、呼び出しを行っているとの認識ですが、このtick処理が裏で流れていることによってどの程度ゲームへの負荷がかかるものなのでしょうか。(特に複数イベントディスパッチャーをバインドしていると負荷のことが気になってしまう)

皆さんがゲーム制作で負荷の重さを考える際、イベントディスパッチャーによるバインドをどの程度考慮されているのか、また実際にどの程度の負荷なのか、ざっくりとした感覚でよいので教えていただきたいです。

長々と質問失礼いたしました。よろしくお願いいたします。

記憶での返答なので正確性に欠けますが

イベントディスパッチャーはバインドした側が監視しているのではなく
イベントディスパッチャーを持っている側がバインドをした相手に通知するというものなので

バインドしたからといって常時負荷が上がるといったことはないはずです
参考

もちろんですが、イベントディスパッチャーの呼び出しをTickで毎回呼び出すのであればそれは負荷となります。

3 Likes

イベントディスパッチャーの中身はマルチキャストデリゲートと呼ばれます
公式の仕様は以下ですね
参考程度に読んでみてください

使い方は他の方が解説しているサイトがあります
【UE4 C++】デリゲートの使い方まとめ
UE4|IUE5 Delegate, EventDispatcherをC++で書く方法

実装は以下クラスにあります
class TDelegateBase : public TDelegateAccessHandlerBase
class TMulticastDelegateBase : public TDelegateAccessHandlerBase
class TScriptDelegate : public TDelegateAccessHandlerBase<typename UE::Core::Private::TScriptDelegateTraits::ThreadSafetyMode>
class TMulticastScriptDelegate : public TDelegateAccessHandlerBase<typename UE::Core::Private::TScriptDelegateTraits::ThreadSafetyMode>

シングルキャストとマルチキャストという種類があって、イベントディスパッチャーはマルチキャストです
マルチキャストとついているものは複数バインドが可能で、内部にInvocationListという配列を持っています
実行するときはBroadcastもしくはProcessMulticastDelegate関数を通してひとつひとつ(ドキュメントによれば順不同で)呼ばれています
これらはTickとは全然関係ないので、Tick負荷は変わらないですよ
その負荷は比較的小さく、もっと重い処理がいろいろあるゲーム制作においてはボトルネックにならない、無視できる程度と考えて良いと思います

2 Likes

ご回答ありがとうございます!
仕組みについて根本的に大きく勘違いしておりました。
結論として、イベントディスパッチャーの利用する際に
負荷を考慮する必要はあまりないということ、認識いたしました。
また、添付していただいたリンク先の内容についても目を通したいと思います。

改めて、ご回答ありがとうございました。

ご回答ありがとうございます。
デリゲートというものについて全く理解が及んでおりませんでした。。。
負荷についてあまり考慮しなくていい要素ということで認識いたしました。
キャストやデリゲートについて、添付していただいたリンク先から
これを機に内容を頑張って理解してみようと思います。

改めて、詳細なご回答ありがとうございました。

1 Like