タグ付けされた質問 「multithreading」

マルチスレッドを使用すると、同じリソースを共有する単一のプロセスのコンテキスト内に複数のスレッドを存在させることができますが、独立して実行できます。

2
Time.deltaTimeを使用しているにもかかわらず、動きはフレームレートに依存しているように見える
Unityでゲームオブジェクトを移動するために必要な変換を計算する次のコードがありますLateUpdate。これはで呼び出されます。私が理解していることから、私の使用はTime.deltaTime最終的な翻訳フレームレートを独立させるべきCollisionDetection.Move()です(ただレイキャストを実行することに注意してください)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

5
アクターとしてのスプライト
私はゲーム開発の質問ではなく、プログラマーとしての経験があります。Scala言語では、非常に安定した、アクターによるスケーラブルなマルチタスクを実行できます。問題なく数十万を同時に実行することもできます。 したがって、2Dスプライトの基本クラスとしてこれらを使用して、すべてのスプライトを通過して移動する必要があるゲームループの問題を解決できると考えました。基本的には、イベント駆動型で自分自身を動かします。 それはゲームにとって意味がありますか?そのようにマルチタスクされていますか?結局のところ、JVM上で実行されますが、最近ではそれほど問題にならないはずです。 編集: しばらく手をたたいてから、このアイデアには本当の利点が1つしかないことに気付きました。マルチコアサポートです。単純なゲームループは1つのコアでのみ実行され、すべてを順番に処理します。 最近のコンピューターは、自宅でも2つ以上のコアが組み込まれているため、ゲームプログラマーが他のコアを効率的に使用できるようにすることをお勧めします。結局のところ、通常、プレーヤーは自分の8コアマシンでゲームを実行しているだけだと思います。 私が見る他の利点は、Scalaでを持つことができることですRemoteActors。これはまったく同じ方法で処理できますが、別のコンピューターで実行できます。したがって、これによりネットワークゲームも簡素化される可能性があります。 できるだけ早くScala 2Dエンジンに組み込むつもりです。

1
別のスレッドのシーングラフ
私は楽しみのために独自のゲームエンジンを開発しています(利益ではありません)。あるスレッドでレンダリングし、別のスレッドでシーングラフを更新します(速度など)。レンダリングの時間になると、レンダリングスレッドは可視ノードを新しい線形バッファーに追加し、それらをトラバースします。 より詳細には、シーングラフはトリプルバッファリングされています。シーングラフの各ノードには、相対および絶対変換マトリックス(4x4)の3つのコピーがあります。任意の時点で、1つのコピーはシーングラフスレッドによって書き込まれ、1つのコピーはレンダラーによって読み取られ、3つ目のコピーは存在します。これにより、レンダリング中の何かへの書き込みや、半分更新されたシーングラフのレンダリングが防止されます。どういうわけか、ユーザーが更新スレッドと競合しないように作業するために、各マトリックスの4番目のコピーも取得しました。これは、常に同期する必要を回避することでうまく機能するようです。 しかし、これは混乱です。 これらは、システムの私の最終的な目標です。 レンダリングとシーングラフの更新は別々のスレッドにとどまります。 これらのスレッドが互いに待機する必要がある量を最小限にします。 更新スレッドによって途中で更新されたシーンをレンダリングしないでください。これは、カメラが高速で移動していて、更新の前後にレンダリングされることがある場合に特に顕著です。 メモリ使用量の削減。ノードごとに行列が多すぎます。また、マトリックスでの浮動小数点ドリフトの増加により、位置/回転/スケールのベクトルへの移動を検討しています。 数万のノードを処理する機能。現在のシステムはこれをかなりうまくやっています。 また、Bullet(物理エンジン)とネットワークを将来的に組み込むことを望んでいますが、どちらもあまり考えていません。 より良いシーングラフを達成するためのいくつかのアプローチは何ですか?

2
非同期操作/コルーチンを待つ方法は?
Unity 5でコルーチンと非同期操作が完了するのを待つ一般的で再利用可能な方法を探しています。C#5のawaitキーワードと同様です。 私が考えることができる最も簡単な方法は次のようなものです: public class SomeUtility { public bool IsDoingSomething { get; private set; } public IEnumerator DoSomethingAsync() { IsDoingSomething = true; yield return new WaitForSeconds(2); IsDoingSomething = false; } } そして別のコルーチンで: while(!someUtilityInstance.IsDoingSomething) yield return null; ただし、whileステートメントでコードが乱雑になり、再利用できず(単純なユーティリティ関数でもインスタンスと専用クラスが必要です!)、必要のない場所にシングルトンまたは静的なものがたくさんあるため、これはあまり良くありません。 私が見つけた最も近いものはUnityを使用していAsyncOperationます。これは非常にうまく機能します: public static IEnumerator Await(this AsyncOperation operation) { while(!operation.isDone) yield return operation; } …

