カスタムメモリアロケータの仕組みが追加されています。今回試してみたくなってためしてみたところです。カスタムメモリアロケーション機能をonにする方法についてメモリアロケーションとは(間違っているところもあるかもしれないので、間違いがあればご指摘いただければ幸いです)プログラムを動かす際には、プログラムやデータの領域をメモリ上に確保することが必要です。その際、スタック領域にメモリ領域を確保(自動メモリアロケーション)ヒープ領域にメモリ領域を確保(動的メモリアロケーション)の大きな二つがあります。簡単に言うと、一つ目はnewを使わずに変数領域を確保する方法、二つ目はnewを使って変数領域を確保する方法です。スタック上に確保すると、変数の生存期間がそのスタックだけに限られることもあるため、スタックを出ても領域を確保しておくためには、ヒープ領域に確保することが必要です。(つまりnewを使って確保する必要がある)動的メモリアロケーションを使用する場合、確保するメモリ領域が連続して空いている必要があり、その空いている領域を探す必要があります。異なるサイズの領域の確保/解放を繰り返すと、メモリのフラグメンテーションが発生し、メモリ自体は空いているものの、連続していないため確保できない、といったことが発生することがあります。いったこともあり、コンシューマ向けのゲーム開発では、メモリプールなどを使用したメモリアロケータを自前で作成することが一般的なようです。new関数をオーバーロードし、メモリ動作を自前のものにするなどもするようです。デフォルトでは、デフォルトのnew関数やdelete関数がメモリ管理に使用されていますが、パフォーマンス向上のためのメモリ管理についての議論がフォーラムでなされ、v3.4からカスタムアロケータの機能が追加されています。Forumv3.4のリリースノートにカスタムアロケータの使い方について書かれているのですが、わかりづらい部分もあったので、順を追って説明します。v3.6を使って説明を行います。カスタムアロケータのための設定として、ccConfig.hファイルにdefineが追加されています。cocos2d::allocator::AllocatorStrategyGlobalSmallBlock#endifとなっているかと思います。追加されたdefineCC_ENABLE_ALLOCATORこれを1に設定することで、カスタムアロケータに関する設定がビルドに加わります。CC_ENABLE_ALLOCATOR_DIAGNOSTICSデフォルトでは、CC_ENABLE_ALLOCATORと同じ値に設定されるようになっているため、CC_ENABLE_ALLOCATORを1に設定すると、こちらも設定されます。これを設定することで、Consoleからメモリ状態などを確認することができるようになります。CC_ENABLE_ALLOCATOR_GLOBAL_NEW_DELETEこれを1に設定すると、newやdelelteがCC_ALLOCATOR_GLOBAL_NEW_DELETEで設定したもので置き換えられます。CC_ALLOCATOR_GLOBALグローバルアロケータの設定。デフォルトではcocos2d::allocator::AllocatorStrategyDefaultが使用される設定となっています。CC_ALLOCATOR_GLOBAL_NEW_DELETEnewやdelete関数を置き換える際の置き換え方の設定。デフォルトではcocos2d::allocator::AllocatorStrategyGlobalSmallBlockが使用されるようになっています。Allocatormallocとfreeのラッパー。Allocator固定長サイズのアロケータを複数用意し、一番適したサイズのアロケータを使ってメモリ領域を確保する。8192バイトの固定長サイズのアロケータが準備され、これ以上のサイズのものはデフォルトのアロケータが使用されるようになっている。Allocator固定長サイズのアロケータ。同じサイズのブロックを複数用意し、そのブロックを確保/開放するので、メモリ領域の検索などが必要ないため動作が速い。Allocator特定の型のためのアロケータ。cocos2d::allocator::AllocatorStrategyGlobalSmallBlockに設定します。このように設定することで、カスタムアロケータ機能が追加され、new関数を使った場合も、cocos2d::allocator::AllocatorStrategyGlobalSmallBlockが使用されるようになります。director->getConsole();console->listenOnTCP(1234);のように設定も行います。このように設定することで、localhostの1234番ポートを開いた状態でアプリが起動します。newコマンドでデフォルトのテンプレートから作られるサンプルアプリケーションを使用します。'^]'.>このような画面が表示されると思います。allocated:8192Total:202,392のような結果となりました。GlobalSmallBlock::xxの部分がブロックサイズ、initialが最初に確保したブロックの数、countが現在の確保ブロック数、highestが最大のブロック数のようです。プールアロケータの使用リリースノートに、プールアロケータの導入方法も書かれていましたが、その方法ではうまく行かなかったので、自分がやった方法を補足しておきます。今回はサンプルアプリケーションを使用しているので、HelloWorldScene.cppとHelloWorldScene.hを以下のように変更しています。new(nothrow)を使うようになっており、エラーが出ていたので、マクロを使わず自分で定義しています。HelloWorldScene.cppの変更点としては、static変数の定義を加えています。allocated:106496Total:1146816のようになり、HelloWorldPoolが追加されているのがわかります。まとめCocos2d-xのカスタムアロケータについて紹介し、Console機能からアロケーション情報について調べる方法について紹介しました。追加や削除が頻繁に行われるクラスに対してはメモリプールを導入することで動作も早くなり、フラグメンテーションも起きづらくなることが期待されます。メモリプールもデフォルトでは100ブロック確保するようになっていますが、Consoleからhighestの値を見て、適切な値を設定することにより、無駄なメモリ領域の確保をなくしたり、逆に確保するブロックが足りなくなるといったこともなくなるかとおもわれます。ゲーム全体にすぐ導入はできないかもしれませんが、パフォーマンス・チューニングのために使ってみるのも良いかもしれません。(1)月別アーカイブはてなブログをはじめよう!yasuharu519さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。