私はQuake 2から大まかに派生したゲームエンジンに取り組んでおり、スクリプト化された効果のようなものを追加しています(クライアントが可能な限られた数のハードコードされた効果のみを持つのではなく、サーバーがクライアントに詳細に特殊効果を指定できるようにします) of.) これは、ネットワーク効率と柔軟性のトレードオフです。
面白い壁にぶち当たりました。最大パケット サイズは 2800 バイトで、フレームごとにクライアントごとに 1 つのみ送信できます。
「火花」エフェクトを実行するスクリプトは次のとおりです (弾丸の衝突火花、電気ショックなどに適しています) http://pastebin.com/m7acdf519 (理解できない場合は、気にしないでください。これは私が作成したカスタム構文であり、私が求めている質問には関係ありません.)
そのスクリプトのサイズを縮小するために可能な限りのことをしました。変数名も 1 文字に減らしました。しかし、結果はちょうど 405 バイトです。つまり、フレームごとに最大 6 個のこれらを収めることができます。また、サーバー側の変更でさらに 12 削減できる可能性があることと、プロトコルの変更でさらに 6 削減できる可能性があることも念頭に置いています。ただし、どのスクリプトを使用しているかによって、節約できる量は異なります。
ただし、これらの 387 バイトのうち、41 バイトだけが効果の複数の使用法の間で一意であると推定されます。つまり、これは圧縮の最有力候補です。
R1Q2 (拡張ネットワーク プロトコルを備えた後方互換性のある Quake 2 エンジン) に Zlib 圧縮コードが含まれているのはたまたまです。私はこのコードを持ち上げるか、少なくとも参照として厳密に従うことができます。
しかし、ここでは Zlib が必ずしも最良の選択でしょうか? 少なくとも 1 つの代替手段、LZMA を思いつくことができます。
要求事項:
- 非常に高速である必要があります (1 秒間に 100 回以上実行した場合、パフォーマンスへの影響が非常に小さい必要があります)。
- できるだけ多くのデータを 2800 バイトに詰め込む必要があります
- メタデータのフットプリントが小さい
- GPL互換
Zlib は良さそうですが、もっと良いものはありますか? このコードはまだマージされていないため、実験の余地が十分にあることに注意してください。
ありがとう -マックス
編集:スクリプトをバイトコードにコンパイルすることを提案した人に感謝します。私はこれを明確にするべきでした--はい、私はこれを行っています。必要に応じて、私の Web サイトで関連するソース コードを閲覧できますが、まだ「きれいに」作成されていません。
これはサーバー側のコードです:
Lua コンポーネント: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/lua/scriptedfx.lua
C コンポーネント: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source /game/g_scriptedfx.c
私が投稿した特定のサンプル スクリプトの場合、これは 1172 バイトのソースを 405 バイトに減らしますが、それでも十分小さくはありません。(これらをできるだけ多く 2800 バイトに収めたいことに注意してください!)
EDIT2: 特定のパケットが到着するという保証はありません。各パケットには、以前のパケットで伝達された情報に依存することなく、「世界の状態」が含まれていると想定されています。通常、これらのスクリプトは「見栄え」を伝えるために使用されます。1 つの余地がない場合、パケットからドロップされますが、それは大したことではありません。しかし、あまりにも多くのドロップが発生すると、見た目がおかしくなり始めます。これは望ましくありません。