2
別々のスレッドで更新してレンダリングする
シンプルな2Dゲームエンジンを作成しています。スプライトをさまざまなスレッドで更新してレンダリングし、その方法を学びたいと思います。 更新スレッドとレンダリングスレッドを同期する必要があります。現在、2つのアトミックフラグを使用しています。ワークフローは次のようになります。 Thread 1 -------------------------- Thread 2 Update obj ------------------------ wait for swap Create queue ---------------------- render the queue Wait for render ------------------- notify render done Swap render queues ---------------- notify swap done この設定では、レンダリングスレッドのFPSを更新スレッドのFPSに制限しています。さらにsleep()、レンダリングと更新の両方のスレッドのFPSを60に制限するために使用するので、2つの待機関数はそれほど待機しません。 問題は: 平均CPU使用率は約0.1%です。場合によっては、25%に達することがあります(クアッドコアPCの場合)。これは、待機関数がテストおよび設定関数を使用したwhileループであり、whileループがすべてのCPUリソースを使用するため、スレッドが他のスレッドを待機していることを意味します。 私の最初の質問は:2つのスレッドを同期する別の方法はありますか?私は気づいたstd::mutex::lock、それは、whileループではないので、リソースをロックするために待っている間、CPUを使用しないでください。どのように機能しますか?std::mutex1つのスレッドでロックし、別のスレッドでロック解除する必要があるため、使用できません。 他の質問です。プログラムは常に60 FPSで実行されるため、CPU使用率が25%に急上昇することがあるのはなぜですか。(2つのスレッドはどちらも60fpsに制限されているため、理想的には多くの同期は必要ありません)。 編集:すべての返信をありがとう。まず、レンダリングのためにフレームごとに新しいスレッドを開始しないようにしたいと思います。最初に、更新とレンダーループの両方を開始します。マルチスレッディングで時間を節約できると思います。FastAlg()とAlg()という関数があります。Alg()は私の更新objとrender objの両方であり、Fastalg()は私の「レンダーキューを「レンダラーに送信」」しています。シングルスレッドでは: Alg() //update FastAgl() Alg() //render 2つのスレッド: Alg() //update while …

