7

私は Javascript 言語の 2 つの (比較的) 新しい概念、Web Workers と John Resig の素晴らしい Processing.js (実際には新しい「Javascript の概念」ではありませんが、私の考えはわかります) について読んでいます。両方の優れた例がインターネットを徘徊していますが、両方の手法を効果的に使用する例をまだ見つけていません。私にはかなり面白くて強力に見えるので、試してみようと思いました。

しかし、この 2 つを統合するための最適なスクリプト設計を実際に把握することはできません... 通常、Processing.js を使用する場合、「処理アプリケーション」内でいくつかのクラスが定義されているように思えます。これにより、Java のような構文を使用してこれを行うことができます。ただし、これらのクラスは Processing-application 内でしかアクセスできません。これは明らかです。しかし、次に Workers を取得します...この驚くべき例では、Javascript 関数オブジェクトが最初に別のスクリプトで定義されます。Worker の使用が必要な場合は、Worker スクリプトがそのオブジェクトのプロトタイプと種類の「ボルト」をインポートします。それ自体。

Worker スクリプトを使用している場合、Processing-application で定義したクラスにアクセスできないという点で、この 2 つは「互換性がある」とは思えません。おそらく、Processing に似たクラスは Javascript にあまり似ていないため、おそらく理由があります。私が見る限り、Worker スクリプトで (新しい関数プロトタイプの形式で) クラスの同様の定義を作成する必要があります。これは保守性にあまり良くなく、ひどく悪い設計のように思えます。私はまだこの件に関しては初心者ですが。

私は何かを見落としていますか?本来あるべきではないものが欲しいですか?それとも、いくつかの基本的な概念を誤解しているだけですか?

助けてくれてありがとう!

編集:

Worker のプロトタイプをいじって、それが機能するはずのオブジェクトのようにそれを「形作る」ことを試みましたが、すぐにこれが進むべき道ではないことに気付きました。

動作するアウトラインを試してみましょう: 私はクラス 'Ball' を持っていますが、これは 2 次元の位置を保存すること以外はほとんど何もしません。draw()Processing.js はすべてのサイクルでそのupdate()メソッドを呼び出し、Ball に新しい位置を採用させます。その後、display()メソッドが呼び出され、Ball が現在の位置に小さな円を描画します。

最初から複雑なことは何もありません。ここで、ボールの新しい位置を特定するのはかなりコストのかかる操作であると仮定します。たとえば、「複雑な」重力場をボールが移動する場合などです。この計算を描画の前に毎回実行する必要がある場合、少なくともいくらかの遅延が発生します。ただし、これらを同時に行うことができれば、よりスムーズに実行できる可能性があります。そこで、Ball クラスのプロパティ リストに追加の 'positions' 配列を与えることができると考えました。これにより、連続するすべての位置が保持されます。Ball がインスタンス化されると、位置の計算を開始する新しい Worker が作成され、位置の計算が完了するたびに、新しい 2 次元位置を含むメッセージが Ball にポストバックされます。次に、ボールはこれを位置配列にプッシュします。

全体として、良いアイデアか悪いアイデアか?良い場合、これを設計する方法について何か提案はありますか?

4

5 に答える 5

3

3D ゲームの物理シミュレーション (xbox360 など) は通常、フレームレートに関係なく固定レートで実行されます。これは、物理学が複雑すぎて分析的にモデル化できないため、数値近似を行うため、エラーを決定論的に同期する必要があるためです。追加の利点は、フレームレートが物理パフォーマンスから分離されているため、物理を 5hz で更新して補間などを行うことができることです。

したがって、あなたが説明するモデルは、まさにプロが行う方法です。

于 2009-09-01T20:55:04.530 に答える
1

ワーカー スクリプトを使用している場合は、処理アプリケーションで定義したクラスにアクセスできません。おそらく何らかの理由で

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

于 2010-11-06T18:27:29.813 に答える
0

ちょっと考えただけですが...信号処理では、アナログ信号をデジタル情報にスライスするサンプルレートを考え出すことです. 重要なのは、オリジナルを再現するのに十分な信号を保持することです。128、192 などを使用して音楽ファイルから MP3 をリッピングする方法と同様です。

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

これが Processing.js や Web Workers に関する質問のいずれにも対応していないことは承知しています。これらの計算をより効率的に実行するのに役立つアイデアです。

于 2009-09-01T01:28:44.690 に答える
0

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

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

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

私の非同期オンライン ボード ゲームでは、メッセージの履歴が保持されるシステムを実装して、プレーヤーが自分の番ではないときに何が起こったかを確認できるようにします。発生したことごとに一意の ID が取得され、プレーヤーにメッセージが送信されるたびに、受信した最新のメッセージが追跡されます。その後、戻ってきたときに、最後に受信したメッセージから発生したすべてのことを簡単なアニメーションで見ることができます。

そして、クライアントが待機していない間にサーバーが何かを処理する必要がある場合は、タスク キューを使用します。

于 2009-09-02T14:16:35.757 に答える
0

この例では、ボールを描画する前に位置の計算を終了する必要があります。非同期処理は意味がないのでしょうか?

p5 自体は非常に同期的です。すべての描画を行う中心的なdrawメソッドが 1 つあります。

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

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

于 2009-08-25T12:20:31.523 に答える