高效調(diào)優(yōu):ParticleDesigner Windows版實(shí)戰(zhàn)指南)
簡介ParticleDesigner 是一款面向 Cocos2d-x 開發(fā)者的 Windows 粒子效果編輯器可將火焰、煙霧、星光等動(dòng)態(tài)特效從手動(dòng)調(diào)參中解放出來。它提供可視化畫布與屬性面板調(diào)整發(fā)射速度、生命周期、顏色變化等參數(shù)后可實(shí)時(shí)預(yù)覽并導(dǎo)出 .plist 粒子配置供項(xiàng)目中的 ParticleSystemQuad 直接加載使用。壓縮包內(nèi)含軟件主程序、運(yùn)行所需的 dll 庫以及多組預(yù)制粒子模板與配套紋理另有 xml、txt、raw、tga 等界面皮膚和引擎配置文件共 46 個(gè)文件整體僅 2.87MB目錄按粒子特效、界面等模塊劃分結(jié)構(gòu)清晰既能快速查看現(xiàn)成特效的參數(shù)構(gòu)成也便于在已有 plist 上二次修改調(diào)試。目前已有 476 人學(xué)習(xí)下載適合需要快速為游戲添加高品質(zhì)粒子特效的 Cocos2d-x 項(xiàng)目開發(fā)者。 寫Cocos2d-x項(xiàng)目里的動(dòng)態(tài)特效粒子系統(tǒng)是個(gè)繞不開的方案?;鹧?、煙霧、爆炸、魔法、雪花、花瓣飄落這些效果如果靠美術(shù)做序列幀不僅資源體積大、制作周期長后期想調(diào)一下顏色和速度還得重新出一套圖。而粒子系統(tǒng)只需要一份配置文件和一張小紋理就能拼出相當(dāng)豐富的動(dòng)態(tài)效果。但粒子系統(tǒng)的參數(shù)多到離譜我記得最早在Windows上調(diào)cocos2dx的粒子全程手寫代碼改一個(gè)速度值就要重新編譯一遍然后跑起來看一眼不滿意再回來改調(diào)一個(gè)火焰效果能折騰到凌晨。后來換了ParticleDesigner_windows版這種可視化粒子編輯器所見即所得調(diào)參效率完全不是一個(gè)級(jí)別。這篇文章就圍繞ParticleDesigner在Windows環(huán)境里做cocos2dx粒子編輯的整套流程來聊從工具上手、參數(shù)拆解、導(dǎo)入項(xiàng)目到排查問題一步步過一遍適合剛接觸粒子系統(tǒng)、或者正在被粒子參數(shù)折磨的開發(fā)者參考。1. 為什么需要粒子編輯器手寫粒子參數(shù)的痛點(diǎn)1.1 粒子系統(tǒng)的工作原理粒子系統(tǒng)本身不復(fù)雜可以把它想象成一個(gè)不斷噴水的噴泉。發(fā)射器就是噴泉口每個(gè)水珠是一個(gè)粒子水珠從噴出到落地是它的生命周期無數(shù)個(gè)水珠疊加在一起就構(gòu)成了噴泉的整體視覺。Cocos2d-x里的ParticleSystem類就是干這個(gè)的它負(fù)責(zé)管理粒子發(fā)射、每幀更新粒子的位置、尺寸、顏色、旋轉(zhuǎn)最后再統(tǒng)一渲染。粒子系統(tǒng)之所以表現(xiàn)力強(qiáng)是因?yàn)槊總€(gè)粒子在生命周期內(nèi)不是一成不變的。它出生時(shí)有一個(gè)起始狀態(tài)比如速度、方向、大小、顏色然后隨著時(shí)間推移逐漸過渡到結(jié)束狀態(tài)。加上每一幀的物理模擬重力、加速度、旋轉(zhuǎn)最終呈現(xiàn)出來的就是那種既隨機(jī)又有序的動(dòng)態(tài)效果。所謂隨機(jī)靠的是每個(gè)參數(shù)配套的方差Variance值它讓每個(gè)粒子都有一點(diǎn)點(diǎn)不同避免了所有粒子整齊劃一那種很假的感覺。你把它理解成誤差范圍就行。Cocos2d-x的粒子系統(tǒng)還有兩種發(fā)射模式重力模式Gravity和半徑模式Radius。重力模式模擬的是粒子在力場(chǎng)中運(yùn)動(dòng)比如火焰向上飄、雨滴向下落靠的是速度和加速度。半徑模式則是讓粒子繞著一個(gè)中心點(diǎn)旋轉(zhuǎn)運(yùn)動(dòng)常用來做旋轉(zhuǎn)光環(huán)、星系、環(huán)形火花這類效果。兩種模式對(duì)應(yīng)完全不同的參數(shù)組在ParticleDesigner里通過emitterType字段切換0是重力模式1是半徑模式。1.2 手寫參數(shù)為什么難調(diào)ParticleSystem暴露的參數(shù)少說也有幾十個(gè)包括發(fā)射速率、粒子數(shù)量、生命周期、起始大小、結(jié)束大小、起始顏色、結(jié)束顏色、每個(gè)顏色通道的方差、角度、角度方差、速度、速度方差、重力加速度、徑向加速度、切向加速度、混合模式……而且還分重力模式和半徑模式兩套邏輯。手寫代碼調(diào)這些參數(shù)最大的問題是沒有實(shí)時(shí)反饋。你改一個(gè)值得重新編譯、運(yùn)行、等場(chǎng)景加載、再觀察效果。而且粒子效果是動(dòng)態(tài)的截圖根本看不出問題必須盯著屏幕看幾秒才能判斷。我當(dāng)年調(diào)一個(gè)爆炸效果改了不下三十次每次改完都覺得應(yīng)該對(duì)吧跑起來發(fā)現(xiàn)要么粒子飄得太慢要么炸開后縮成一團(tuán)。更難受的是很多參數(shù)是互相影響的。你把粒子發(fā)射速度調(diào)快了結(jié)果粒子飛得太遠(yuǎn)又得回頭調(diào)生命周期生命周期調(diào)短了粒子又沒來得及變小就消失了。這種耦合關(guān)系在沒有可視化預(yù)覽的情況下全靠人腦模擬效率極低。ParticleDesigner這類可視化編輯器的價(jià)值就在這里。左邊是參數(shù)面板中間是實(shí)時(shí)預(yù)覽區(qū)域你每拖一個(gè)滑條粒子效果立刻更新。所有參數(shù)之間的聯(lián)動(dòng)關(guān)系一眼就能看出來。調(diào)整效果的時(shí)間從小時(shí)級(jí)直接壓縮到分鐘級(jí)。再加上它內(nèi)置了幾十種預(yù)設(shè)模板火焰、煙霧、雪花、爆炸、魔法、流星都有很多時(shí)候你只需要在預(yù)設(shè)基礎(chǔ)上改改顏色和尺寸就夠用了。2. ParticleDesigner Windows版上手2.1 安裝與界面布局ParticleDesigner來自71squared最早是Mac端的工具后來出了Windows版。Windows版的界面風(fēng)格比較復(fù)古但核心功能很完整尤其是配合Cocos2d-x 2.x時(shí)代的工作流非常順手。我第一次打開這個(gè)工具的時(shí)候說實(shí)話有點(diǎn)懵界面密密麻麻全是參數(shù)但用順手之后就會(huì)發(fā)現(xiàn)每個(gè)控件都有明確作用。工具主界面主要分三塊中間是一塊預(yù)覽畫布粒子效果會(huì)在這里實(shí)時(shí)播放左右兩側(cè)是參數(shù)面板分類排放著發(fā)射器參數(shù)、粒子參數(shù)、顏色參數(shù)、混合模式等頂部是工具欄提供文件操作、播放控制、背景切換等功能。安裝過程沒什么好說的解壓即用不依賴復(fù)雜的運(yùn)行庫。值得一提的是Windows版可以直接拖入圖片作為粒子紋理這一點(diǎn)很關(guān)鍵。粒子效果好不好看紋理會(huì)占一半。你可以用一張帶漸變?nèi)徇叺膱A點(diǎn)圖也可以用手繪的星形、花瓣形紋理。紋理底色一定要是純黑色粒子系統(tǒng)渲染時(shí)會(huì)通過混合模式把黑色濾掉只保留圖形的亮部。如果你用一張白色底的圖粒子會(huì)顯示成一個(gè)方塊這是新手最容易踩的坑之一。2.2 從預(yù)設(shè)模板開始最快打開工具后建議先別急著從零開始調(diào)。左側(cè)預(yù)設(shè)列表里有一堆內(nèi)置效果Fire、Smoke、Explosion、Spark、Snow、Rain、Magic這些都有。找一個(gè)和你的需求最接近的預(yù)設(shè)選中之后預(yù)覽畫布就會(huì)開始播放然后你再根據(jù)實(shí)際需要去微調(diào)參數(shù)。比如你想要一個(gè)暗黑風(fēng)格的火焰選Fire預(yù)設(shè)之后把起始顏色從亮黃改成偏紫的冷色再把粒子尺寸調(diào)小一點(diǎn)速度降一點(diǎn)基本就能得到想要的效果。這比在空白畫布上從零搭一個(gè)粒子系統(tǒng)要快得多。預(yù)設(shè)模板還有一個(gè)好處它是學(xué)習(xí)參數(shù)作用的最好教材。你覺得某個(gè)效果看起來很舒服就去翻一下它的參數(shù)值看看它是怎么配出來的。比如火焰為什么能飄起來因?yàn)閍ngle是-90度向上發(fā)射speed在80到150之間gravityy是正數(shù)拉向屏幕上方。爆炸為什么能炸開因?yàn)閍ngleVariance是360度粒子朝四面八方發(fā)射。把預(yù)設(shè)里的參數(shù)當(dāng)成參考答案比干巴巴地看文檔好理解多了。2.3 導(dǎo)出格式與保存規(guī)范ParticleDesigner導(dǎo)出的是.plist文件里面用XML格式記錄了所有粒子參數(shù)如果勾選了內(nèi)嵌紋理還會(huì)把粒子紋理圖片以base64編碼的textureImageData字段塞進(jìn)plist里。這種內(nèi)嵌方式的好處是一個(gè)文件搞定所有內(nèi)容不用擔(dān)心紋理圖片丟失壞處是plist體積變大加載時(shí)解碼也要多花點(diǎn)時(shí)間。我給項(xiàng)目里定了一個(gè)規(guī)范你可以直接抄。在Resources目錄下建一個(gè)effects文件夾專門放粒子plist粒子用到的紋理圖片統(tǒng)一放到同一目錄下的textures子目錄里。文件名全部用小寫英文加下劃線比如fire_01.plist、fire_texture.png。嚴(yán)禁中文文件名和中文路徑Windows圖形資源管理器里沒問題但在真機(jī)和某些第三方工具鏈上中文路徑會(huì)直接導(dǎo)致紋理加載失敗這個(gè)坑我踩過不止一次。另外ParticleDesigner導(dǎo)出的文件名默認(rèn)是英文的保持不改就行方便代碼里引用。3. 核心參數(shù)拆解一個(gè)火焰效果從零調(diào)出來3.1 發(fā)射方式與生命周期先看發(fā)射器這一組參數(shù)。emitterType決定重力模式還是半徑模式做火焰、煙霧、爆炸這類常規(guī)效果選0重力模式。duration是發(fā)射器持續(xù)時(shí)間單位秒寫-1表示無限期持續(xù)發(fā)射適合火焰、煙霧這種循環(huán)播放的一次性的爆炸效果就給它一個(gè)具體秒數(shù)比如0.3秒。maxParticles是粒子同時(shí)存在的最大數(shù)量相當(dāng)于噴泉的水管粗細(xì)數(shù)值越大畫面越密但性能開銷也越大?;鹧嫘Ч话?50到250足夠了沒必要?jiǎng)虞m上500。粒子生命周期particleLifespan也不可小覷它決定粒子從出生到消失的時(shí)長。火焰的粒子生命周期通常在0.7到1秒之間太短了火花還沒伸展開就沒了太長了又拖出一長條尾巴。配合particleLifespanVariance給生命周期加一點(diǎn)隨機(jī)波動(dòng)每顆粒子的存活時(shí)間略有差異整體看起來就更自然。發(fā)射角度angle和角度方差angleVariance決定粒子的飛散方向。Cocos2d-x里角度0度是水平向右-90度是垂直向上?;鹧嬉蛏厦癮ngle設(shè)-90爆炸要朝各個(gè)方向炸開angleVariance直接設(shè)360而噴泉這類效果angle設(shè)-90、angleVariance設(shè)20就能得到一個(gè)向上散開的小扇形。3.2 顏色、尺寸與混合模式粒子顏色有起始顏色和結(jié)束顏色兩套每套都包含紅、綠、藍(lán)、透明度四個(gè)通道外加各自的方差?;鹧鎻母康郊舛耸且粋€(gè)從亮黃到暗紅再到透明漸變的過渡所以起始顏色用亮橙色建議值R1, G0.6, B0.2, A1結(jié)束顏色用暗紅色R0.4, G0.1, B0, A0。顏色過渡是粒子效果質(zhì)感的關(guān)鍵很多新手只調(diào)起始顏色結(jié)束顏色全用默認(rèn)值結(jié)果粒子到后期不發(fā)散也不變暗看起來就像一個(gè)實(shí)心的色塊非常假。建議每種效果都把結(jié)束顏色認(rèn)真調(diào)一遍尤其是透明度A粒子消失前逐漸變透明是基本操作。尺寸和顏色是配套的。startParticleSize控制出生時(shí)的粒子尺寸finishParticleSize控制消亡前的尺寸?;鹧媸窃酵显叫 ⒃斤h越淡所以起始尺寸可以設(shè)50到80結(jié)束尺寸設(shè)0到10。startParticleSizeVariance給初始尺寸加一點(diǎn)浮動(dòng)否則粒子都是同一個(gè)大小的話效果會(huì)很生硬?;旌夏J絙lendFunc是另一個(gè)關(guān)鍵參數(shù)。ParticleDesigner導(dǎo)出plist時(shí)會(huì)把混合模式寫成兩組數(shù)字blendFuncSource對(duì)應(yīng)源因子blendFuncDestination對(duì)應(yīng)目標(biāo)因子。最常用的是兩組普通alpha混合是(770, 771)對(duì)應(yīng)GL_SRC_ALPHA和GL_ONE_MINUS_SRC_ALPHA加法混合是(770, 1)對(duì)應(yīng)GL_SRC_ALPHA和GL_ONE。加法混合的特點(diǎn)是一旦粒子重疊亮度會(huì)疊加變亮火焰、爆炸、閃電、魔法這些發(fā)光體效果用加法混合特別漂亮而煙霧、灰燼這類想保留厚重感的用普通alpha混合更合適。3.3 完整參數(shù)參考下面給一組我用它實(shí)測(cè)出來的火焰參數(shù)可以直接在ParticleDesigner里對(duì)照著填應(yīng)該能做出一個(gè)基礎(chǔ)效果不錯(cuò)的火焰。參數(shù)值說明emitterType0重力模式maxParticles220同時(shí)存在的粒子數(shù)上限duration-1持續(xù)發(fā)射particleLifespan0.8粒子存活秒數(shù)particleLifespanVariance0.4生命周期隨機(jī)浮動(dòng)angle-90向上發(fā)射angleVariance40發(fā)射方向散開角度speed100初始發(fā)射速度speedVariance50速度浮動(dòng)范圍gravityx0水平重力gravityy100向上牽引sourcePositionVariancex12發(fā)射點(diǎn)橫向范圍sourcePositionVariancey12發(fā)射點(diǎn)縱向范圍startColor / finishColor亮橙 / 暗紅漸透明顏色過渡startParticleSize60出生尺寸startParticleSizeVariance20尺寸隨機(jī)浮動(dòng)finishParticleSize6消亡前尺寸blendFuncSource / Destination770 / 1加法混合這組參數(shù)跑起來火焰根部會(huì)有一個(gè)亮橙色的密集區(qū)向上逐漸拉長、擴(kuò)散、變暗、消隱比較接近真實(shí)火焰的形態(tài)。在此基礎(chǔ)上調(diào)顏色和粒子數(shù)量就能衍生出篝火、爐火、魔法火球等多種效果。4. 把粒子文件接入Cocos2d-x項(xiàng)目4.1 plist處理與目錄放置導(dǎo)出plist之后不能直接往項(xiàng)目里一扔就不管了。先做兩個(gè)檢查。第一確認(rèn)plist里textureImageData字段存在或者是textureFileName能正確指向一個(gè)真實(shí)存在的圖片。如果你導(dǎo)出的plist用的是外部紋理引用那么對(duì)應(yīng)的png圖片也要一起放進(jìn)Resources目錄并且保持相對(duì)路徑一致。第二打開plist文件粗略看一眼sourcePosition和sourcePositionVarianceCocos2d-x加載plist時(shí)sourcePosition會(huì)被忽略粒子發(fā)射點(diǎn)以你在代碼里設(shè)置的節(jié)點(diǎn)位置為準(zhǔn)所以這里不用管。但sourcePositionVariance會(huì)保留它控制發(fā)射點(diǎn)的散布范圍如果你想在一根小蠟燭上冒火焰這個(gè)值就要調(diào)小否則火苗會(huì)從一個(gè)很大的區(qū)域里隨機(jī)冒出來。再強(qiáng)調(diào)一遍目錄規(guī)范Cocos2d-x的資源加載只按文件名查找但不代表你可以把文件亂放因?yàn)楹罄m(xù)維護(hù)時(shí)你會(huì)瘋掉。用我之前講的effects目錄方案把plist和紋理圖片分開管理。示例結(jié)構(gòu)長這樣Resources/ ├── effects/ │ ├── fire.plist │ ├── fire_texture.png │ ├── smoke.plist │ └── ... └── ...4.2 代碼加載一行代碼的事加載ParticleDesigner導(dǎo)出的plist非常簡單Cocos2d-x提供了直接讀取plist創(chuàng)建粒子系統(tǒng)的接口。最常用的寫法是auto fire ParticleSystem::create(effects/fire.plist); if (fire) { fire-setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 4)); fire-setAutoRemoveOnFinish(false); this-addChild(fire, 10); }ParticleSystem::create內(nèi)部會(huì)解析plist里的所有參數(shù)自動(dòng)創(chuàng)建好粒子系統(tǒng)對(duì)象。這里有兩個(gè)地方值得注意。第一create方法的參數(shù)是plist文件路徑這個(gè)路徑相對(duì)于Resources目錄。如果你的plist里用的是內(nèi)嵌紋理那就只需要路徑正確即可如果是外部引用紋理還需要保證紋理文件能被正確加載否則會(huì)創(chuàng)建失敗返回nullptr。第二setAutoRemoveOnFinish這個(gè)接口對(duì)于duration-1的持續(xù)發(fā)射粒子這個(gè)參數(shù)基本沒什么影響因?yàn)榱W訒?huì)一直發(fā)射下去但對(duì)于一次性的爆炸效果如果設(shè)置成true粒子播放完會(huì)自動(dòng)從父節(jié)點(diǎn)移除省得你手動(dòng)清理。反過來如果你的爆炸效果要每隔幾秒觸發(fā)一次那就不要開自動(dòng)移除而是靠外部邏輯控制顯示和隱藏。4.3 Windows版導(dǎo)出與Cocos2d-x版本的兼容性我最初用的ParticleDesigner Windows版是和Cocos2d-x 2.x搭配的后來項(xiàng)目升級(jí)到Cocos2d-x 3.xplist文件依然可以直接用因?yàn)閜list里記錄的參數(shù)名和3.x的ParticleSystem讀取邏輯完全兼容。不過有個(gè)地方需要留意Cocos2d-x 3.x里ParticleSystemQuad已經(jīng)被合并進(jìn)ParticleSystem所以不需要再單獨(dú)區(qū)分ParticleSystemQuad直接ParticleSystem::create就行。還遇到過一種情況Windows版導(dǎo)出的plist里混合模式的值和Cocos2d-x 3.x默認(rèn)的GL常量不一致導(dǎo)致粒子渲染出來的顏色發(fā)灰或者過曝。處理辦法很簡單加載后手動(dòng)覆蓋一次混合模式。代碼如下fire-setBlendFunc(BlendFunc::ADDITIVE); // 加法混合 // 或者 fire-setBlendFunc(BlendFunc::ALPHA_PREMULTIPLIED); // alpha混合BLEND_ADDITIVE就是加法混合效果接近(770, 1)BLEND_ALPHA_PREMULTIPLIED對(duì)應(yīng)預(yù)乘alpha混合。具體用哪個(gè)要在真機(jī)上對(duì)比看效果再定。但不管選哪個(gè)都比在plist里手動(dòng)改數(shù)字可靠因?yàn)椴煌姹镜墓ぞ呱傻淖侄沃涤屑?xì)微差異。5. 常見問題與排查技巧實(shí)錄5.1 加載失敗與黑屏排查ParticleSystem::create返回nullptr是遇到最多的報(bào)錯(cuò)基本就兩個(gè)原因一是plist文件路徑不對(duì)二是plist里引用的紋理文件找不到。路徑問題檢查一下大小寫、目錄層級(jí)Windows下路徑不區(qū)分大小寫但iOS和Android區(qū)分所以干脆全部用小寫。紋理找不到的話打開plist看textureFileName字段確認(rèn)這個(gè)文件確實(shí)存在于Resources目錄里并且名字完全一致。如果你把圖片挪到別的目錄了紋理加載就會(huì)失敗create也就跟著失敗。其中一個(gè)典型的坑是ParticleDesigner在Windows上導(dǎo)出時(shí)textureFileName里可能帶絕對(duì)路徑比如C:\Users\xxx\Desktop\fire.png這種路徑在項(xiàng)目里肯定加載不了需要改成相對(duì)路徑或者直接依賴內(nèi)嵌的textureImageData。還有一種情況create沒報(bào)錯(cuò)粒子也加進(jìn)場(chǎng)景了但屏幕上看不到任何效果。這個(gè)時(shí)候不要急著調(diào)參數(shù)先檢查節(jié)點(diǎn)的zOrder和位置。Cocos2d-x的粒子系統(tǒng)繼承自Node如果它的坐標(biāo)落在屏幕可顯示區(qū)域外或者被其他不透明節(jié)點(diǎn)遮住了你自然什么也看不到。把zOrder調(diào)高、位置移到可見區(qū)域再看。另外某些粒子效果持續(xù)時(shí)間短第一次播放已經(jīng)結(jié)束了你又沒有設(shè)置autoRemoveOnFinish節(jié)點(diǎn)還在只是沒粒子可顯示看起來就像消失了這時(shí)候重啟發(fā)射就能看出來。5.2 粒子顯示成方塊、顏色發(fā)灰怎么辦顯示成方塊100%是紋理問題。要么plist里textureImageData是空的、textureFileName指向的文件又不存在系統(tǒng)兜底用了一個(gè)默認(rèn)的白色小方塊紋理要么就是你的紋底色不是純黑色導(dǎo)致混合時(shí)整張圖被當(dāng)成了發(fā)光體。還有一種可能是粒子紋理本身尺寸過小只有幾個(gè)像素放大之后呈現(xiàn)明顯的塊狀感。解決辦法就是檢查plist的紋理引用把確認(rèn)可用的紋理放對(duì)位置盡量用32x32或64x64的柔邊圓形紋理再配合加法混合效果會(huì)好很多。顏色發(fā)灰多半是混合模式不對(duì)。ParticleDesigner里加法混合效果看著很漂亮但到了Cocos2d-x里如果用普通alpha混合渲染透明白色部分會(huì)疊加出灰色邊的效果整個(gè)粒子看著臟臟的。遇到這種情況在代碼里強(qiáng)制執(zhí)行一次setBlendFunc(BlendFunc::ADDITIVE)看顏色是否恢復(fù)。如果發(fā)灰問題在真機(jī)出現(xiàn)而模擬器沒有通常與紋理壓縮格式有關(guān)把紋理資源從PNG換成帶透明通道的PVR或者ETC試試優(yōu)先保證透明通道不被壓壞。5.3 性能優(yōu)化別讓粒子拖垮幀率粒子系統(tǒng)雖然資源體積小但它們是動(dòng)態(tài)渲染每一幀都要更新所有粒子的位置和著色狀態(tài)所以性能問題比靜態(tài)圖片敏感得多。最容易踩的坑是場(chǎng)景里同時(shí)掛了一堆粒子系統(tǒng)每個(gè)又是幾百個(gè)粒子移動(dòng)端直接掉幀。我的經(jīng)驗(yàn)是單個(gè)粒子系統(tǒng)的maxParticles超過300就要警惕場(chǎng)景里如果超過三個(gè)這樣的粒子系統(tǒng)就需要做減配方案。減配思路有幾個(gè)。一是檢查粒子紋理尺寸不要用一張大紋理只顯示中間一小塊區(qū)域貼圖浪費(fèi)會(huì)拖慢渲染二是合理設(shè)置duration和生命周期不用的效果及時(shí)停掉。三是復(fù)用粒子系統(tǒng)而不是反復(fù)create和release。我在項(xiàng)目里習(xí)慣把常用的火焰、煙霧粒子系統(tǒng)在場(chǎng)景初始化時(shí)創(chuàng)建好需要的時(shí)候重置一下位置和參數(shù)用visible控制顯示隱藏而不是每次觸發(fā)都重新加載plist。這樣能避免頻繁的內(nèi)存分配和釋放對(duì)降低卡頓有明顯幫助。再一個(gè)經(jīng)驗(yàn)是粒子層級(jí)盡量單獨(dú)管理。把粒子系統(tǒng)統(tǒng)一加到一個(gè)專門的特效節(jié)點(diǎn)上設(shè)置這個(gè)節(jié)點(diǎn)的globalZOrder為最高讓特效優(yōu)先渲染。這樣做一方面避免粒子被UI遮擋另一方面也方便統(tǒng)一控制暫停和清理。尤其在戰(zhàn)斗場(chǎng)景里清場(chǎng)或者翻頁時(shí)直接把這個(gè)特效節(jié)點(diǎn)removeAllChildren所有粒子效果一次性清除省心很多。最后再分享一個(gè)小技巧。ParticleDesigner Windows版的預(yù)覽放大鏡可能有點(diǎn)卡別硬撐預(yù)覽畫布右下角有分辨率縮放選項(xiàng)把預(yù)覽分辨率調(diào)低一點(diǎn)實(shí)時(shí)調(diào)節(jié)參數(shù)時(shí)拖動(dòng)滑條更加跟手看到整體沒問題再切回完整分辨率檢查細(xì)節(jié)。還有調(diào)好的plist建議在Cocos2d-x項(xiàng)目里跑一遍真機(jī)再做最終確認(rèn)因?yàn)镻C上顯示的效果和移動(dòng)端實(shí)際渲染效果在顏色和明暗上會(huì)有一些差異以真機(jī)效果為準(zhǔn)。本文還有配套的精品資源點(diǎn)擊獲取