6

ペン、消しゴム、長方形、円、選択、テキストなどのさまざまな「描画ツール」を使用して、独自の描画プログラムを用意しています。

Python と wxPython で作成されています。上記の各ツールはクラスであり、すべて left_down()、mouse_motion()、hit_test() などのポリモーフィック メソッドがあります。プログラムは、描画されたすべての形状のリストを管理します。ユーザーが形状を描画すると、それが追加されます。リストに。これは、取り消し/やり直し操作の管理にも使用されます。

そのため、共同描画をフックできる適切なコードベースがあります。各形状を変更して、その所有者 (それを描いたユーザー) を認識し、1 人のユーザーが所有する形状に対してのみ削除/移動/サイズ変更操作を実行できるようにすることができます。

これを開発する最善の方法を考えているだけです。「セッション」の 1 人がサーバーとして機能する必要があります。無料の中央サーバーを提供するお金がありません。どういうわけか、ユーザーはサーバーに接続する方法が必要になります。つまり、ある種の「サーバーを検出する」ブラウザ...または何かを意味します。アプリケーションに加えられた変更をブロードキャストするにはどうすればよいですか? リアルタイムで描画し、各マウス モーション イベントでメッセージをブロードキャストすると、パフォーマンスの面でコストがかかり、特定の時間に多くのユーザーがいるほど事態は悪化します。

任意のアイデアを歓迎します。これをどこから開発を開始すればよいか (またはテストする方法さえも) よくわかりません。

4

1 に答える 1

14

リアルタイムの共同ツール/ゲームを作成することは、クライアント間で最小限の共有データ構造で変更を効率的に同期することに要約されます。ネットワーク帯域幅がボトルネックです。共有データの同期に絶対に必要な情報のみを送信します。個々のピクセルではなく形状を保存することで、正しい軌道に乗っています。ただし、シェイプはマウス イベントを処理するべきではありません。ご指摘のとおり、マウス イベントをブロードキャストすると、ネットワーク帯域幅がすぐに飽和してしまいます。代わりに、マウス イベントによって形状がどのように変更されるかのデルタを渡します。たとえば、mouse_motion() を送信する代わりに、形状が移動された後の最終位置 [x,y] を送信します。

描画プログラムをサーバー部分とクライアント部分に分割することをお勧めします。サーバーは、共有データの信頼できるバージョンを保持します。クライアントが共有データ構造を直接操作することはありません。サーバーにネットワーク メッセージを送信するだけです。クライアントとサーバーの両方が同じプロセス/PC にある場合、これはばかげているように思えるかもしれませんが、いくつかの正当な理由があります。

  1. シングルユーザーとマルチユーザーの両方の共有コード パス
  2. ローカル ソケットを使用すると、同じプロセス内のクライアントとサーバー間のネットワーク オーバーヘッドがほぼゼロになります。

さらに、編集はその形状の所有者に限定する必要はありません。サーバーは最終的な権限であるため、2 人が同時に同じ形状を取得し、結果をクライアントに送り返すと、競合が解決されます。(ただし、元に戻すには少し注意が必要です。)

集中サーバーはネットワーク検出に最適ですが、クライアントは他の方法を使用してサーバーを見つけることができます。

  1. ネットワークブロードキャスト パケットを送信またはリッスンします。
  2. IP アドレスを介して直接接続します。(サーバーの IP アドレスは、チャット、携帯電話、部屋全体での叫び声、伝書鳩など、他の手段で伝達する必要があります。)

最後に、他のマルチユーザー アプリケーションがどのように設計されているかを見てみましょう。ここではいくつかの例を示します。

  • Zoidcomマルチプレイヤー ゲーム プログラミング ライブラリ (C++)。この回答の多くは、Zoidcom のドキュメントからの情報に基づいています。ネットワーク ブロードキャストによるサーバー検出を示すサンプル プログラムもあります。
  • Wave、Google Docs の背後にある運用変換アルゴリズム。( Hacker News の記事ディスカッション)
  • Etherpadオープンソースのリアルタイム コラボレーション テキスト エディタ。
  • Source Multiplayer Networking HAlf-life のような FPS がどのように設計されているかを説明します。ラグ/レイテンシーを減らすためのトリックを学びます。
  • Google Wave (明らかに、ドキュメントはまだかなり貧弱です...)
于 2010-05-22T21:12:09.697 に答える