質問

サードパーティのプラグインを使用せずに、Pure JavaScriptとHTML5でゲームを開発することを考えています。私が直面している問題は、ゲームの異なる「モジュール」をレンダリングジョブ、ゲームロジック、アセットの読み込みなど、個別のスレッドに分離する方法を見つけることができないことです。

Webワーカーはコードを異なるスレッドに分離できるように見えますが、問題は私がそれらの間で渡すことができる限られた情報です。たとえば、レンダリングジョブの場合、ワーカースレッドがメモリを共有できないため、ゲームの更新ごとにすべてのエンティティ、メッシュ、テクスチャなどを使用して、「世界」全体を渡す必要があります。静的オブジェクトを初期化(メッシュ、テクスチャ)でのみ送信するように最適化でき、更新時にオブジェクトの状態のみを送信します(世界変換)が、それでも望ましくありません。

それらの間に大きなデータを送信したり、オブジェクトを共有したりする方法はありますか?それとも、真のマルチ読み取りを完全に達成することで、まったく別の方法がありますか?プラグイン/ギアを使用してこれを達成する簡単な方法があることは知っていますが、Open Webで利用可能な方法のみを使用する必要があります。

役に立ちましたか?

解決

JavaScriptのWebワーカーは、何らかの方法でより良い同時プログラミングモデルです。たとえば、それはイベント駆動型であり、共有オブジェクトはありません。これは、グリッドロックに入ることができないことを意味します(ロックがまったくないため)、2つのスレッドで同時に変更されてオブジェクトが無効な状態に入ることができません。

問題は、このモデルの上部に従来のゲームシステムを簡単に積み重ねることができないことです。そのため、このプログラミングモデルを採用するための新しい方法でゲームシステムを設計する必要があります。これは費用がかかる可能性があると思います。

他のヒント

あなたはおそらくウェブワーカーを見たいと思うでしょう、私は彼らとの経験はありませんが、彼らのことを聞いたことがあります。あなたを正しい方向に導くかもしれません。

http://ejohn.org/blog/web-workers/

ウェブワーカー JSのマルチスレッドに最も近いものです。
この時点で。
フルストップ。

sans webワーカー私が知っているJavaScriptでマルチスレッドを行う本当の方法はありません。

ただし、特定のタスクを実行する時間に費やす時間を優先するために、ロジックを使用することもできます。州に情報を保存する機能を作成できます(したがって、ループを終了してから後で戻すことができます)。各ループは、状態を節約するまでの時間を知っているだけで、機能を終了します。

したがって、forループには時間状態もあります...

//Loop over some iterator, exit if time is up
for (i = 1; i < max || timeNotUp(); i++)
{
}

//If exiting normally 
if (i == max)
{ //do somthing
}
//otherwise, save state
else
{
    this.i = i;
    this.otherStuff = otherStuff;
}

この方法でコードを優先することは間違いありません。しかし、欠点があります。状態を保存することは、クリーンに簡単に従うことができません(特にループ内のループを使用)。また、時間をチェックして状態を節約しているため、それほど速くはありません。

ゲームの側面を構成するための機能的なアプローチをお勧めします。例を参照してください http://www.flapjax-lang.org.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top