這是最基礎也是最有用的策略,雖然使用全局變量並不能徹底避免,但仍是應該儘可能避免,取而代之使用局部變量即local
。這裏的局部變量也包括函數function
,由於在Lua裏函數也是一個變量。局部變量的存取會更快,並且在生命週期以外就會釋放掉。html
使用全局變量web
CCX = display.contentCenterX --global variable for i = 1,100 do local image = display.newImage( "myImage" ) image.x = CCX end |
使用局部變量api
local CCX = display.contentCenterX --local variable for i = 1,100 do local image = display.newImage( "myImage" ) image.x = CCX end |
這個原則也適用於Lua的核心庫,好比math
庫。對於這類函數也應該使用局部變量。緩存
非局部變量app
local function foo( x ) for i = 1,100 do x = x + math.sin(i) end return x end |
使用局部變量函數
local sin = math.sin --local reference to math.sin local function foo(x) for i = 1,100 do x = x + sin(i) end return x end |
最後,記住儘可能用局部變量的方式來使用函數。固然,這樣須要注意函數的做用域的問題。若是你對Lua的做用域還不夠清楚,請看Understanding 「SCOPE」 for beginning programmers。性能
使用全局的函數優化
function func1() func2( "myValue" ) end function func2( y ) print( y ) end func1() |
使用局部的函數lua
--"func2" properly scoped above "func1" local function func2( y ) print( y ) end local function func1() func2( "myValue" ) end func1() |
若是函數的參數是函數時,應將參數函數做爲局部變量傳進參數,而不要直接寫函數定義,請看下面兩個例子:spa
直接在參數表裏定義函數
local func1 = function(a,b,func) return func(a+b) end for i = 1,100 do local x = func1( 1, 2, function(a) return a*2 end ) print( x ) end |
使用局部變量傳參
local func1 = function( a, b, func ) return func( a+b ) end local func2 = function( c ) return c*2 end for i = 1,100 do local x = func1( 1, 2, func2 ) print( x ) end |
table.insert()
下面來看看4個實現表插入的方法。在4個方法之中table.insert()
在效率上不如其餘方法,是應該避免使用的。
使用table.insert
local a = {} local table_insert = table.insert for i = 1,100 do table_insert( a, i ) end |
使用循環的計數
local a = {} for i = 1,100 do a[i] = i end |
使用table的size
local a = {} for i = 1,100 do a[#a+1] = i end |
使用計數器
local a = {} local index = 1 for i = 1,100 do a[index] = i index = index+1 end |
unpack()
函數Lua的unpack()函數不是一個效率很高的函數。你徹底能夠寫一個循環來代替它的做用。
使用unpack()
local a = { 100, 200, 300, 400 } for i = 1,100 do print( unpack(a) ) end |
代替方法
local a = { 100, 200, 300, 400 } for i = 1,100 do print( a[1],a[2],a[3],a[4] ) end |
緩存table的元素,特別是在循環內使用會提升效率。
未緩存
for i = 1,100 do for n = 1,100 do a[n].x = a[n].x + 1 print( a[n].x ) end end |
緩存
for i = 1,100 do for n = 1,100 do local y = a[n] y.x = y.x + 1 print( y.x ) end end |
ipairs()
當遍歷table時,使用Lua的ipairs()的效率並不高。
使用ipairs()
local t1 = {} local t2 = {} local t3 = {} local t4 = {} local a = { t1, t2, t3, t4 } for i,v in ipairs( a ) do print( i,v ) end |
代替方法
local t1 = {} local t2 = {} local t3 = {} local t4 = {} local a = { t1, t2, t3, t4 } for i = 1,#a do print( a[i] ) end |
應該使用更快的數學方法。
math.fmod()
--math.fmod method (discouraged) local fmod = math.fmod for i = 1,100 do if ( fmod( i,30 ) < 1 ) then local x = 1 end end --modulus operator method (recommended) for i = 1,100 do if ( ( i%30 ) < 1 ) then local x = 1 end end |
x * 0.5 ; x * 0.125 --recommended x/2 ; x/8 --discouraged |
x * x * x --recommended x^3 --discouraged |
Texture內存通常只有在出現警告時纔會去關注,但那時就很難去補救了。
若是你要在場景中使用必定數量的物理對象,那麼預先建立全部的對象會在使用時提升效率。那些暫時用不到的對象能夠設置爲未激活的狀態而後放到屏幕的外面或者放到一個不可見的group裏。當須要時設置對於的位置並激活便可。 實時建立物理對象並非不能夠,但一次性建立10-20個對象必然會形成性能問題,而致使頓卡延時等。 固然,也要考慮到內存的問題,若是一開始就建立幾百個物體,那麼對於內存的消耗就使得性能提升有點得不償失了。
有些音效是整個app都會用到的,這樣的音效須要一開始就載入到內存中。對於音質並無特別高的要求的音樂和音效須要考慮是否須要壓縮,好比使用11khz來減少音頻文件的大小,通常用戶也聽不出太大的區別,而這樣減小的內存但是至關可觀的。並且要使用簡單的適合多平臺的音頻格式,好比WAV格式。 若是須要的話,音效能夠以下組織成一個table,這樣便於在使用時引用或者在不須要的時候釋放掉。
--load these sounds during NON-time-critical code local soundTable = { mySound1 = audio.loadSound( "a.wav" ), mySound2 = audio.loadSound( "b.wav" ), mySound3 = audio.loadSound( "c.wav" ), mySound4 = audio.loadSound( "d.wav" ), mySound5 = audio.loadSound( "e.wav" ), mySound6 = audio.loadSound( "f.wav" ), mySound7 = audio.loadSound( "g.wav" ), mySound8 = audio.loadSound( "h.wav" ), } |
播放一個音效就很是簡單:
local mySound = audio.play( soundTable["mySound1"] ) |
永遠不要忘記,當音效不須要的時候就要釋放掉:
local ST = soundTable for s,v in pairs(ST) do audio.dispose( ST[s] ) ; ST[s] = nil end |