2009-08-23 7 views
7

私は、Web WorkersとJohn Resigの素晴らしいProcessing.js(まあ、まったく新しい 'Javascriptコンセプト '、しかしあなたは私の考えを得る)。どちらの素晴らしい例もインターネットをさまよっていますが、どちらのテクニックも効果的に使用しているものはまだありません。それはかなり面白いと私には強力なので、私はちょうどそれを試してみるほうがいいと思った。Processing.jsとWeb Workersのパワーを組み合わせる

しかし、私は実際にそれらの2つを統合するための最高のスクリプトデザインを見つけることができません... Processing.jsが採用されているとき、通常、いくつかのクラスが定義されているようです 'Processing -応用'。これは、Javaのような構文を使用してこれを行うことができます。しかし、これらのクラスはProcessingアプリケーション内でのみアクセス可能です。しかし、我々は労働者を持っている... this驚くべき例では、Javascript関数オブジェクトは最初に別のスクリプトで定義され、Worker-usageが必要な場合、Worker-scriptはそのオブジェクトのプロトタイプと種類の 'それ自体に

私には、Workerスクリプトの中で、Processing-applicationで定義したクラスにアクセスできないという意味で、2つは「互換性がありません」と思われます。おそらく理由のために、Processingのようなクラスは間違いなくJavascriptのようなものではないからです。私が見る限り、私はWorkerスクリプトでクラスの同様の定義を(新しい関数プロトタイプの形で)作成する必要があります。これはメンテナンス性にはあまり良くなく、ひどく悪いデザインのようです私はまだこのテーマについては大変な初心者ですが、私にはそうです。

私は何か見落としていますか?私は何かがほしいと思っていますか?それとも、私はいくつかの基本的な概念を誤解していますか?

ありがとうございました!

編集:

が、ために作業を行うことになっていますオブジェクトのような「形」にするために労働者のプロトタイプをいじってみてくださいするようになったが、これは進むべき道ではないかなりすぐに実現。

作業の概要を試してみましょう: 私はクラス「ボール」を持っていますが、2次元の位置を保存する以外は何もしません。すべてのdraw()サイクルでProcessing.jsはupdate()メソッドを呼び出し、ボールを新しい位置にします。その後、display()メソッドが呼び出され、Ballはその現在の位置に小さな円を描きます。

はじめに複雑なことはありません。ここで、ボールの新しい位置を決定することは、例えば複雑な重力場を通じたボールの動きを含む場合、かなり高価な操作であると仮定します。この計算を描画する前に毎回行う必要がある場合は、少なくともいくらかの遅延が発生します。しかし、このようなことを同時に行うことができれば、よりスムーズな実行が可能になります。だから、Ballクラスにプロパティリストに余分な「ポジション」配列を与えることができました。その配列は連続するすべての場所を保持します。ボールがインスタンス化されると、位置の計算を開始する新しいワーカーが作成され、完了するたびに新しい2次元位置を含むメッセージがボールにポストバックされます。 Ballはこの位置の配列上でこれを押します。その位置を更新するたびに、配列内の次のレコードに移動します。

全体的に - 良いか悪いのですか?良い場合は、どのようにこれを設計するための提案?

答えて

3

3Dゲーム物理学シム(xbox360のような)は通常、フレームレートとは無関係に固定レートで動作します。なぜなら、物理学は解析的にモデル化するにはあまりに複雑すぎるため、数値近似を行うため、エラーを確定的に同期させる必要があります。さらに、フレームレートは物理性能と切り離されているため、物理的な状態を5hzで更新したり補間などを行うことができます。

あなたが記述したモデルは、プロの方法とまったく同じです。

0

この例では、ボールを描画する前に位置の計算を完了しなければならないため、非同期処理は意味をなさないでしょうか?

p5自体は非常に同期しています - すべての図面を行うドローの方法があります。

また、Webワーカーはdomにアクセスできないため、描画に使用することはできません。

ゲームのようなより複雑なイベントベースのアプリケーションでは、Webワーカー用の使用が可能です。

+0

いいえ、これはそうではありません - 描画が初期化されると、新しいものが見つかるたびに、それはメインスレッドに提出されます。そこには、一種の「キャッシング」配列に格納されているので、後で使用することができます。ただし、描画が行われている間は計算が続行されるため、フレームごとに遅延はなく、開始するまでに遅延はありません。 – JorenB

0

ちょっと考えましたが、signal processingでは、アナログ信号をデジタル情報にスライスするサンプルレートが用意されています。キーは、オリジナルを再現するのに十分な信号を保持することです。 MP3の曲は128,192などを使ってリッピングされます。

したがって、ボールを数学的に定義可能な方法で(つまり放物線に沿って)動かしている場合、パスをセットに変換できるはずですアナログ経路に近似する座標の座標。これらのコードは、完全なパスよりもはるかに速く計算されます。また、(サンプリングレートを変更することによって)チューニングも可能です。

Processing.jsやWeb Workersに関するご質問はありません。これらの計算をより効率的に行うためのアイデアです。

+0

この回答を提出する前にProcessing.jsが何であったのか分かりませんでした。私は何かを助けるかもしれないものを提供することに関しては基本的な方法ではないと確信しています。 Processing.jsはすでに私が上で説明した信号処理コンセプトのかなり良い仕事をしているようです。 – Rake36

0

このアイデアは、GoogleのタスクキューのアイデアがGoogle App Engineに統合されていることを思い出させます。

http://code.google.com/appengine/docs/python/taskqueue/

これはあなたを助けるかもしれません。

私の非同期オンラインボードゲームでは、メッセージの履歴が保存されているので、プレイヤーは自分のターンではなかったときに何が起こったかを見ることができます。起こったことはそれぞれ固有のIDを取得し、プレーヤーにメッセージが送信されるたびに、受信した最新のものを追跡します。その後、彼らは戻ってくると、最後に受け取ったメッセージから発生したすべてのものを簡単に見ることができます。

そして私は、私は、クライアントが待機していない間に何かを処理するためにサーバを必要とするポイントに得れば、私は

1

あなたが定義したクラスにアクセスすることはできませんタスクキューを使用しますWorkerスクリプトを使用している場合は、Processing-applicationの にあります。おそらく理由のために

これは、複数の作業者が同じ共有データを同時に変更することによるエラーを防ぐためです。メッセージでは、データがコピーされ、各ワーカーは独自のコピーを取得するので、エラーの原因となる同時書き込みについて心配する必要はありません。これは、プログラマが心配することなくそれを処理する同時実行エラーを回避する簡単な方法です(セマフォや同期などはありません)

関連する問題