CocosCreatorオブジェクトプールの使い方

CocosCreatorオブジェクトプールの使い方

序文:

実行時にノードを作成 ( cc.instantiate ) および破棄 ( node.destroy ) するとパフォーマンスに非常に負荷がかかるため、より複雑なシーンでは、通常、シーン初期化ロジック ( onLoad ) でのみノードを作成し、シーンを切り替えるときにノードを破棄します。多数の敵や弾を繰り返し生成して破壊する必要があるアクション ゲームを作成する場合、ゲーム中にいつでもノードを作成および破壊するにはどうすればよいでしょうか。ここではオブジェクト プールの助けが必要です。

オブジェクト プールは、リサイクル可能なノード オブジェクトのグループです。ノード オブジェクト プールを初期化するには、cc.NodePool のインスタンスを作成します。通常、インスタンス化する必要のあるプレハブが複数ある場合は、プレハブごとに cc.NodePool インスタンスを作成する必要があります。

ノードを作成する必要がある場合は、オブジェクト プールからノードを申請します。オブジェクト プールにアイドル ノードがある場合、そのノードはユーザーに返されます。ユーザーは、node.addChild を通じて新しいノードをシーン ノード ツリーに追加します。
ノードを破棄する必要がある場合は、オブジェクト プール インスタンスの put(node) メソッドを呼び出して、破棄するノード インスタンスを渡します。オブジェクト プールは、シーン ノード ツリーからノードを自動的に削除し、オブジェクト プールに返します。

これにより、いくつかのノードのリサイクルが実現されます。

特定の操作

ステップ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 内の再利用メソッドが呼び出され、クリック イベントの登録が完了します。
menuItemPool.put(menuItemNode) を使用してノードをリサイクルすると、MenuItem の unuse メソッドが呼び出され、クリック イベントの登録解除が完了します。

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の他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • cocoscreatorプレハブの詳しい説明
  • CocosCreator でレイヤー管理に常駐ノードを使用する方法
  • ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法
  • CocosCreator ScrollView 最適化シリーズ: フレーム読み込み
  • CocosCreatorプロジェクト構造の仕組みの詳細な説明
  • CocosCreatorでスワイプした位置にテクスチャを表示する方法
  • CocosCreatorの共通知識ポイントを整理する
  • CocosCreatorのホットアップデートの包括的な説明
  • CocosCreator クラシック エントリー プロジェクト flappybird
  • CocosCreator ユニバーサルフレームワークデザインネットワーク
  • CocosCreatorを使ってシューティングゲームを作る方法
  • CocosCreatorでゲームコントローラーを使用する方法

<<:  Ubuntu で apt-get を使用して mysql をインストールおよび完全にアンインストールする方法の詳細な説明

>>:  Linuxで$を#に変更する方法

推薦する

MySQL 最適化 query_cache_limit パラメータの説明

クエリキャッシュ制限query_cache_limit は、単一のクエリで使用できるバッファ サイズ...

Bootstrapはカルーセルの効果を実現します

この記事では、カルーセルマップの効果を実現するためのBootstrapの具体的なコードを参考までに共...

Vue は携帯電話の認証コードによるログインを実装します

この記事では、携帯電話認証コードログインを実装するためのVueの具体的なコードを参考までに共有します...

MySQLで指定した時間前にレコードを自動的に削除する方法

イベントについて: MySQL 5.1 では、イベントの概念が導入され始めました。イベントは「時間ト...

Vueフィルターの詳細な説明

<本文> <div id="ルート"> <h2&...

MySQL ストアド プロシージャで if ステートメントを使用する詳細な例

この記事では、例を使用して、MySQL ストアド プロシージャでの if ステートメントの使用方法を...

VMware での Linux CentOS6.9 インストール グラフィック チュートリアル

技術初心者として、初めて Linux システムをインストールするプロセスを記録しています。まず、Wi...

MySQL トリガーの紹介、トリガーの作成、使用制限の分析

この記事では、例を使用して、MySQL トリガーの概要、トリガーの作成方法、およびトリガーの使用上の...

MySQL 5.7.15 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

JavaScript の基本演算子

目次1. オペレーター要約する1. オペレーター演算子は、代入、比較、算術演算などの機能を実装するた...

MySQL SELECT実行順序の簡単な理解

SELECT ステートメントの完全な構文は次のとおりです。 (7)選択 (8) DISTINCT ...

カルーセル効果を実現するための純粋なjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に...

Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用

この記事では、ビュー、トランザクション、インデックス、自己接続、ユーザー管理など、MySQL データ...