1.使用局部變量local
這是最基礎也是最有用的策略,雖然使用全局變量並不能完全避免,但還是應該盡量避免,取而代之使用局部變量即local
。這里的局部變量也包括函數function
,因為在Lua里函數也是一個變量。局部變量的存取會更快,而且在生命周期之外就會釋放掉。
使用全局變量
|
使用局部變量
|
這個原則也適用於Lua的核心庫,比如math
庫。對於這類函數也應該使用局部變量。
非局部變量
|
使用局部變量
|
最后,記住盡量用局部變量的方式來使用函數。當然,這樣需要注意函數的作用域的問題。如果你對Lua的作用域還不夠清楚,請看Understanding “SCOPE” for beginning programmers。
使用全局的函數
|
使用局部的函數
|
2.避免將函數體定義作為其他函數的參數來使用
如果函數的參數是函數時,應將參數函數作為局部變量傳進參數,而不要直接寫函數定義,請看下面兩個例子:
直接在參數表里定義函數
|
使用局部變量傳參
|
3.避免使用table.insert()
下面來看看4個實現表插入的方法。在4個方法之中table.insert()
在效率上不如其他方法,是應該避免使用的。
使用table.insert
|
使用循環的計數
|
使用table的size
|
使用計數器
|
4.減少使用 unpack()
函數
Lua的unpack()函數不是一個效率很高的函數。你完全可以寫一個循環來代替它的作用。
使用unpack()
|
代替方法
|
5.緩存table的元素
緩存table的元素,特別是在循環內使用會提高效率。
未緩存
|
緩存
|
6.避免使用ipairs()
當遍歷table時,使用Lua的ipairs()的效率並不高。
使用ipairs()
|
代替方法
|
7.數學方法的效率比較
應該使用更快的數學方法。
避免對正數使用math.fmod()
|
乘法比除法快
|
乘法比乘冪快
|
8.保存Texture內存
Texture內存一般只有在出現警告時才會去關注,但那時就很難去補救了。
- 當texture不需要的時候記得釋放掉。
- 如果你有一個525×600的背景圖片,你可以改成448×512的。因為OpenGL對圖片內存遵循2的倍數原則,即每次使用內存都是以2的倍數為長度的。所以525×600的圖片將會消耗1024*1024的內存(即1024×1024 (pixels) × 4 (bytes) = 4,194,304 bytes = 4 MB),而448×512只會消耗1/4的內存。在圖片清晰度容忍的情況下盡量縮小到下一個2倍量級內。
- 盡可能的重復利用素材。對於圖片相同而顏色不同的可以使用setFillColor函數。例如你有紅蘋果和青蘋果,那么你可以創建一個灰度的圖片然后分別添加紅色和綠色。
- 如果你使用image sheet,那么一定要使用類似TexturePacker的軟件,不僅能提高開發效率也能優化圖片大小。
9.預先創建物理對象
如果你要在場景中使用一定數量的物理對象,那么預先創建所有的對象會在使用時提高效率。那些暫時用不到的對象可以設置為未激活的狀態然后放到屏幕的外面或者放到一個不可見的group里。當需要時設置對於的位置並激活即可。 實時創建物理對象並不是不可以,但一次性創建10-20個對象必然會造成性能問題,而導致頓卡延時等。 當然,也要考慮到內存的問題,如果一開始就創建幾百個物體,那么對於內存的消耗就使得性能提高有點得不償失了。
10.音頻使用策略
有些音效是整個app都會用到的,這樣的音效需要一開始就載入到內存中。對於音質並沒有特別高的要求的音樂和音效需要考慮是否需要壓縮,比如使用11khz來減小音頻文件的大小,一般用戶也聽不出太大的區別,而這樣減少的內存可是相當可觀的。而且要使用簡單的適合多平台的音頻格式,比如WAV格式。 如果需要的話,音效可以如下組織成一個table,這樣便於在使用時引用或者在不需要的時候釋放掉。
|
播放一個音效就非常簡單:
|
永遠不要忘記,當音效不需要的時候就要釋放掉:
|