Cocos2d-x粒子系统的优化探究

一般我们创建粒子的做法:

  auto particle = ParticleSystemQuad::create("Particles/Explosion.plist");
...

那么在引擎中是怎么样的一个表现呢?
我们来看下Cocos2d-x4.0的代码(其实我看的这部分3.0版本也是一样的):

ParticleSystemQuad * ParticleSystemQuad::create(const std::string& filename)
{
    ParticleSystemQuad *ret = new (std::nothrow) ParticleSystemQuad();
    if (ret && ret->initWithFile(filename))
    {
        ret->autorelease();
        return ret;
    }
    CC_SAFE_DELETE(ret);
    return ret;
}

因为ParticleSystemQuad继承于ParticleSystem,所以看ParticleSystem的initWithFile

bool ParticleSystem::initWithFile(const std::string& plistFile)
{
    bool ret = false;
    _plistFile = FileUtils::getInstance()->fullPathForFilename(plistFile);
    ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(_plistFile);

    CCASSERT( !dict.empty(), "Particles: file not found");
    
    // FIXME: compute path from a path, should define a function somewhere to do it
    string listFilePath = plistFile;
    if (listFilePath.find('/') != string::npos)
    {
        listFilePath = listFilePath.substr(0, listFilePath.rfind('/') + 1);
        ret = this->initWithDictionary(dict, listFilePath);
    }
    else
    {
        ret = this->initWithDictionary(dict, "");
    }
    
    return ret;
}

要知道FileUtils的fullPathForFilename只会缓存文件路径,而getValueMapFromFile不会缓存文件的数据,所以试图缓存ValueMap的做法自然行不通了。
难道要改引擎?当然不用,看下面的代码

ParticleSystemQuad * ParticleSystemQuad::create(ValueMap &dictionary)
{
    ParticleSystemQuad *ret = new (std::nothrow) ParticleSystemQuad();
    if (ret && ret->initWithDictionary(dictionary))
    {
        ret->autorelease();
        return ret;
    }
    CC_SAFE_DELETE(ret);
    return ret;
}

发现create的重载方法是传入一个ValueMap,那你就懂得怎么做了吧?

auto fileUtil = FileUtils::getInstance();
auto plistData = fileUtil->getValueMapFromFile("vanishingPoint.plist");
auto stars = ParticleSystemQuad::create(plistData);

以上的做法优势很明显,有频繁操作的话,只需将plistData保存下来即可,那样就不用频繁读取文件了。
另外进一步考虑到占用内存、热更等问题,则要额外处理,那我这篇文字就算是抛砖引玉吧。

其实粒子系统在我所知的引擎当中,对于移动端一直都是cpu和gpu杀手,最好的优化手段自然是不用或少用,大家想追求的肆意用粒子系统的时代还没到来,所以还是老老实实用动画代替粒子吧
参考链接

发布了4 篇原创文章 · 获赞 3 · 访问量 316

猜你喜欢

转载自blog.csdn.net/a543658883/article/details/103970369
今日推荐