2016-08-17 10 views
1

私は、複数のユーザーが同じホワイトボードを見て、それを描くことができる楽しいオンラインホワイトボードアプリケーションを作成しています。私はWebSocket(フロントエンドではバニラJS、バックエンドではScala)を使用していますが、今は基本的にマウスイベントを1人のユーザーから残りのユーザーにブロードキャストし、イメージをクライアント側にレンダリングしています。多くのストリーミングと共有状態のデザインパターン

しかし、これは一時的な共有状態になりますが、ユーザーはいつでもホップして保存された共有状態を確認できます。私はこれがおそらくバックエンドとフロントエンド上で共有レンダリングコードを持つ必要があると考えているので、クライアントはストリームとしてイベントをレンダリングしますが、クライアントが関連するときにサーバは生のイメージデータを送ることができます。

私の質問はここです:私はこの種のプロジェクトに気づくべき他のデザインパターンは何ですか?これは楽しい/学習のためのプロジェクトなので、これは自由な質問ですが、この種のデータフローに役立つ参考資料が含まれています。

答えて

2

私の質問はここにあります:私は のこの種のプロジェクトに気付かなければならないいくつかの他のデザインパターンは何ですか?

サーバー上にレンダリングコードを持つ必要はありません。現在のホワイトボードにつながったすべての蓄積されたイベントを保存して新しいクライアントに送信するだけで、新しいクライアントがすべてのイベントが起きたときにリッスンしているかのようにホワイトボードをレンダリングさせることができます。

実用以上のデータの場合は、生のイベントを圧縮できます。例えば、直線またはほぼ直線のセグメントは、介在するマウスの位置をすべて必要とするわけではありません。実際には、セグメントの最初と最後の位置が必要です。

+0

@Nathan - これはあなたの質問に答えましたか? – jfriend00

+0

これは良い答えですが、私がすでに考えていることです。私が持っているマウスイベントの数は非常に高価になり、あまりにも多くの解像度を失うことなくイベントをあまりにも圧縮することはできません。 ここではいくつかの外部リソースを使って何かを探しているので、答えを受け止めるつもりです。たとえば、いくつかの大規模なマルチプレイヤーゲームはこの種の問題に対処します。しかし、答えをありがとう! – Nathan

+0

@Nathan - 最初と最後のポイントに直線セグメントを圧縮すると、データ量が少なくて済み、解像度が失われ、レンダリングされた画像ほど正確ですが、よりコンパクトです。したがって、適切な圧縮は、欠点のない多くの意味をなす。レンダリングはすべての中間点を保存します。これは、ベクトルグラフィックスとビットマップグラフィックスの違いです。 GoogleがビットマップグラフィックスからGoogleマップのベクトルグラフィックスに移行した大きな理由があります。方法はより効率的です。 – jfriend00

関連する問題