一、 闭包
闭包:使得内部函数能够调用外部函数的局部变量
local newrequire = function(folder)
return function(file)
Return require(folder…src…file)
end
End
Game.require = newrequire(“gameSk”)
Import(“.fish”) 替换为 game.require(“fish”)

2.通过闭包也可以实现
二、 .和:的区别

  1. 变量访问用 .
  2. 函数访问
    Function Fish.create(_type)
    Function Fish:create(_type)
    用冒号(:)调用函数时,会默认传一个值(调用者自身self)作为第一个参数; 用点(.)调用函数时,则没有
    用冒号(:)创建函数时,会默认添加一个参数self,作为第一个参数;
    用点(.)调用函数时,则没有
    . 和 :函数可以相互调用,但需要正确的传递self值。
    三、 Table
    元表的元方法
    __add 运算符 +
    __sub 运算符 -
    __mul 运算符 *
    __ div 运算符 /
    __mod 运算符 %
    __unm 运算符 -(取反)
    __concat 运算符 …
    __eq 运算符 ==
    __lt 运算符 <
    __le 运算符 <=
    __call 当函数调用
    __tostring 转化为字符串
    __index 调用一个索引
    __newindex 给一个索引赋值
    (1) lua通过元表来实现面相对象
    __index
    调用table的一个不存在的索引时,会使用到元表的__index元方法
    查找__index元方法表,若有该索引,则返回该索引对应的值,否则返回nil

__index 作为函数则是调用,作为table则是查找

Local _mt = {}
_mt.__index = function(_tb,key)
Print(“this is” … key)
End

t = {1,2,3}
Print(t.key)
Setmetatable(t,_mt)
Print(t.key)

Local _mt = {}
_mt.__index = {key = “this is test”}

t = {1,2,3}
Print(t.key)
Setmetatable(t,_mt)
Print(t.key)

__nexindex
当为table中一个不存在的索引赋值时,会去调用元表中的__newindex元方法
作为函数则是调用,作为table则是添加k/v,但是不改变table
rawget 和 rawset
有时候我们希望直接改动或获取表中的值时,就需要rawget和rawset方法了。
rawget可以让你直接获取到表中索引的实际值,而不通过元表的__index元方法。
Local _mt = {}
_mt.__newindex = function(_tb,key,value)
rawset(_tb,key,value)
end

实现只读table
local mt = {
__newindex =
function (t,k,v)
error(“attempt to update a read-only table”,2)
end
}
Local tb = {}

setmetatable(tb,mt) – 设置代理table的元表
目前代码采用cocos2dx封装的class方法
Local classA = class(“classA”) ==>>
写法1
classA.__index = classA
Function classA.create()
Local obj = {}
setmetatable(obj,classA)
Return obj
End

Function classA:create()
Local obj = {}
self.__index = self
setmetatable(obj,classA)
Return obj
End

