暂时转了别人一篇,以后再优化

1.使用局部变量local

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

使用全局变量

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

使用局部变量

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

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

非局部变量

  1. local function foo( x )
  2. for i = 1,100 do
  3. x = x + math.sin(i)
  4. end
  5. return x
  6. end

使用局部变量

  1. local sin = math.sin --local reference to math.sin
  2. local function foo(x)
  3. for i = 1,100 do
  4. x = x + sin(i)
  5. end
  6. return x
  7. end

最后,记住尽量用局部变量的方式来使用函数。当然,这样需要注意函数的作用域的问题。如果你对Lua的作用域还不够清楚,请看Understanding “SCOPE” for beginning programmers

使用全局的函数

  1. function func1()
  2. func2( "myValue" )
  3. end
  4. function func2( y )
  5. print( y )
  6. end
  7. func1()

使用局部的函数

  1. --"func2" properly scoped above "func1"
  2. local function func2( y )
  3. print( y )
  4. end
  5. local function func1()
  6. func2( "myValue" )
  7. end
  8. func1()

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

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

直接在参数表里定义函数

  1. local func1 = function(a,b,func)
  2. return func(a+b)
  3. end
  4. for i = 1,100 do
  5. local x = func1( 1, 2, function(a) return a*2 end )
  6. print( x )
  7. end

使用局部变量传参

  1. local func1 = function( a, b, func )
  2. return func( a+b )
  3. end
  4. local func2 = function( c )
  5. return c*2
  6. end
  7. for i = 1,100 do
  8. local x = func1( 1, 2, func2 )
  9. print( x )
  10. end

3.避免使用table.insert()

下面来看看4个实现表插入的方法。在4个方法之中table.insert()在效率上不如其他方法,是应该避免使用的。

使用table.insert

  1. local a = {}
  2. local table_insert = table.insert
  3. for i = 1,100 do
  4. table_insert( a, i )
  5. end

使用循环的计数

  1. local a = {}
  2. for i = 1,100 do
  3. a[i] = i
  4. end

