序文:実行時にノードを作成 ( cc.instantiate ) および破棄 ( node.destroy ) するとパフォーマンスに非常に負荷がかかるため、より複雑なシーンでは、通常、シーン初期化ロジック ( onLoad ) でのみノードを作成し、シーンを切り替えるときにノードを破棄します。多数の敵や弾を繰り返し生成して破壊する必要があるアクション ゲームを作成する場合、ゲーム中にいつでもノードを作成および破壊するにはどうすればよいでしょうか。ここではオブジェクト プールの助けが必要です。 オブジェクト プールは、リサイクル可能なノード オブジェクトのグループです。ノード オブジェクト プールを初期化するには、cc.NodePool のインスタンスを作成します。通常、インスタンス化する必要のあるプレハブが複数ある場合は、プレハブごとに cc.NodePool インスタンスを作成する必要があります。 ノードを作成する必要がある場合は、オブジェクト プールからノードを申請します。オブジェクト プールにアイドル ノードがある場合、そのノードはユーザーに返されます。ユーザーは、node.addChild を通じて新しいノードをシーン ノード ツリーに追加します。 これにより、いくつかのノードのリサイクルが実現されます。 特定の操作ステップ1: プレハブを準備する作成したいノードを事前に設定し、プレハブリソースにします。プレハブの作り方が分からない方もいるかもしれません。 ステップ2: オブジェクトプールを初期化するシーン読み込みの初期化スクリプトでは、必要な数のノードを作成し、それらをオブジェクト プールに配置できます。 プロパティ: enemiesPrefab: cc.Prefab // 必須のプレハブ}, onLoad: 関数 () { // オブジェクト プールを作成します。this.enemyPool = new cc.NodePool(); initCount = 5 とします。 (i = 0; i < initCount; ++i) の場合 { let enemies = cc.instantiate(this.enemyPrefab); // ノードを作成する this.enemyPool.put(enemy); // put インターフェースを通じてオブジェクト プールに配置する} } オブジェクト プールに必要な初期ノードの数は、ゲームのニーズに応じて制御できます。初期ノードの数の見積もりが不正確であっても問題ありません。後で対処します。 ステップ3: オブジェクトプールからオブジェクトを要求する次に、ランタイム コードで次のメソッドを使用して、オブジェクト プールに格納されているオブジェクトを取得します。 敵を作成します: 関数 (親ノード) { 敵を null にします。 if (this.enemyPool.size() > 0) { // サイズ インターフェイスを使用して、オブジェクト プールに空きオブジェクトがあるかどうかを判断します // get() を使用してオブジェクトを取得します enemies = this.enemyPool.get(); } else { // 空きオブジェクトがない場合、つまりオブジェクト プールに十分な予備オブジェクトがない場合は、cc.instantiate を使用して再作成します。eminem = cc.instantiate(this.enemyPrefab); } enemies.parent = parentNode; // 生成された敵をノードツリーに追加します。enemy.getComponent('Enemy').init(); // 次に、敵に対してスクリプトを呼び出して初期化します。} オブジェクト プールを安全に使用する秘訣は、オブジェクトを取得する前に、常にサイズを使用して、使用可能なオブジェクトがあるかどうかを判断することです。使用可能なオブジェクトがない場合は、通常の方法でノードを作成します。実行時のパフォーマンスは多少消費されますが、ゲームがクラッシュするよりはましです。もう一つのオプションは、get を直接呼び出すことです。オブジェクト プールに使用可能なノードがない場合、null が返されます。このステップで判断することも可能です。 ステップ4: オブジェクトをオブジェクトプールに戻す敵を倒したら、将来のリサイクルのために敵ノードをオブジェクト プールに戻す必要があります。次のメソッドを使用します。 onEnemyKilled: 関数(敵) { // 敵はcc.Nodeである必要があります this.enemyPool.put(enemy); // 初期化メソッドと同様に、ノードをオブジェクトプールに入れます。このメソッドはノードのremoveFromParentも呼び出します。 } このようにして、完全なサイクルが完了し、主人公が何体のモンスターを倒す必要があるかは問題ではありません。オブジェクト プールにノードを入れたり出したりしても、追加のメモリ管理オーバーヘッドは発生しないため、可能な限りこれを活用するようにしてください。 ステップ5: コンポーネントを使用してリサイクルおよび再利用イベントを処理するコンストラクターを使用してオブジェクト プールを作成する場合、ノードのリサイクルおよび再利用イベントを処理するためにノードにマウントされるコンポーネントとしてコンポーネント タイプまたは名前を指定できます。 オブジェクト プールを作成するときは、以下を使用できます。 let menuItemPool = new cc.NodePool('MenuItem'); //コンポーネントタイプを指定する このように、menuItemPool.get() を使用してノードを取得すると、MenuItem 内の再利用メソッドが呼び出され、クリック イベントの登録が完了します。 cc.クラス({ 拡張: cc.Component、 onLoad: 関数 () { this.node.selected = false; this.node.on(cc.Node.EventType.TOUCH_END、 this.onSelect、 this.node); }, // put() はオブジェクトプールを再利用するときに unuse を呼び出します: function () { this.node.off(cc.Node.EventType.TOUCH_END、this.onSelect、this.node); }, // get() はオブジェクトプール内のオブジェクトを取得するときに再利用を呼び出します: function () { this.node.on(cc.Node.EventType.TOUCH_END、this.onSelect、this.node); } }); さらに、cc.NodePool.get() は、さまざまなタイプの任意の数のパラメータを渡すことができ、それらはそのまま再利用メソッドに渡されます。 // BulletManager.js let myBulletPool = new cc.NodePool('Bullet'); // 弾丸オブジェクトプールを作成する let newBullet = myBulletPool.get(this); // 弾丸スクリプトで後で弾丸をリサイクルするためにマネージャーインスタンスを渡す // Bullet.js 再利用(bulletManager) { this.bulletManager = bulletManager; // get で渡される管理クラスのインスタンス} 打つ () { this.bulletManager.put(this.node); // 以前に渡された管理クラスのインスタンスを介して弾丸を回復します} ステップ6: オブジェクトプールをクリアするオブジェクト プール内のノードが不要になった場合は、オブジェクト プールを手動でクリアし、そこに含まれるすべてのキャッシュされたノードを破棄できます。 myPool.clear(); // オブジェクトプールをクリアするにはこのメソッドを呼び出します オブジェクト プール インスタンスがどこからも参照されなくなると、エンジンのガベージ コレクション システムによって、オブジェクト プール内のノードが自動的に破棄され、リサイクルされます。ただし、この処理のタイミングは制御できません。また、ノードが他の場所から参照されている場合は、メモリリークが発生する可能性があります。そのため、シーンを切り替えるときやオブジェクトプールが不要になったときは、手動で clear メソッドを呼び出してキャッシュノードをクリアするのが最適です。 以上がCocosCreatorオブジェクトプールの使い方の詳細です。CocosCreatorオブジェクトプールの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: Ubuntu で apt-get を使用して mysql をインストールおよび完全にアンインストールする方法の詳細な説明
Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...
イベントの説明onactivate: オブジェクトがアクティブ要素として設定されたときに発生します。...
最近、次のデータ型のデータベースに遭遇しました:decimal(14,4)発生した問題は次のとおりで...
CocosCreatorがスキルCD効果を実現多くのゲームにはスキルがあります。プレイヤーがスキルボ...
目次1.関数内のこの方向1. 通常の機能2. コンストラクター3. オブジェクトメソッド4. イベン...
node-media-server を使用するプロセスの一部を記録します。この記事の環境はWindo...
この記事では、モバイルデバイス上の 1 ピクセルの境界線の問題を解決する 5 つの方法を紹介します。...
外部一時テーブルCREATE TEMPORARY TABLE によって作成された一時テーブルは、外部...
目次1. 存在する1.1 説明1.2 例1.3 交差/2017-07-21 2. 除く2.1 説明2...
RedHat6.5インストールMySQL5.7チュートリアル共有、参考までに、具体的な内容は次のとお...
この記事では、Vueの具体的なコード例を参考までに紹介します。具体的な内容は以下のとおりです。 コー...
最近、私は毎日論文提案に取り組んでいます。自分のスキルを発揮して、再びWebをデザインしたくてうずう...
目次序文シナリオシミュレーション要約する序文最近、sql_mode の話題については何度も話し合われ...
最近、会社でアプリを開発する準備をしており、最終的に開発には uni-app フレームワークを使用す...
この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...