lua使用優化建議

1.使用局部變量local

這是最基礎也是最有用的策略,雖然使用全局變量並不能徹底避免,但仍是應該儘可能避免,取而代之使用局部變量即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() 

2.避免將函數體定義做爲其餘函數的參數來使用

若是函數的參數是函數時,應將參數函數做爲局部變量傳進參數,而不要直接寫函數定義,請看下面兩個例子: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 

3.避免使用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 

4.減小使用 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 

5.緩存table的元素

緩存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 

6.避免使用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 

7.數學方法的效率比較

應該使用更快的數學方法。

避免對正數使用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 

8.保存Texture內存

Texture內存通常只有在出現警告時纔會去關注,但那時就很難去補救了。

  1. 當texture不須要的時候記得釋放掉。
  2. 若是你有一個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倍量級內。
  3. 儘量的重複利用素材。對於圖片相同而顏色不一樣的可使用setFillColor函數。例如你有紅蘋果和青蘋果,那麼你能夠建立一個灰度的圖片而後分別添加紅色和綠色。
  4. 若是你使用image sheet,那麼必定要使用相似TexturePacker的軟件,不只能提升開發效率也能優化圖片大小。

9.預先建立物理對象

若是你要在場景中使用必定數量的物理對象,那麼預先建立全部的對象會在使用時提升效率。那些暫時用不到的對象能夠設置爲未激活的狀態而後放到屏幕的外面或者放到一個不可見的group裏。當須要時設置對於的位置並激活便可。 實時建立物理對象並非不能夠,但一次性建立10-20個對象必然會形成性能問題,而致使頓卡延時等。 固然,也要考慮到內存的問題,若是一開始就建立幾百個物體,那麼對於內存的消耗就使得性能提升有點得不償失了。

10.音頻使用策略

有些音效是整個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 
相關文章
相關標籤/搜索