1.使用局部变量local

这是最基础也是最有用的策略,虽然使用全局变量并不能完全避免,但还是应该尽量避免,取而代之使用局部变量即local。这里的局部变量也包括函数function,因为在Lua里函数也是一个变量。局部变量的存取会更快,而且在生命周期之外就会释放掉。

使用全局变量

CCX = display.contentCenterX  --global variable
for i = 1,100 do
local image = display.newImage( "myImage" )
image.x = CCX
end

使用局部变量

local CCX = display.contentCenterX  --local variable
for i = 1,100 do
local image = display.newImage( "myImage" )
image.x = CCX
end

这个原则也适用于Lua的核心库,比如math库。对于这类函数也应该使用局部变量。

非局部变量

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()

使用局部的函数

--"func2" properly scoped above "func1"
local function func2( y )
print( y )
end
local function func1()
func2( "myValue" )
end
func1()

2.避免将函数体定义作为其他函数的参数来使用

如果函数的参数是函数时,应将参数函数作为局部变量传进参数,而不要直接写函数定义,请看下面两个例子:

直接在参数表里定义函数

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

lua使用优化建议的更多相关文章

  1. .NET程序的性能要领和优化建议

    前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NE ...

  2. Unity 几种优化建议

    转: http://user.qzone.qq.com/289422269/blog/1453815561?ptlang=2052 Unity 几种优化建议 最简单的优化建议: 1.PC平台的话保持场 ...

  3. Unity开发-你必须知道的优化建议

    转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的documen ...

  4. mysql性能优化学习笔记-参数介绍及优化建议

    MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...

  5. Jquery学习笔记--性能优化建议

    一.选择器性能优化建议 1. 总是从#id选择器来继承 这是jQuery选择器的一条黄金法则.jQuery选择一个元素最快的方法就是用ID来选择了. 1 $('#content').hide(); 或 ...

  6. memcached工作原理与优化建议

    申明,本文为转载文:http://my.oschina.net/liuxd/blog/63129 工作原理 基本概念:slab,page,chunk. slab,是一个逻辑概念.它是在启动memcac ...

  7. Android代码内存优化建议-OnTrimMemory优化

    原文  http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...

  8. MYSQL 优化建议

    转自 http://coolshell.cn/articles/1846.html MYSQL 优化建议20条 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效 ...

  9. 用DBMS_ADVISOR.SQLACCESS_ADVISOR创建SQL Access Advisor访问优化建议

    使用OEM方式来创建SQL Access Advisor访问优化建议,已经是四五年的事了,下面就来写写怎样使用DBMS_ADVISOR.SQLACCESS_ADVISOR来创建SQL Access A ...

随机推荐

  1. 免费使用的图表控件XML/SWF Charts 5.08

    免费使用的图表控件XML/SWF Charts 5.08 http://www.pin5i.com/showtopic-26053.html 10个免费的在线统计图表工具 http://paranim ...

  2. sparkR原理

    p.p1 { margin: 0.0px 0.0px 10.0px 0.0px; font: 11.0px "Times New Roman"; min-height: 12.0p ...

  3. jquery 验证插件 validate

    1)required:true 必输字段(2)remote:"check.php" 使用ajax方法调用check.php验证输入值(3)email:true 必须输入正确格式的电 ...

  4. 【Git 】$ ./gradlew idea 构建一个idea的项目

    Welcome to Git (version 1.9.5-preview20150319) Run 'git help git' to display the help index.Run 'git ...

  5. 对敏捷开发的误解(转自MBAlib)

    对敏捷开发的误解 误解一:敏捷对人的要求很高 很多人在尝试实施敏捷时说:敏捷对人的要求太高了,我们没有这样的条件,我们没有这样的人,因此我们没法敏捷.可是,敏捷对人的要求真的那么高么? 软件归根到底还 ...

  6. DB天气app冲刺第八天

    ---恢复内容开始--- 今天已经是第八天了冲刺,本来今天的ui设计已经基本成型了,今天下午设计什么的都弄好了,然后自己手贱clean了一下,可能是自己的程序的bug吧,调试没有错误,安装在模拟器上以 ...

  7. axure rp pro 6.5

    现在地址:http://www.xdowns.com/soft/1/95/2012/Soft_94434.html Axure6.5正式版推出了,大大改善了用户体验以及修复了很多6.0上的bug. 而 ...

  8. 服务器环境搭建系列(二)-Tomcat篇

    1.解压缩Tomcat的tar包,默认放在opt下 tar -zxvf apache-tomcat-6.0.35.tar.gz 2.输入如下命令修改tomcat配置文件 vi /opt/apache- ...

  9. Viz World and Viz Curious Maps 教程 -- 基础篇

    0. 开篇之前的一些废话 本文的内容是之前因为一些原因而写的,现在打算分享出来,内容就不做更改纯迁移了…毕竟我也太久没摸过加密狗了( ╯□╰ ).内容定位是教程,对应的 Curious World M ...

  10. white-space 属性设置如何处理元素内的空白

    定义和用法white-space 属性设置如何处理元素内的空白. 这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认值: ...