3
エンティティ/コンポーネントシステムでエンティティを同時に処理するための読み取り/計算/書き込みステップを効率的に分離
セットアップ エンティティコンポーネントアーキテクチャがあり、エンティティは一連の属性(動作のない純粋なデータ)を持つことができ、そのデータに作用するエンティティロジックを実行するシステムが存在します。基本的に、やや疑似コードで: Entity { id; map<id_type, Attribute> attributes; } System { update(); vector<Entity> entities; } すべてのエンティティに沿って一定の速度で移動するシステムは、 MovementSystem extends System { update() { for each entity in entities position = entity.attributes["position"]; position += vec3(1,1,1); } } 基本的に、私はupdate()をできるだけ効率的に並列化しようとしています。これは、システム全体を並行して実行するか、1つのシステムの各update()にいくつかのコンポーネントを与えることにより、異なるシステムが同じシステムの更新を実行できるようにして、そのシステムに登録されたエンティティの異なるサブセットに対して実行できます。 問題 示されているMovementSystemの場合、並列化は簡単です。エンティティは相互に依存せず、共有データを変更しないため、すべてのエンティティを並行して移動できます。 ただし、これらのシステムでは、エンティティが相互にやり取りする(データを読み書きする)ことが必要な場合があります。同じシステム内でも、相互に依存する異なるシステム間である場合がよくあります。 たとえば、物理システムでは、エンティティが互いに相互作用する場合があります。2つのオブジェクトが衝突し、それらの位置、速度、およびその他の属性がオブジェクトから読み取られて更新され、更新された属性が両方のエンティティに書き戻されます。 エンジンのレンダリングシステムがエンティティのレンダリングを開始する前に、他のシステムが実行を完了するのを待って、関連するすべての属性が必要な属性であることを確認する必要があります。 これを盲目的に並列化しようとすると、異なるシステムが同時にデータを読み取り、変更する可能性がある従来の競合状態が発生します。 理想的には、他のシステムが同じデータを同時に変更することを心配することなく、またプログラマが実行と並列化を適切に順序付けすることを気にすることなく、すべてのシステムが必要なエンティティからデータを読み取ることができるソリューションが存在しますこれらのシステムを手動で(場合によっては不可能になることもあります)。 基本的な実装では、これはすべてのデータの読み取りと書き込みをクリティカルセクションに配置するだけで実現できます(ミューテックスで保護します)。しかし、これは大量のランタイムオーバーヘッドを引き起こし、パフォーマンスに敏感なアプリケーションにはおそらく適していません。 解決? 私の考えでは、考えられる解決策は、データの読み取り/更新と書き込みが分離されているシステムであり、1つの高価なフェーズでは、システムはデータの読み取りと計算に必要なものだけを計算し、何らかの方法で結果をキャッシュしてからすべて書き込みます。別の書き込みパスで変更されたデータをターゲットエンティティに戻します。すべてのシステムは、フレームの先頭にある状態でデータに作用し、その後、フレームの終わりの前に、すべてのシステムが更新を完了すると、シリアル化された書き込みパスが発生し、すべての異なるキャッシュ結果がキャッシュされますシステムは反復され、ターゲットエンティティに書き戻されます。 これは、簡単な並列化の勝利が結果のキャッシュと書き込みパスのコスト(実行時のパフォーマンスとコードのオーバーヘッドの両方の点で)を上回るほど大きくなる可能性がある(多分間違っているか?)という考えに基づいています。 質問 最適なパフォーマンスを実現するために、このようなシステムをどのように実装するのでしょうか?そのようなシステムの実装の詳細と、このソリューションを使用するエンティティコンポーネントシステムの前提条件は何ですか?

1
マルチスレッドOpenGLアプリケーションを使用してVBOを更新し、それらを同時に使用する方法
簡単なアプリケーションがあります。2つのスレッドがあり、それぞれに独自のレンダリングコンテキストがありますが、1つのVBOを共有しています(これは機能しており、テストしました)。 ここで私が欲しいのは、1つのスレッドがVBOの前半から一部のデータをレンダリングし、2番目のスレッドがVBOの2番目の部分を更新していることです。 VBOを更新しない場合、問題なく動作しています。 しかし、更新時に奇妙な問題がいくつかあります。glMapBuffer(2番目のスレッドで)VBOを更新するために使用すると、ほとんどの場合、最初のスレッドでは何もレンダリングされませんglClear。画面全体が(呼び出し後)クリアになります。VBOからのデータにアクセスできないようです(これは理解できます。これは、バッファー全体がマップされており、何らかの方法でロックできるためです)。 をglMapBufferRange使ってみましたGL_MAP_UNSYNCHRONIZED_BIT。これは、「あなたが望むようにVBOを待たずに使用しないでください。私(プログラム)が自分で同期するからです」を意味します。また、VBOの範囲をマップして別の部分からデータをレンダリングするとき、それは待っているべきではありませんが、私と同じ問題が発生していますglMapBuffer。 誰かがこれを修正するのを手伝ったり、なぜそれが起こるのか説明したりできますか?

2
UDPノンブロッキングまたは受信用の別のスレッド?
マルチプレイヤーゲーム(64歳未満のプレイヤー向け)を作成しています。私はすでにネットワークループ用に別のスレッドを用意することを決めましたが、UDPを受信するための追加のスレッドを作成するのか、受信用ソケットを非ブロッキングに設定する(追加のスレッドなしで)のが良いのか疑問に思っていました。 または、非同期ソケットのような別の方法を使用する方が良いですか?より良い方法はいつでも歓迎です!

5
Vector3で演算子 '> ='を使用できないのはなぜですか?
私は私がように参照する2つの位置の間を移動するための四角形を取得しようとしている_positionAとします_positionB。どちらもタイプVector3です。長方形はうまく動きます。ただし、到達_positionBしても、本来のように反対方向に移動することはありません。 コードをもう一度見てみました。オブジェクトが移動ifすると、コード内のステートメントは、rectsの位置がに等しいフレームを逃したという結論に達しました_positionB。rectsの位置がより大きいか等しい 場合は、コードを変更して方向を逆にすることにしました_positionB。私のコードは長すぎないので、以下に表示します。 using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