—写法2 cocos2dx节点
Local classA= require(“classA”)
Local classB= require(“classB”)
Function appendtable(src,dst)
For k,v in pairs(dst)
Src[k] = v
End
end
Function classC.create()
Local obj = cc.Node:create()
Appendtable(obj,classA)
Appendtable(obj,classB)
Return obj
End
Function classC:init()
End
四、 … 可变参数
Local functiona = function(…)
Local param = {…}
Print(param[1],param[2])
End
–如果变长参数中故意传入nil
–那么就要使用select函数来访问变长参数列表了.
–select得以参数如果传入的是整数n, 返回的是第i个元素开始到最 后一个元素结束的列表
–如果传入的是"#",则返回参数列表的总长度
select(n, …) --数字n表示起点,select(n, …)返回从起点n到结束的可变参数
Local _idx = 3
… 是 0,1,2,3,4,5
Print(select(_idx,…)) 2,3,4,5
Print(select(“#”…)) 5

五、 多返回值
(1) Local function ()
Local a,b = 1,1
Return a,b
End
(2) Lua 调用 c++ 返回值
Static int Lua_call_c(L)
{
Lua_pushnum(L,1)
Lua_pushnum(L,2)
Return 2
}
Local par1,par2 = lua_call_c()
六、 安全判断
local function getData(_key)
If data == nil then return nil end
return data[_key]
end
Local _value = getData(_key)
Print(“_value =”,_value)
七、 常见运行错误
attempt to index upvalue (类没有返回)
attempt to index local ‘self’ (a nil value) (.和:弄混了)
attempt to call method ‘Func’ (a nil value) (写错了–大小写或者笔误)
attempt to call global ‘getScheduler’ (写错了–大小写或者笔误)
syntax error during pre-compilation (语法错误 常见在 end对不上)
Invalid cobj’ in function ‘lua_cocos2dx_Node_setVisible’(cobj为空了或者已经被销毁了,debug会报错,release会崩溃)
attempt to perform arithmetic on local ‘x’ (a nil value) (与nil的x进行了运算操作)
八、 Apk 大小及优化

Lib 包含各平台需要的so文件
Assets 应用所需要的资源(lua代码+资源)
Res 未编译到的资源
Resources.arsc 已编译到的资源
Meta_inf 签名文件
Classs.dex 代码二进制文件
(一) 包体大小
(1) .so 保证apk中只有一套架构 对浮点运算有高需求的采用 armable-v7a否则采
用armeable
libcocos2dx角度缩减包体是剔除掉不用的模块
ccConfig.h 中
#define CC_USE_WEBP 0 不需要的
#define CC_USE_WEBP 1 需要的
或者 jni/Application.mk中
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=0 -DCC_ENABLE_BOX2D_INTEGRATION=0 -DCC_USE_3D_PHYSICS=0 -DCC_USE_WEBP=0 -DCC_USE_TIFF=0 -DCC_USE_NAVMESH=0 -std=c++11 -fsigned-char -Wno-extern-c-compat
(2) .游戏内资源(声音+图片)
你需要很清楚当前自己项目什么地方占的体积最多,例如动画序列多少MB,声音占用,普通UI占用

  1. .声音(.mp3)
    .音频有三个因素影响文件大小,分别是音频文件格式,比特率,和样本率
    .采样率 96-128kbps ,比特率44kHz
  2. .图片(coco2dx支持的格式)
    A. png
    B. jpg
    C. pvr/etc压缩纹理
    D. webp
    E. s3tc atitc tga s3tc用于pc
    压缩纹理不需要cpu解码,能直接被gpu接收
    解析速度 webp<jpg<png< etc/pvr
    体积 webp < jpg < png/ etc/pvr
    采用压缩纹理需根据平台准备对应的2份纹理
    Webp没使用

png24/32是无压缩格式的RGBA通道,质量是最好的,真彩色存储
JPG是有损压缩的格式,不支持ALPHA通道,但是是安装包最小的。

但JPG会进行内存解压,也就是说,一个JPG读入到内存后,与png24/32读入内存是一样的。

目前采用方式png+jpg
A. 采用工具对资源进行
B. 采用png压缩工具等
C. 降低图片质量,png32->png8
D. 使用特定的压缩格式的图片
E. 如果项目中帧序列动画占的比较多,那么可以采取减帧
F. 缩放图片,九宫格,图片对称翻转
G. 采用骨骼动画
H. 分包 (公用 – 大厅 – 游戏)
I. 隔几个版本清理资源
Tiny androidstudio插件
https://github.com/meili/TinyPIC_Gradle_Plugin
(3).原生相关

  1. 第三方库 公司的库文件去掉没用的模块,避免重复导入

  2. 删除dex中的垃圾指令、通过混淆来减少dex的大小

  3. 语言优化 .android {
    defaultConfig {
    resConfigs “zh”, “zh-rCN”
    }
    }
    (二) 游戏内存(绝大部分内存被纹理占用)
    cocos2d里面纹理加载分为两个阶段:1.从图片文件中创建一个UIImage对象;2.以这个创建好的UIImage对象来创建CCTexture2D对象。这意味着,当一个纹理被加载的时候,在短时候内,它会消耗两倍于它本身内存占用的内存大小.

  4. .像素格式
    A. rgba8888
    B. rgba4444
    C. rgb565 (没有透明度)适合背景图及规则图片)
    D. rgb5a1 不支持半透明
    Cocos2dx 对非压缩纹理默认采取rgba8888 ,可以通过
    cc.Texture2D:setDefaultAlphaPixelFormat设置

  5. 图片声音的释放
    ccexp.autoEngine.uncache
    cc.animationcache:destoryInstance
    cc.spriteframe:getInstance():removeUnusedSpriteFrames
    cc.director:getInstance():gettexturecache():removeUnusedTextures()
    目前产品游戏模式比较单一,每个场次资源和声音没有区别,基本上没有在纹理和声音释
    放上有操作
    (三) 性能
    (1) 卡顿

  6. .声音文件和资源文件预加载
    cc.driector:getInstance():getTextureCache():addImageAsync()
    ccs.armaturedatamanger:getInstance():addArmatureFileinfoasync()
    ccexp.autoEngine.preload

  7. .频繁播放的音效文件时间要短
    (2) 发热
    A. 降低游戏循环复杂度
    B. 降低drawcall数量(合图、动态调整帧率)
    C. 粒子使用不合理
    D. 频繁的io操作
    下图为渲染流程
    继承于Layout控件,支持裁剪的话会有单独的渲染队列
    Z_order 分为3种 <0 =0 >0

Cocos2dx + lua分享相关推荐

  1. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  2. cocos2d-x lua table数据存储

    cocos2d-x lua table数据存储 version: cocos2d-x 3.6 1. 将table转为json http://blog.csdn.net/songcf_faith/art ...

  3. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

  4. Cocos2d-x Lua中实例:帧动画使用

    Cocos2d-x Lua中实例:帧动画使用 下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. ...

  5. cocos2d-x+lua开发模式下编辑器的选择

    cocos2d-x+lua开发模式下编辑器的选择 原本打算直接用CocosIDE的,毕竟是官方出品,并且支持Android远程调试,windows下的调试也非常方便,调试的信息也非常全,智能提示也不错 ...

  6. 反编译 cocos2dx+lua

    严正声明:本帖所有的技术手段仅供用于技术学习使用,禁止用于商业目的! 1.准备工作 下载要反编译的 apk 文件(Android安装包),然后解压. 2.获取XXTEA的Key和Sign 目前大多数的 ...

  7. Cocos2dx Lua开发环境搭建

    本文记录在 Windows 下搭建 cocos2dx lua 开发环境,还有调试设置. 系统:Windows 7 64 IDE:Mircrosoft Visual Studio 2013 Cocos2 ...

  8. cocos2dx lua 日志系统

    在实际开发过程中,代码日志是必不可少的系统,尤其是在线上版本中,对于查找问题相当有帮助.但是cocos2dx lua的代码日志是基于lua的print打印,只写在console中,不会长久保存.怎么办 ...

  9. Cocos2d-x Lua cc ccsccui区别和使用

    其实这些区别归因于cocos2dx lua对应API版本号的问题,因为以前cocos用cocos2d-lua写,后来带领大家往quick转,现在合并后,又带领大家回到cocos-lua,所以必定会产生 ...

最新文章

  1. 智能车竞赛技术报告 | 单车拉力组-大连海事大学-同舟拾队
  2. AutoMapper2
  3. android通过Jni加载so库遇到UnsatisfiedLinkError问题!!!
  4. 可视化实战!Python+BI,手把手教你做炫酷的NBA可视化分析
  5. rockycapture_RockyCapture航线规划软件介绍文档
  6. CSS3过渡练习-进度条(CSS3)
  7. jquery多字段筛选,极简方法
  8. 如何成为一个网红照骗?一个插件搞定,亲妈都认不出!
  9. 贪吃蛇游戏设计预习01
  10. 求助动态贝叶斯网络参数学习函数的使用方法
  11. fastboot工具使用
  12. IDEA external library 这个里面是空的怎么办
  13. css单行文本和多行文本溢出显示省略号...
  14. VS2008下水晶报表之简单示例
  15. Vmware VDI\桌面虚拟化\虚拟化技术\IT 管理
  16. Python爬取全国大学排名 用pyecharts进行大屏可视化
  17. OSChina 周四乱弹 ——老板:把骨头统统交出来
  18. Kali漏洞扫描工具OpenVas
  19. Linux下Makefile中动态链接库和静态链接库的生成与调用
  20. H5在线CAD后台读写CAD文件

热门文章

  1. 深扒,用 6 部分讲完 Java 性能调优:多线程 + 设计模式 + 数据库
  2. 树的结构比图更加严格,那么具体在哪几个点严格呢?
  3. 【爬虫】分类爬取小米商店的apk
  4. html5时间表js特效代码
  5. r语言barplot函数图中加标签_R语言中绘制条形图的简单方法
  6. ClearCase指南-基础篇(连载一)
  7. python matplotlib输出矢量图svg(可插入word,仍为高清)
  8. 混沌映射与动态学习的自适应樽海鞘群算法-附代码
  9. 集团信息化之路——物资库存管理软件需求报告
  10. ArcGIS 9.3 下载