cocos2dxでパーティクルを使いたい
パーティクル生成ツールはいくつかありますが、WEBで生成できるParticle2dxというツールがあります。
http://particle2dx.com/
ここで設定したパーティクルをplistとして出力すると、cocos2dxでパーティクルの設定として読み込むことができます。
パーティクル出た! でも...
ぶっちゃけplistを読み込んでるせいか、パーティクル生成がめっちゃ重いです。
いくつか理由がありますが、
とかが主な原因ぽい。
本題:plistをクラス化しちゃえばいいんじゃね?
ようやく本題。
たぶん同じParticleシステムを使ってる方はとっくに独自実装してると思いますが、plistをC++プログラムに変換するスクリプトを書きました。
コードの中身はv2系のinitWithDictionaryを忠実に移植してます。
自由に使ってアレンジしてくださって大丈夫ですが、ご利用はご利用は自己責任でお願いします。
スクリプト
長いのでGitHubにあげときます。
https://github.com/nubilum/convert-particle-plist
ベンチマーク
CCParticleSystemQuad* particle = CCParticleSystemQuad::create("particleTexture.plist");
CCParticleBatchNode* node = CCParticleBatchNode::createWithTexture(particle->getTexture(), 10000);
double start = clock();
for ( int i = 0; i < 20; i++ ) {
CCParticleSystemQuad* particle = CCParticleSystemQuad::create("particleTexture.plist");
particle->setPosition(ccp((i % 5) * 100, (i / 5) * 100));
node->addChild(particle);
}
CCLOG("plist time: %f", ((double)clock() - start) / CLOCKS_PER_SEC);
MeteorParticle* particle2 = MeteorParticle::create();
CCParticleBatchNode* node2 = CCParticleBatchNode::createWithTexture(particle2->getTexture(), 10000);
double start2 = clock();
for ( int i = 0; i < 20; i++ ) {
MeteorParticle* particle = MeteorParticle::create();
particle->setPosition(ccp((i % 5) * 100 + 400, (i / 5) * 100));
node2->addChild(particle);
}
CCLOG("class time: %f", ((double)clock() - start2) / CLOCKS_PER_SEC);
1回目
Cocos2d: plist time: 0.019896
Cocos2d: class time: 0.002814
2回目
Cocos2d: plist time: 0.016060
Cocos2d: class time: 0.004208
plistとclass化したものとで、大体4〜5倍(?)くらい生成速度が改善しました。
肝心の描画更新処理は、たぶんどっちも変わらんです。
余談
(´-`).。oO(でもぶっちゃけ、このパーティクルシステムをそのまま本番でも使うことあんまないんじゃ...)