1
V8がSDLスレッドで実行されないのはなぜですか?
私は自分のゲームに対してV8をコンパイルしてリンクすることができ、コードの解釈はうまくいきました。ただし、コードを分割したいので、ゲームループは1つのスレッドに存在し、スクリプトエンジンはゲームループと一緒に2番目のスレッドで実行する必要があります。私はSDLを使用しているため、このコードを試して新しいスレッドを生成しました SDL_CreateThread(ScriptingEngine::SpawnMain, NULL); ここで、次のコードは私のテストスクリプトエンジンです。 namespace ScriptingEngine { v8::HandleScope handleScope; v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); v8::Persistent<v8::Context> context; void Setup() { // TODO: bind functions to global // ... context = v8::Context::New(NULL, global); } int SpawnMain(void *arguments) { v8::Context::Scope scope(context); v8::Handle<v8::Script> script = v8::Script::Compile( v8::String::New("'Hello World'") ); v8::Handle<v8::Value> result = script->Run(); context.Dispose(); return …

3
Androidスレッドがデザインに頭を悩ませる問題
ゲームデザインに頭を悩ませています。Androidプラットフォームでは、アクティビティがあり、そのコンテンツビューにカスタムサーフェスビューを設定しています。カスタムサーフェスビューがパネルとして機能し、すべてのクラスのインスタンスを作成し、そこですべての描画と計算を行います。 質問:代わりに、アクティビティで他のクラスのインスタンスを作成する必要がありますか? 次に、ゲームループを処理するカスタムスレッドクラスを作成します。 質問:この1つのクラスをすべてのアクティビティでどのように使用しますか?または、毎回拡張スレッドクラスの個別のインスタンスを作成する必要がありますか? 前のゲームでは、スレッドクラスのインスタンスを作成する必要のある複数のレベルがあり、スレッドクラスでは、各個別のレベルにコンストラクターメソッドを設定し、ループでswitchステートメントを使用して、レンダリングする必要があるレベルを確認しましたそして更新。混乱するようでしたら申し訳ありません。 私が使用している方法が非効率的であるかどうか(おそらくそうであるかどうか)と、それを正しい方法で設計する方法を知りたいだけです。私はそこにたくさんのチュートリアルを読みました、そして私はまだこの特定のトピックで多くの問題を抱えています。多分これを説明するいくつかのチュートリアルへのリンク?ありがとう。

1
XNA:スレッドはどのように機能しますか?
XNAゲームにスレッドを実装したいのですが、XBOX 360向けにコンパイルするときにどのように機能するかわかりません。誰かこれについて詳しく教えてもらえますか? たとえば、XBOXはいくつのスレッドをサポートしていますか?XNAがCompact Frameworkの特別なバージョンを使用していることを理解しています。これは開発中のコードにどのように影響しますか?XBOX用に開発する場合、Windowsとは異なる方法で実装しますか? ありがとうございました。

1
Entity System Architecture with Task Based Parallelismの使用
バックグラウンド 私は自分の暇な時間にマルチスレッドゲームエンジンの作成に取り組んでおり、エンティティシステムを既に作成したものに組み込むための最良の方法を決定しようとしています。これまでのところ、私は自分のエンジンの出発点としてIntelからのこの記事を使用しました。これまでのところ、タスクを使用して通常のゲームループを実装しており、システムやエンティティシステム、あるいはその両方の組み込みに取り掛かっています。私は過去にアルテミスに似たものを使ったことがありますが、並行性が私を捨ててしまいます。 Intelの記事では、エンティティデータのコピーが複数あり、各エンティティに加えられた変更が完全な更新の最後に内部的に配布されることが推奨されているようです。つまり、レンダリングは常に1フレーム遅れますが、得られるべきパフォーマンス上の利点を考えると、許容できる妥協案のようです。ただし、Artemisのようなエンティティシステムの場合、システムごとに各エンティティが複製されるため、各コンポーネントも複製する必要があります。これは実行可能ですが、多くのメモリを消費するように思えます。これを議論するインテルのドキュメントの部分は主に2.2と3.2.2です。探しているアーキテクチャを統合するための適切なリファレンスが見つかるかどうかを確認するためにいくつか検索を行いましたが、まだ有用なものを見つけることができていません。 注:このプロジェクトではC ++ 11を使用していますが、私が求めていることのほとんどは言語にとらわれないものでなければならないことを想像しています。 可能な解決策 EntitiesとEntityAttributesの作成と管理に使用されるグローバルEntityManagerを用意します。更新フェーズでのみ読み取りアクセスを許可し、すべての変更をスレッドごとにキューに保存します。すべてのタスクが完了すると、キューが結合され、それぞれの変更が適用されます。これは、同じフィールドへの複数の書き込みで問題が発生する可能性がありますが、それを整理する優先システムまたはタイムスタンプがあると確信しています。変更の配布段階でシステムにエンティティへの変更をかなり自然に通知できるため、これは私にとっては良いアプローチのようです。 質問 それが理にかなっているかどうかを確認するために私の解決策についてのフィードバックを探しています。私は嘘をついてマルチスレッドの専門家であると主張することはありません。私はこれを主に練習のために行っています。複数のシステムが複数の値を読み書きしている私のソリューションからいくつかの複雑な混乱が発生することを予測できます。私が言及した変更キューも、PODを使用していないときに起こりうる変更を簡単に通知できるようにフォーマットするのが難しい場合があります。 フィードバック/アドバイスは大歓迎です!ありがとう! リンク集 http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine http://gamadu.com/artemis/ http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/(この投稿の投稿には記載されていませんが、同様のソリューションが記載されています)

4
Unity3D Mobileでのスレッドとコルーチンの混合
Unity3Dにコルーチンがあり、サーバーからzipをダウンロードして永続データパスに抽出し、その内容をメモリにロードしました。フローは次のようになります。 IEnumerator LongCoroutine() { yield return StartCoroutine(DownloadZip()); ExtractZip(); yield return StartCoroutine(LoadZipContent()); } しかし、このExtractZip()方法(DotNetZipライブラリを使用)は同期的であり、時間がかかりすぎて、プロセス中に処理する場所がありません。 これにより、大きなzipを抽出しようとすると(モバイルデバイスで)アプリケーションが強制終了されました。これは、メインスレッドが長時間応答しなくなったことが原因と考えられます。 これはモバイルOSが行うことが知られていることですか(フレームに時間がかかりすぎる場合はアプリを終了します)? したがって、別のスレッドでzipを抽出すると問題が解決する可能性があると想定しましたが、うまくいったようです。私はこのクラスを作成しました: public class ThreadedAction { public ThreadedAction(Action action) { var thread = new Thread(() => { if(action != null) action(); _isDone = true; }); thread.Start(); } public IEnumerator WaitForComplete() { while (!_isDone) yield return null; …

3
マルチスレッドシミュレーションを可能にするには、クラスをどのように構成すればよいですか?
私のゲームでは、建物(家、リソースセンター)のある土地の区画があります。家のような建物には、テナント、部屋、アドオンなどがあり、これらすべての変数に基づいてシミュレーションする必要があるいくつかの値があります。 次に、AndEngineをフロントエンドのものに使用し、シミュレーション計算を実行する別のスレッドを作成します(後でこのスレッドにAIを含めることもできます)。これは、1つのスレッド全体がすべての作業を実行してブロックなどの問題を引き起こすことを防ぐためです。これにより、同時実行性と依存性の問題が発生します。 通貨の問題は、私のメインUIスレッドと計算スレッドすべてのシミュレーションオブジェクトにアクセスする場合との両方が必要です。そのため、スレッドセーフにする必要がありますが、それを可能にするためにシミュレーションオブジェクトを格納および構造化する方法がわかりません。 依存関係の問題は、計算値にするために、私の計算は、他のオブジェクトの値に依存していることです。 建物内のテナントオブジェクトを計算にリンクする最良の方法は何ですか?テナントクラスにハードコードしますか?アルゴリズムを簡単に調整できるように「ストア」アルゴリズムを実行するための良い方法は何ですか? 単純な怠惰な方法は、土地の区画(建物などを保持する)など、すべてのオブジェクトを保持するクラスにすべてをまとめることです。このクラスは、ユーザーが利用できるテクノロジーや、スプライトなどのオブジェクトプールなどのゲームの状態も保持します。しかし、これは怠惰で危険な方法ですよね? 編集: 私は依存性注入を見ていたが、それは他のオブジェクトを保持するクラスのようにどれだけうまく対処できますか?つまり、借地人と他の多くの価値を持つ建物のある土地の私の区画。AndEngineの場合も、DIは苦痛のように見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.