使用table的size

  1. local a = {}
  2. for i = 1,100 do
  3. a[#a+1] = i
  4. end

使用计数器

  1. local a = {}
  2. local index = 1
  3. for i = 1,100 do
  4. a[index] = i
  5. index = index+1
  6. end

4.减少使用 unpack()函数

Lua的unpack()函数不是一个效率很高的函数。你完全可以写一个循环来代替它的作用。

使用unpack()

  1. local a = { 100, 200, 300, 400 }
  2. for i = 1,100 do
  3. print( unpack(a) )
  4. end

代替方法

  1. local a = { 100, 200, 300, 400 }
  2. for i = 1,100 do
  3. print( a[1],a[2],a[3],a[4] )
  4. end

5.缓存table的元素

缓存table的元素,特别是在循环内使用会提高效率。

未缓存

  1. for i = 1,100 do
  2. for n = 1,100 do
  3. a[n].x = a[n].x + 1
  4. print( a[n].x )
  5. end
  6. end

缓存

  1. for i = 1,100 do
  2. for n = 1,100 do
  3. local y = a[n]
  4. y.x = y.x + 1
  5. print( y.x )
  6. end
  7. end

6.避免使用ipairs()

当遍历table时,使用Lua的ipairs()的效率并不高。

使用ipairs()

  1. local t1 = {}
  2. local t2 = {}
  3. local t3 = {}
  4. local t4 = {}
  5. local a = { t1, t2, t3, t4 }
  6. for i,v in ipairs( a ) do
  7. print( i,v )
  8. end

代替方法

  1. local t1 = {}
  2. local t2 = {}
  3. local t3 = {}
  4. local t4 = {}
  5. local a = { t1, t2, t3, t4 }
  6. for i = 1,#a do
  7. print( a[i] )
  8. end

7.数学方法的效率比较

应该使用更快的数学方法。

避免对正数使用math.fmod()

  1. --math.fmod method (discouraged)
  2. local fmod = math.fmod
  3. for i = 1,100 do
  4. if ( fmod( i,30 ) < 1 ) then
  5. local x = 1
  6. end
  7. end
  8. --modulus operator method (recommended)
  9. for i = 1,100 do
  10. if ( ( i%30 ) < 1 ) then
  11. local x = 1
  12. end
  13. end

乘法比除法快

  1. x * 0.5 ; x * 0.125 --recommended
  2. x/2 ; x/8 --discouraged

乘法比乘幂快

  1. x * x * x --recommended
  2. 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,这样便于在使用时引用或者在不需要的时候释放掉。

  1. --load these sounds during NON-time-critical code
  2. local soundTable = {
  3. mySound1 = audio.loadSound( "a.wav" ),
  4. mySound2 = audio.loadSound( "b.wav" ),
  5. mySound3 = audio.loadSound( "c.wav" ),
  6. mySound4 = audio.loadSound( "d.wav" ),
  7. mySound5 = audio.loadSound( "e.wav" ),
  8. mySound6 = audio.loadSound( "f.wav" ),
  9. mySound7 = audio.loadSound( "g.wav" ),
  10. mySound8 = audio.loadSound( "h.wav" ),
  11. }

播放一个音效就非常简单:

  1. local mySound = audio.play( soundTable["mySound1"] )

永远不要忘记,当音效不需要的时候就要释放掉:

  1. local ST = soundTable
  2. for s,v in pairs(ST) do
  3. audio.dispose( ST[s] ) ; ST[s] = nil
  4. end

lua代码优化(转)的更多相关文章

  1. Lua知识备忘录

    最近对Lua很感兴趣,以下是本阶段学习的总结,包含三部分,一部分是基础语法,一部分是扩展和解释器嵌入,最后一部分是Lua小练习. 知识涉及:Lua语言编程基础:Lua&C++:Lua扩展.嵌入 ...

  2. lua 优化

    彻底解析Android缓存机制——LruCache https://www.jianshu.com/p/b49a111147ee lua:部分常用操作的效率对比及代码优化建议(附测试代码) https ...

  3. lua执行字节码的过程介绍

    前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...

  4. lua 学习笔记(1)

    一.lua函数赋值与函数调用         在lua中函数名也是作为一种变量出现的,即函数和所有其他值一样都是匿名的,当要使用某个函数时,需要将该函数赋值给一个变量,这样在函数块的其他地方就可以通过 ...

  5. PHP代码优化

    1 代码优化 1 尽量静态化 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和 ...

  6. 在redis中使用lua脚本让你的灵活性提高5个逼格

    在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...

  7. 跟Unity3D学代码优化

    今天我们来聊聊如何跟Unity学代码优化,准确地说,是通过学习Unity的IL2CPP技术的优化策略,应用到我们的日常逻辑开发中. 做过Unity开发的同学想必对IL2CPP都很清楚,简单地说,IL2 ...

  8. 使用Nginx+Lua代理Hadoop HA

    一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...

  9. 打印Lua的Table对象

    小伙伴们再也不用为打印lua的Table对象而苦恼了, 本人曾也苦恼过,哈哈 不过今天刚完成了这个东西, 以前在网上搜过打印table的脚本,但是都感觉很不理想,于是,自己造轮子了~ 打印的效果,自己 ...

随机推荐

  1. oracle调整表中列顺序

    有一个哥们提出一个问题: 有个表,创建时候的列顺序是a,b,c 如何使用select * 的时候,让列的显示顺序是a,c,b 而且任性地必须使用select *来查询,且不能重建表. 假设有个表tes ...

  2. ORACLE数据库用户账号处于expired状态如何处理

    账户过期,必须要用户更改密码, 账户才能重新使用. 但有些时候, 因为各种原因, 我们并不知道原密码的明文是什么,但很多时候又不能修改已有密码,好在可以用原密码来更改密码. 在11G中,dba_use ...

  3. DG - logical standby switchover切换过程

    从11g起,主库和逻辑备库之间切换不再需要关闭任何数据库实例. 1.检查主数据库是否处于考虑切换状态 SQL> select switchover_status from v$database; ...

  4. weka数据预处理

    Weka数据预处理(一) 对于数据挖掘而言,我们往往仅关注实质性的挖掘算法,如分类.聚类.关联规则等,而忽视待挖掘数据的质量,但是高质量的数据才能产生高质量的挖掘结果,否则只有"Garbag ...

  5. Lintcode: Permutation Index II

    Given a permutation which may contain repeated numbers, find its index in all the permutations of th ...

  6. Winform TreeView 节点拖动

    private void treeView_ItemDrag(object sender, ItemDragEventArgs e) { TreeNode dragNode = e.Item as T ...

  7. websotrm注册码

    webStorm : UserName:William ===== LICENSE BEGIN ===== 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA ...

  8. C++初学者 const使用详解

     关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文. 1. const常量 如: cons ...

  9. hdu4609 3-idiots

    FFT 代码 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  10. demo07

    city_data.xml <?xml version="1.0" encoding="utf-8"?> <resources> < ...