v1.0
概要
Diarkis は初回リリースから3年の年月を経て、ついに v1.0 をリリースしました!
主な更新内容
Field が新しくなりました
視界の範囲 (Field of Vision) であれば、Grid を跨いで同期されるように対応しました。
サーバー負荷が軽減されるように最適化しました。
各種 バグを修正 しました。
IDiarkisField::SyncInit() を廃止し IDiarkisField::Join() を追加されました。
DiarkisField::Leave() コマンドを追加されました。
Session モジュールが新規に追加されました。
サーバー
v0.9 と比べて内部通信の効率化、内部コードのリファクタリングの実施、テストシナリオの強化による品質向上を実施し、更にパフォーマンスが向上しております。
コア
DiarkisExec パッケージを追加。サーバーのセットアップを簡潔にできるようになった
メッシュモジュールに MARS アドレスを一定時間キャッシュする仕組みを追加
roomSupport と groupSupport のパッケージ名をそれぞれ roomSupport, groupSupport とキャメルケースに変更
エコーハンドラーを追加
ロギング関数に与えられた構造体が String() インターフェースを実装している場合、 String() の戻り値を出力するようにした
Diarkis サーバーが自己のIPアドレスを取得した場合にデュアルスタックを無効化
致命的な問題を防止するために、メッシュ送信コールバックをロック
致命的な問題を防止するために、vault のマップの同時反復とマップの書き込みを修正
OnStop と OnTerminate のタイムアウトを通知するコンテキストを追加
Direct Message
DMユーザーの切断が正しいバージョンとコマンドで切断メッセージを送信するように修正
Dive
IncrBy と IncrByEx を追加
OnReady を追加
Dive のデータ型を interface{} から []byte に変更。
Dive のバイト固定サイズが小さすぎたのを修正
Dive モジュールのシャットダウン防止問題を修正
Field
Field のアルゴリズムが変更され、パフォーマンスや可用性が向上
Field カスタムフィルタがストレージサーバではなくフロントサーバで実行されるように修正
Field モジュールのパフォーマンス向上
Field の Leave コマンド ID がルームチャットと同じコマンド ID を使用していた問題を修正
Join コマンドを追加し、 Join に続いて Sync、Disappear、Leave が機能するようににしたした
Group
Join に関する問題の修正
MatchMaker
メンバーのチケットタイムアウトを処理するために onMatchedTicketTimeout を追加
チケットのプロパティを更新
Mesh
キーが一杯の場合の sharedData 更新の問題を修正
終了タスクの後にアナウンサーを停止するようにした
Metrics
パケット数のメトリクスを修正しパケットサイズのメトリクスを追加
Puffer
プロパティコメントのサポートを追加し、 JSON パースを改善するために大文字と小文字の違いのサポートを追加
プロトコル名が各パッケージ名で一意になるようにした
プロトコルコードに定数 Ver と Cmd が追加
生成するファイルのパーミッションを 755 から 644 に変更
Room
ユーザーが予期せず切断し、同じユーザーIDで再接続した場合、部屋が空にならないことがある問題を修正
room ID の重複防止
UpdateProperties と IncrProperty は部屋の TTL を更新しないように変更
mutex による lock 漏れの問題を修正
room message / announce のログレベルを変更
SetOnMigrated コールバックのパラメータ名の修正
Session
Session の招待がユーザーごとの招待データを保持しないようにした
SessionType 指定時のメンバー ID およびメンバー数を取得するセッションコマンドの追加
setTypeByUser と removeTypeByUser が競合状態になることを抑止
Go Client
Debug コマンドの追加
クライアント
Diarkis ランタイム
全般
UDP サーバから切断する際に、タイミングによって Fin パケットを送信せずに切断することがあったため、切断時に必ず Fin パケットを送信するように修正
各モジュールの OnReset() 関数を削除し Distroy() 関数に変更。Distroy()は、各モジュールのデストラクタ時に内部的に呼び出すように修正
上記に伴い UDP / TCP の Reset イベントを削除
エラーハンドリングのために、各モジュールのコールバックの引数にエラーコードとエラーメッセージを追加 引数で渡されるインスタンスの GetErrorCode と GetErrorMessage でエラー情報を取得可能です。
Trace ログレベルを追加
develop ビルドのライブラリを追加
debug
debug ビルド
develop
release ビルドかつログ出力有効
release
release ビルドかつログ出力無効
エラーメッセージなどのテキストデータをなるべく削減したビルド
ライブラリファイルの配置パスが変わっているためご注意ください
ランタイム内で
std::cout
を使用しないように変更Visual Studio の Address Sanitaizer で Container overflow exception が指摘されるコードが存在したため修正
IOS 環境の Privacy Manifests ファイルをパッケージに追加
platforms/ios/PrivacyInfo.xcprivacy
に配置
コールバックイベントの中でイベントを削除する時の不具合を修正
UDP
一部の Reliable 送信メソッドで 10,000 byte を超えるデータを送信可能な状態となっていたためエラーとして処理するように修正
RUDP の再送間隔が試行回数に応じて段階的に長くすることができるように変更
RUDP の再送信処理が IDiarkisUdp::SetSendRetryInterval で設定した値よりも遅れることがある不具合を修正
DiarkisConnectionEventArgs::GetRecconect の typo を修正
ソケット再作成機能が有効な状態で send retry がタイムアウトしたときに、切断処理を実行する前にソケットの再作成処理を実行するように変更
MatchMaker
DiarkisMMHostEventArgs::GetPayload を廃止
P2P
切断の判定に関連する不具合を修正
ホールパンチ処理を改善
ホールパンチ処理のための通信間隔が試行回数に応じて段階的に長くなるように変更
P2P 接続のデフォルトのタイムアウト時間を 10 秒から 5 秒に変更
P2P モジュールへ明示的な切断処理機能を追加
IDiarkisP2P::Disconnect で切断処理を実行し、IDiarkisP2P::GetDisconnectEvent で切断時のイベント通知を受け取ることができます
P2P 接続成功時、接続失敗時に接続相手の UID を取得できるように機能追加
P2P で bBuffering=false x 暗号化無し でConnect時に、Sendした Payload より大きいサイズのパケットで送られてしまうバグを修正
P2P 接続時にロガーを指定しないとクラッシュする問題を修正
Group
DiarkisGroupEventArgs::GetPayload を廃止
Field
DiarkisField::SyncInit
を廃止しDiarkisField::Join
を追加Field::Leave()
コマンドを追加
DirectMessage
OnConnect イベントが廃止されました
DirectMessage の Disconnect が正しくないコマンドを送信していたため修正
Session
Session から Kick されたときのイベントを追加
DiarkisSession::GetKickEvent を使用してイベントを設定することが可能です。
sessionType を指定して、現在参加中 の Session の情報を取得。 Session::SendGetSessionInfoBySessionType() でリクエストをサーバーへ送信し、Session:: GetSessionInfoEvent で設定するコールバックで結果を取得することができます。
sessionID を指定して、参加していない Session の情報を取得。 Session::SendGetSessionInfoBySessionID() でリクエストをサーバーへ送信し、Session:: GetSessionInfoEvent で設定するコールバックで結果を取得することができます。
Session::SendGetMemberIDs() / Session::SendGetNumberOfMembers() の 廃止
Invite/Accept 周りの仕様を変更 他のユーザーから Invite が送信されると、イベントコールバックで session ID を取得できるように変更しました。 また、これまで Invite に対して Accept で Session に参加するフローとなっていましたが、Session::SendJoin で session ID を指定して Session に参加する方法が推奨となりました。 この変更のため、Invite イベントのコールバック引数が変更されており、また Session::SendAcceptInvite は廃止予定となります。
Session::SendInvite へ招待と同時に任意のメッセージを送信する機能を追加
参加しているセッションの参加メンバーを取得する機能を追加 Session::SendGetMemberIDs でリクエストをサーバーへ送信し、Session::GetMemberIDSEvent で設定するコールバックで結果を取得することができます。
参加しているセッションの参加メンバー数を取得する機能を追加 Session::SendGetNumberOfMembers でリクエストをサーバーへ送信し、Session::GetNumberOfMembersEvent で設定するコールバックで結果を取得することができます。
Session 関連のコマンドのサーバーでの実行結果を取得するための API を追加 On...Response 系のコールバックで実行結果を受け取ることができ、例えばセッションの参加上限に達していて参加できなかった時などのエラーを検知することができます。
OnJoin イベント発生後、Session::GetSessionIDByType() で session ID ではなく UID が返ることがあったため修正
Diarkis Module
全般
Base クラスに DiarkisInit/DiarkisDestroy 関数を追加し、DiarkisInit でロガーを初期化するように修正
ロガーと DiarkisInterfaceBase を分離して、DiarkisInterfaceBase の複数インスタンスを管理できるように修正
ログに Diarkis クライアントのバージョンを表示するように対応
DiarkisInterfaceBase にログファイルを任意の場所に出力するモードを追加
DiarkisInterfaceBase でインスタンス毎に作成していたイベント処理スレッドをランタイム全体を通して1つになるように変更
カスタムアロケーターを使用した std ライブラリのための型を追加
Diarkis::StdString や Diarkis::StdVector 等があり、Diarkis 内部ではこの型を使用して std コンテナを使用しています
基本的にこれらの型はライブラリ内部のみで使用される想定で、アプリ側からは必要な部分でのみ見える形としています
Diarkis ランタイム内でのメモリ確保処理を置き換えるカスタムアロケーターを設定する機能を追加
ICustomAllocator を継承してカスタムアロケーターを実装して Diarkis::SetCustomAllocator() でアロケーターを入れ替えます
room_broadcast サンプルの main.cpp にサンプル実装を追加
DiarkisInterfaceBase のインスタンスが複数存在する状態だと、DiarkisTcp/Udp/P2P で発生したイベントがすぐにイベント処理スレッドに通知されないことがある不具合を修正
この不具合修正にあたり、IDiarkisTcp/Udp/P2P でイベントが発生したときに condition_variable を使用して自動的にスレッドを起床させる実装および WaitCondition を使用してイベント追加待ちを行う仕様が変更されました
新しい実装では IDiarkisTcp/Udp/P2P の GetSchedulerAddNotifyEvent を使用してイベントの追加を検知して、アプリ側がスレッドの挙動をコントロールするしようとなっています
詳細は DiarkisInterfaceBase::RuntimeLoop 周辺の実装をご参照ください
Endpoint 取得関数を GetEndpoint に統一して serverType を渡してサーバの Endpoint を取得できるように修正
外部サーバ経由で取得した UDP サーバ接続情報 を使用して UDPサーバに接続できるように対応
サーバ側で暗号化を無効に設定した際も、暗号化有効で通信しようとする不具合を修正
暗号化や復号化のためのインスタンスをコンストラクタで作成して使いまわすように変更
イベント処理スレッドでまれにイベント処理が追加されたタイミングよりも遅延することがあったため修正
diarkis-module/Extension`のコードを新しい場所に移動。
サンプルで使用している
diarkis-module/Extension
のコードをサンプルの下のdiarkis-module-extension
に移動し、サンプルの実装であることを明確にした。
ビルド時にDiarkis Moduleが提供するデバッグ機能の有効/無効を切り替えるために、
DIARKIS_DEBUG_FEATURES
マクロを使用するように変更した。Diarkis Moduleはアプリケーションと一緒にビルドされるため、デバッグ機能を利用したい場合はアプリケーションのビルド時に
DIARKIS_DEBUG_FEATURES
を定義する。
NATタイプ判定機能を追加する。
DiarkisUdpBase::SendCheckNATType
が実行されると、その結果を
DiarkisUdpBase::OnCheckNATType`で取得できるようにした。
Diarkisモジュールのコーディングスタイルの整理
これに伴い、Diarkis Moduleでprotectedとして公開されている変数名を一部変更した。
基本的に、変数名の末尾に「_」を追加するスタイルに変更しましたので、アプリケーションでビルドエラーが発生した場合は、コーディングスタイルに従って変数名を変更して修正してください。
DiarkisInterfaceBaseで、
LogOutType::FILE_OUT_TO_SPECIFIC_PATH
が指定された場合に、意図しないパスにログフォルダを作成しようとするバグを修正しました。ソースコードテキストフォーマットを UTF-8 with BOM(LF) に統一
Diarkisモジュールで
std::cout
を使用しないように修正した。いくつか new が呼び出されていたコードを修正
サンプル実装で HTTP アクセスに使用している httplib 内では new が呼び出されていますが、こちらはアロケーター置き換え非対応となっております
MacOS の deployment target を 10.13 に変更
iOS と Android の HTTP アクセスに関する実装を整理した。
重複していたコードを整理し、実装を統一した。
Room
SendRelay() で Room::Relay に渡す引数が間違っていて、Replay が正しく動作していなかったため修正。
SyncProperties / ObjectSyncが削除されました。
P2P
ホールパンチに失敗させるデバック機能を追加
DiarkisP2PBase::ConnectClient
で、すでに接続処理を開始したuid
に対する呼び出しは何もしないように修正DiarkisP2PBase::ConnectClient
へ P2P のタイムアウトとバッファリング設定を指定する引数を追加
Session
DiarkisSessionBase::OnSessionCreate
が削除され、
DiarkisSessionBase::OnSessionCreateResponse`が追加されました。DiarkisSessionBase::OnSessionCreateResponse` の引数をチェックすることで、セッションが正常に作成されたかどうかを確認できるようになりました。
Session から Kick されたときのイベントの追加に対応
DiarkisSessionBase::OnSessionKick でイベントを処理することが可能です。
TCP プロトコルに対応
Group
入室中のすべての Group から退出する関数を追加
GroupID を指定して Broadcast を送信する関数を追加
Field
初期時に SendFieldSync() を呼び出した時に、重複して sync() を呼び出していた不具合を修正
Field::SyncInit
の呼び出しが不要になったためDiarkisFieldBase
内でも呼び出さないように変更
MatchMaker
OnIssueTicketResponse() 関数で、IssueTicket の応答を取得できるように対応
SendKick() 関数を追加
TicketBroadcast レスポンスを処理するイベントを追加しました。
DiarkisMatchMakerBase::SendTicketBroadcast
を実行した後、
DiarkisMatchMakerBase::OnTicketBroadcastResponse`を受信することで、送信コマンドが正しく処理されたかどうかを確認できます。
DiarkisMatchMakerbase::OnTicketCancelResponse`は、IssueTicket上でマッチングが行われ、サーバーのスケールインによりチケットが破棄された場合に呼び出されます。
DiarkisMatchMaker::OnCustomCommandTicketMemberLeave`は、IssueTicketを使ってサーバ上でマッチングしたユーザが、サーバのスケールインによってチケットから離脱した場合に呼び出されます。
これは Diarkis Module Extension 側の実装なので、利用する場合はアプリ側にも同じ実装を追加する必要があります。
Host/Searchの後ろでルームに参加する場合、サーバー再接続時の参加タイミングが変更されたため、CatchOnReconnect関数を削除しました。
RPC
RPCAll() / RPCMany() / RPCOne() を virtual 関数に変更
サンプル
session_simple サンプルを追加
session_simple サンプルで、3333 クライアントが 4444 クライアントがセッションに入室する前に Broadcast して失敗していたので、4444 クライアントが入室するのを待つように修正
directmessage_simple サンプルを追加
directmessage_simple サンプルに、外部サーバ経由で UDPサーバ接続情報 を取得して情報をセットするサンプルコードを用意
Android 版サンプルを追加
iOS 版サンプルを追加
最終更新