イベント処理の注意点
概要
UnrealEngine の Diarkis Plugin Sample には、サーバからの Response 通知 / Push 通知 のコールバックを受け取る仕組みとして、以下の3種類の仕組みを用意しております。
DiarkisDispath
クラスを利用した仕組みEventHandler
クラスを利用した仕組みDiarkisSycData
クラスを利用した仕組み
こちらのコールバックイベントの受け取る仕組みはサンプルのコードになりますので、もし自前の仕組みを使用された場合は置き換えて頂くことが可能です。
DiarkisDispath クラスを利用した仕組み
概要
DiarkisDispath
クラスは、Diarkis Plugin Sample に用意されたサーバからの Response 通知 / Push 通知 のコールバックを受け取る仕組みの一つです。サーバから通知されたコールバックは、
DiarkisXXXXDelegate
のDiarkisDispatch
にキューイングされます。キューイングされた
DiarkisDispatch
は、UDiarkisNetworkManager::Tick()
から呼び出されるInGameDiarkisInterface::Execute()
で実行されています。キューイングされたイベントは、Tick() の呼び出し間隔で処理されますのでご注意ください。もし、タイムラグなく処理されたい場合は、必要に応じて
InGameDiarkisInterface::Execute()
を呼び出す場所を調整ください。現状
DiarkisDispatch
クラスの仕組みとEventHandler
クラスを利用した仕組みと混在していますが、今後はDiarkisDispath
の仕組みが、DiarkisPlugin
の Sampleとしてアプリにコールバックイベントを返すメインの仕組みになる予定です。
処理シーケンス
ここでは、UDP サーバの Connect コマンドの処理の流れで説明しますが、他のモジュール(Room, P2P, MatchMakerなど)のコマンドのコールバックイベントも流れは一緒になります。それぞれの処理に合わせてクラスや関数を置き換えてご確認ください。
例えば UDP/TCP サーバ接続のコールバックイベントを受ける際の流れは以下になります。
まずは、サーバ からの Response 通知 / Push 通知 のコールバックを DiarkisDispatch
でキューイングします。
アプリから UDP/TCP サーバに Connect します。
UDP/TCP サーバからの Response や Push 通知は、
DiarkisUdpBase
クラスでudp_->GetConnectedEvent()
コールバックイベントにセットされているDiarkisUdpBase::OnConnect()
が呼び出されますDiarkisUdpBase
の 子クラスInGameDiarkisUdp::OnConnect()
が呼び出されます。InGameDiarkisUdp::OnConnect()
関数内のDispatch()
でイベントをキューイングします。
void InGameDiarkisUdp::OnConnect(const DiarkisConnectionEventArgs& e)
{
DiarkisUdpBase::OnConnect(e);
....
....
Dispatch(args, [this](std::shared_ptr<DiarkisDispatch::Args> args)
{
delegate_->OnConnect(*this, *std::static_pointer_cast<IDiarkisUdpDelegate::ConnectArgs>(args));
});
}
次に、ゲームのスレッドから DiarkisDispatch
でキューイングされたイベントを Execute()
で実行します。
ゲームのスレッドの
UDiarkisNetworkManager::Tick()
からInGameDiarkisInterface::Execute()
で Delegate が処理されます。InGameDiarkisUdp::OnConnect()
でDispatch()
されたdelegate_->OnConnect()
が呼び出さます。DiarkisSampleUdpDelegate::OnConnect()
が呼び出さます。
DiarkisDispath の関連クラス
役割の概要
アプリレイヤーで Diarkis コールバックイベントを受け取るためのクラス群(新)
コードの場所
DiarkisPluginSample/Source/DiarkisExtension/XXXXX/Delegate
各クラス
DiarkisDispatch.h / DiarkisDispatch.cpp
: Diarkis のコールバックイベントをキューイングや実行するクラスDiarkisUDPDelegate.h
: Diarkis の Group のコールバックイベントをキューに入れるクラスDiarkisP2PDelegate.h
: Diarkisの P2P のコールバックイベントをキューに入れるクラスDiarkisMatchMakerDelegate.h
: Diarkis の MatchMaker のコールバックイベントをキューに入れるクラスDiarkisRoomDelegate.h
: Diarkis の Room のコールバックイベントをキューに入れるクラスDiarkisSessionDelegate.h
: Diarkis の Session のコールバックイベントをキューに入れるクラスDiarkisGroupDelegate.h
: Diarkis の Group のコールバックイベントをキューに入れるクラス
EventHandler クラスを利用した仕組み
概要
EventHandler
クラスは、Diarkis Plugin Sample に用意されたサーバからの Response 通知 / Push 通知 のコールバックを受け取る仕組みの一つで、BluePrint用 コールバックイベントを返すための仕組みとして用意されています。サーバから通知されたコールバックは、
DiarkisNetworkXXXXEventEmitter
のUDiarkisNetworkEventHandler
にキューイングされます。キューイングされた
UDiarkisNetworkEventHandler
は、UDiarkisNetworkManager::Tick()
から呼び出されるIUDiarkisNetworkEventHandler::Update()
で実行されています。キューイングされたイベントは、Tick() の呼び出し間隔で処理されますのでご注意ください。もし、タイムラグなく処理されたい場合は、必要に応じて
UDiarkisNetworkEventHandler::Update()
を呼び出す場所を調整ください。現状
DiarkisDispatch
クラスの仕組みとEventHandler
クラスを利用した仕組みと混在していますが、今後はDiarkisDispath
の仕組みが、DiarkisPlugin
の Sampleとしてアプリにコールバックイベントを返すメインの仕組みになる予定です。
処理シーケンス
ここでは、UDP サーバの Connect コマンドの処理の流れで説明しますが、他のモジュール(Room, P2P, MatchMakerなど)のコマンドのコールバックイベントも流れは一緒になります。それぞれの処理に合わせてクラスや関数を置き換えてご確認ください。
例えば UDP/TCP サーバ接続のコールバックイベントを受ける際の流れは以下になります。
まずは、サーバ からの Response 通知 / Push 通知 のコールバックを EventHandler
でキューイングします。
アプリから UDP/TCP サーバに Connect します。
UDP/TCP サーバからの Response や Push 通知は、
udp_->GetConnectedEvent()
コールバックイベントにセットされているDiarkisUdpBase::OnConnect()
が呼び出されます。DiarkisUdpBase OnConnect()
が呼び出され、内部的にudp_->IsConnected() == true
に変更されます。UDiarkisNetworkManager::Tick()
からUpdateConnected()
が定期的に呼び出され、GetUdpBase()->IsConnected()==true
に切り替わった時に、EnqueueOnNetworkConnect()
が呼び出されます。UDiarkisNetworkCoreEventEmitter::EnqueueOnNetworkConnect()
でOnNetworkConnect
がキューイングされます。
次に、ゲームのスレッドから UDiarkisNetworkEventHandler
でキューイングされたイベントを Update()
で実行します。
ゲームのスレッドの
UDiarkisNetworkManager::Tick()
からEventHandler->Update()
が呼び出されます。UDiarkisNetworkEventHandler::Update()
で、キューイングされたイベントがEvent->CallFunction()
で呼び出されます。IDiarkisNetworkCoreEvent
の派生クラスのADiarkisSampleBase
の子クラスのBPDiarkisPluginSample::OnNetworkConnect()
のイベントが呼び出されます。BPDiarkisPluginSample
の親クラスのADiarkisSampleBase::OnNetworkConnect_Implementation()
が呼び出されます。
関連クラス
役割の概要
BluePrint で Diarkis コールバックイベントを受け取るためのクラス群(旧)
コードの場所
DiarkisPluginSample/Source/DiarkisExtension/XXXXX/Events
各クラス
UDiarkisNetworkEventHandler.h
/UDiarkisNetworkEventHandler.cpp
: Diarkis のコールバックイベントをキューイングや実行するクラスInterfaces
ディレクトリ(Diarkis Plugin のコールバックを受け取るインターフェースクラス)UDiarkisNetworkCoreEvent.h
: Diarkis Plugin の Core 機能のコールバックを受け取るインターフェースクラスUDiarkisNetworkRoomEvent.h
: Diarkis Plugin の Room 機能のコールバックを受け取るインターフェースクラスUDiarkisNetworkGroupEvent.h
: Diarkis Plugin の Group 機能のコールバックを受け取るインターフェースクラスUDiarkisNetworkFieldEvent.h
: Diarkis Pluginの Field 機能のコールバックを受け取るインターフェースクラスUDiarkisNetworkP2PEvent.h
: Diarkis Plugin の P2P 機能のコールバックを受け取るインターフェースクラスUDiarkisNetworkMatchMakerEvent.h
: Diarkis Plugin の MatchMaker 機能のコールバックを受け取るインターフェースクラス
Emitters
ディレクトリ(Diarkis イベントをキューイングするクラス)UDiarkisNetworkEventEmitterBase.h / UDiarkisNetworkEventEmitterBase.cpp
: 様々なイベントを生成するためのベースクラスUDiarkisNetworkCoreEventEmitter.h / UDiarkisNetworkCoreEventEmitter.cpp
: Diarkis Core イベントをキューイング用クラスUDiarkisNetworkRoomEventEmitter.h / UDiarkisNetworkRoomEventEmitter.cpp
: Diarkis Room イベントをキューイング用クラスUDiarkisNetworkGroupEventEmitter.h / UDiarkisNetworkGroupEventEmitter.cpp
: Diarkis Group イベントのキューイング用クラスUDiarkisNetworkFieldEventEmitter.h / UDiarkisNetworkFieldEventEmitter.cpp
: Diarkis Field イベントのキューイング用クラスUDiarkisNetworkP2PEventEmitter.h / UDiarkisNetworkP2PEventEmitter.cpp
: Diarkis P2P イベントのキューイング用クラスUDiarkisNetworkMatchMakerEventEmitter.h / UDiarkisNetworkMatchMakerEventEmitter.cpp
: Diarkis MatchMaker イベントのキューイング用クラス
DiarkisSycData クラスを利用した仕組み
概要
DiarkisSycData
クラスは、Diarkis Plugin Sample に用意されたサーバからの Response 通知 / Push 通知 のコールバックを受け取る仕組みの一つで、キャラクターの位置同期など遅延を抑えたいコールバックイベントを処理する仕組みとして用意されています。
まずは、Room のリレー通信、P2P通信で取得した Payload をキューイングします。
DiarkisRoom::OnRoomMemberBroadcast()
が呼び出されます。syncData_->OnPositionSync()
が呼び出ばれます。payloadSyncQueue.push()
で Payload をキューイングします。
次に、キューイングし Payload をデキューします。
UDiarkisSyncComponent::TickComponent()
の処理で、DiarkisRemoteMovementSync::UpdateMovement()
が呼び出されます。DequeueLastFrame()
で Payload をデキューします。
最終更新
役に立ちましたか?