問題タブ [object-pooling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 製品の有効期間がオブジェクトを含むスマート ポインターによって完全に制御される並行オブジェクト プール
C++ で並行オブジェクト プールを設計したいのですが、可能なプロトタイプは次のとおりです。
- オブジェクト (製品) が返されると、その有効期間は、オブジェクトを含むスマート ポインターによって完全に制御されます。
- プールは複数のスレッドで使用できます。
ユーザーがオブジェクト/メモリを使い終わった後、オブジェクト/メモリを自動的に再利用するにはどうすればよいですか?
私の考えは、製品のデストラクタで呼び出されるプールに delete() メソッドを持つことです。
より良いデザインはありますか?たとえば、製品クラスがプールとあまり結合されていない方法 (これは一般的なプールであることに注意してください)。どんなアイデアでも大歓迎です。
c# - クラスのすべてのフィールドをデフォルト値に設定する最も効率的な方法
オブジェクト プーリング フレームワークを作成しようとしています。クライアントが何らかのタイプのオブジェクトを要求するたびに、キャッシュ (キュー) からオブジェクトを返すか、キャッシュにオブジェクトがない場合は新しいオブジェクトを作成します。
クライアント コードでオブジェクトの処理が完了したら、それをフレームワークに渡して再度キャッシュします。ただし、このパターンが機能するには、オブジェクトを初期状態にリセットする必要があります。すべてのフィールドをその に設定する必要がありdefault(T)
ます。すべてのクラスに対してこれを手動で行うと、エラーが発生しやすく、退屈な作業になります。
そしてもちろん、パフォーマンスは主要な関心事です。最も効率的なソリューションを探しています。
編集:
動機としては、これは unity3d ゲーム プロジェクトであり、ガベージ コレクションは unity の大きな問題です。ガベージ コレクションから節約したすべてのバイトが重要です。そのため、オブジェクトをキャッシュすることが望ましいのは、単に新しいオブジェクトを作成するだけの、最も速く、最も簡単で、より合理的な方法とは対照的です。
c# - クラスのリストにゲームオブジェクトを追加するときにエラーが発生しました
を に追加する際に問題が発生してGameObject
いList<>
ます。このプログラムをビルドすると、次の場所でエラーが発生しpoolInstances.Add(clone)
ます。
エラー: List.Add(RecyclingGameObject) に無効な引数があります。
次の行でもエラーが発生しreturn clone;
ます。
エラー: Gameobject を RecyclingGameObject に暗黙的に変換することはできません
これが私のコードです:
c# - Unity: プールに戻ったときにプールされたオブジェクトをリセットする必要があります。おそらくScriptableObjectを使用していますか?
私は最近、一度に複数のゲーム オブジェクトのインスタンス化を高速化するために、Unity でのオブジェクト プーリングを試しています。
ただし、これらはかなり複雑なオブジェクトであるため、プールに戻ったときにリセットする必要があります。
簡単にリセットできるようにデフォルト値を保存するには、ScriptableObject を使用するのが良い方法かもしれないと読みました。しかし、そのためには、実行時に新しい ScriptableObject をロードして、オブジェクトの実際の値を格納する必要があります。
したがって、疑似コードでは、とのクラスがpublic MyScriptableData data
ありますpublic MyScriptableData defaults
1) デフォルトの ScriptableObject でプールされた新しいオブジェクトを作成しますdata = defaults;
。
2) オブジェクトの存続期間中にスクリプト可能なオブジェクトの値を変更することを行う
3) 非アクティブ化してから、プールされたオブジェクトをプールに戻し、scriptableObject をデフォルトにリセットします (data = defaults;
再度)。
主な質問が 3 つあります。
A) 実際にこれを実装する方法がわかりません。ステップ2で、デフォルト値が変更されるようです。したがって、デフォルトにリセットしても何も起こりません。を使用して、スクリプト可能なオブジェクトの新しいインスタンスを作成することを考えました
data = ScriptableObject.CreateInstance<MyScriptableData>();
defaults
しかし、デフォルト値を からコピーして、デフォルト値を決して変更しないようにするにはどうすればよいでしょうか? Unity エディターでデフォルトをアセットとして編集できるようにしたいと考えています。
B) CreateInstance を使用すると、パフォーマンスが低下しますか? このオブジェクト プーリングを行っている全体的な理由は、オブジェクトのインスタンス化のパフォーマンス コストを削減することです。スクリプト可能なオブジェクトをインスタンス化して、遅いコードを再導入するのは嫌いです。
C) このアプローチは大丈夫ですか? または、プールに戻る前にオブジェクトをリセットするより良い方法はありますか?
いくつかの回答に基づいて編集:私はすでにフィールドの長いリストを持ち、これらのフィールドのデフォルト値を辞書に保存するセットアップを持っています。しかし、フィールドを追加/変更/削除するたびに、いくつかの場所でコードを変更する必要があることがわかりました
試みられた解決策 (ただし、間違っています。以下を参照してください): ScriptableObject の拡張メソッドを作成しました。
最終的解決:
上記のスクリプトは、スクリプト可能なオブジェクトを複製するために機能しましたが、そのソリューションでは間違った道をたどっていたようです。
以下の何人かの人々は、プーリングはほとんどのアプリケーションの単一性においてそれほど重要ではないことを指摘しています。プロファイラーによるフレームレートが約 30 ~ 15 fps だったので、最初はプーリングを入れようとしましたが、プーリングがそれを改善するのに役立つと思いました。
コメントに基づいて、もう少し深く掘り下げたところ、LogStringToConsole というプロセスがあることがわかりました。これは、私の Debug.Log ステートメントが速度を落とすのと同じくらい簡単なことではないでしょうか!? それらを削除したところ、大きなスパイクはなくなりました。どうやら Debug.Log は大きなパフォーマンスの問題を引き起こします。今は60fpsを大きく超えています。このため、これらのオブジェクトをプールしないことにしました (ただし、1 秒間に数回生成される別のシナリオでは、より単純なオブジェクトにプールを使用しています)。これは、ここではスクリプト可能なオブジェクトについてまったく心配する必要がないことを意味します。私は今、プレハブと Init メソッドをロードして物事をセットアップし、それらが使い果たされるとオブジェクトが破棄されるインスタンスを作成しました。
インスタンス化/破棄の使用に戻ったとき、パフォーマンスに大きな変化は見られませんでした。すべての応答に感謝します!