[Lua实战]整理Lua中忽略的问题

news2024/9/29 3:20:09

整理Lua中忽略的问题

    • 1.元表metatable和元方法
      • 1.1元方法_index可以设置为table
      • 1.2.元方法_index可以设置为函数
      • 1.3.元方法_index和_newindex实现只读table
    • 2.Lua强制GC方法
      • 2.1 collectgarbage()
    • 3.协程和线程的区别
      • 3.1协程coroutine.create()是同步执行,不是并行,只是切了一个上下文,然后执行完协程切回
      • 3.2线程 lua只能通过lua_newthread()必须依托C/C++其他系统才可以
    • 4.lua中.和:的区别
    • 5.lua优化痛点
      • 5.1追加array性能:for循环插入table>table.insert>t[#t+1]
      • 5.2table.concat比正常的字符串..拼接性能要好
      • 5.3如果用到unity中的c#对象比如vector3,直接传xyz的性能好于装箱拆箱后的vector3
      • 5.4少用全局变量,多使用全局的表
      • 5.5配表设置默认值
      • 5.6 尽量不要在for循环创建表和闭包
      • 5.7 场景切换时可以主动调用Lua的GC(包括C#的GC回收内存)
      • 5.8 XLua/ToLua/SLua中尽量少直接访问unity的类/对象,包括设置值,把对象拆分为多参数简单类型(string,int,float)

在这里插入图片描述

1.元表metatable和元方法

1.1元方法_index可以设置为table

a = {k = 'va'}
b = {kb = 1,k = 'vb'}
mataTb = { __index=b }
setmetatable(a,mataTb)
print(a.kb,a.k)--输出为 1  va

1.2.元方法_index可以设置为函数

a = {k = 'va'}
mataTb = { __index = function(tableA, key)--将a和键传给该函数
	return 'key:'..key --此处..是拼接两个字符串
end }
setmetatable(a,mataTb)
print(a.kk,a.k)--输出为 key:kk  va

1.3.元方法_index和_newindex实现只读table

b = {k = 'v1'}
function func(tb, key, val)
	print('你不能修改表')
end
a = {}
setmetatable(a, { __index = b , __newindex = func})
a.k1 = 1
print(a.k, a.k1)
--上述输出为
你不能修改表
v1	nil

2.Lua强制GC方法

2.1 collectgarbage()

function table.count(t)
    if type(t) ~= "table" then
        assert(false)
        return
    end

    local n = 0
    for k, _ in pairs(t) do
        n = n + 1
    end
    return n
end

local t = {
    x1 = "hello",
    x2 = "world",
    [1] = "x1111",
}

print(table.count(t))
t.x1 = nil
collectgarbage()
print(table.count(t))

--上述输出为
3
2

3.协程和线程的区别

3.1协程coroutine.create()是同步执行,不是并行,只是切了一个上下文,然后执行完协程切回

local function run(data)
print("co-body", 1, data.a)
print("co-body", 2, data.a)
print("co-body", 3, data.a)
coroutine.yield()
print("co-body", 4, data.a)
print("co-body", 5, data.a)
coroutine.yield()
end

local co = coroutine.create(run)

local data = {a=1}
coroutine.resume(co, data)

for i=1,5 do
print("main", i)
end
coroutine.resume(co, data)

3.2线程 lua只能通过lua_newthread()必须依托C/C++其他系统才可以

4.lua中.和:的区别

.需要传入obj对象 :是可以用self:/self.拿到对应的属性的

5.lua优化痛点

5.1追加array性能:for循环插入table>table.insert>t[#t+1]

5.2table.concat比正常的字符串…拼接性能要好

5.3如果用到unity中的c#对象比如vector3,直接传xyz的性能好于装箱拆箱后的vector3

5.4少用全局变量,多使用全局的表

http://lua-users.org/wiki/OptimisingUsingLocalVariables

local b = GLOBAL
next(table)判断非空
for 性能比 while 好

5.5配表设置默认值

local defaultValues = {
   robotName = "des_3115",
}
 
local ARENA = {
   [1] = { rank = { 1, 1, }, robotGroupId = 5000, },
   [2] = { rank = { 2, 2, }, robotGroupId = 4999, },
   [3] = { rank = { 3, 3, }, robotGroupId = 4998, },
   [4] = { rank = { 4, 4, }, robotGroupId = 4997, },
   [5] = { rank = { 5, 5, }, robotGroupId = 4996, },
   [6] = { rank = { 6, 6, }, robotGroupId = 4995, },
   [7] = { rank = { 7, 7, }, robotGroupId = 4994, },
}
 
do
    local base = {
        __index = defaultValues, --基类,默认值存取
        __newindex = function()
            --禁止写入新的键值
            error("Attempt to modify read-only table")
        end
    }
    for k, v in pairs(ARENA) do
        setmetatable(v, base)
    end
    base.__metatable = false --不让外面获取到元表,防止被无意修改
end
 
return ARENA

5.6 尽量不要在for循环创建表和闭包

local t = {1,2,3,'hi'}
for i=1,n do
    --执行逻辑,但t不更改
    ...
end

5.7 场景切换时可以主动调用Lua的GC(包括C#的GC回收内存)

5.8 XLua/ToLua/SLua中尽量少直接访问unity的类/对象,包括设置值,把对象拆分为多参数简单类型(string,int,float)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day874.MySQL索引选择出错问题 -MySQL实战

MySQL索引选择出错问题 Hi,我是阿昌,今天学习记录的是关于MySQL索引选择出错问题的内容。 写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。 不知道有没有碰到过这种情况&#xff0…

Android开发进阶—invoke反射及其原理解析

反射的概念 反射:Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息程序中的对象一般都是在编译时就确定下来,Java反射机制可以动态地创建对象并且…

含有吲哚基团132557-72-3,2,3,3-三甲基-3H-吲哚-5-磺酸

基础产品数据(Basic Product Data):CAS号:132557-72-3中文名:2,3,3-三甲基-3H-吲哚-5-磺酸,2,3,3-三甲基-3H-吲哚-6-磺酸钾盐英文名:5-Sulfo-2,3,3-trimethyl indolenine sodium salt&#xff0…

Axure原型图设计工具使用记录

Axure原型图设计工具使用记录 Axure快速入门(01) - 面板介绍 https://blog.51cto.com/u_15294985/3007677 Axure快速入门(02) - 入门例子(登录案例) https://developer.aliyun.com/article/1046689 Axu…

03 python 要点(函数+类)

第8章 函数 8.1 定义函数 函数就是执行特定任务的一段代码, 自定义函数的语法格式, 以英文半角冒号结尾. # def: 8.2 调用函数 在定义好函数后,既可调用函数. 8.2.1 使用位置参数调用函数 在调用函数时传递的实参与定义函数时的形参顺序一致,这…

LoongArch上正常使用`pip install`

原创:你在使用loongarch架构操作系统时,是否遇到pip install 安装失败的情况? 刷到这篇文章,大家可添加评论或者私信我,及时满足大家的需求那么,下面讲一下如何配置loongarch架构的pip 仓库及开发原理如何配…

Java集合(五)LinkedList底层扩容源码分析

LinkedList的全面说明: (1)LinkedList底层实现了双向链表和双端队列特点 (2)可以添加任意元素(元素可以重复),包括null. (3)线程不安全,没有实现同步 LinkedList的底…

MicroBlaze系列教程(1):AXI_GPIO的使用

文章目录 @[toc]简介常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第1篇文章。 简介 AXI GPIO是基于AXI-lite总线的一个通用输入输出IP核,可配置为一个或两个通道,每个通道32位,每一位可以通过SDK动态配置成输入或输出方向,支持中断请求,配合中断控…

计算机网络第三章 传输层

本文部分图片(PPT截图)来自中科大计算机网络top down3.0 目录[TOC]3.1 概述传输层TCP和UDP协议可以在IP协议主机到主机通信的基础上,实现进程到进程之间的通信(利用端口号)真正实现端到端的通信【通过多路复用于解复用…

b站黑马Vue2后台管理项目笔记——(3)用户列表

说明: 此项目中使用的是本地SQL数据库,Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图: 三.用户列表的开发 目标效果: 点击二级菜单——用户列表,在右侧展示用户列表对应的内容&#xf…

羊了个羊,低配纯前端实现,代码开源

各位朋友们大家好,我是克隆窝。 我属实被“羊了个羊”气到了,就是通不过第二关,迫不得已自己弄了个网页版的“鱼了个鱼” 游戏的玩法非常简单,类似 “消消乐”,从一堆方块中找到相同图案的 3 个方块并消除即可。 文末…

火山引擎边缘计算在云边协同方面的探索与实践

作者:杜怀宇近期,由边缘计算产业联盟(ECC)主办的2022边缘计算产业峰会(ECIS2022)以云端直播形式成功举办,峰会以“边云智联 助力行业数字化转型”为主题,汇聚来自全球的商业领袖、国…

JavaScript基础复盘1

JS有三种书写位置,分别为行内,内嵌和外部。 注意,引用外部JS文件,script双标签内部不可以写代码了。 JavaScript输入输出语句 变量 变量的使用 变量再使用时分为两步:1.声明变量 2.赋值 实现用JavaScript接受用户输入…

最近公共祖先

最近公共祖先(Lowest Common Ancestor,LCA) 指两个点的公共祖先中,离根最远/深度最深的 性质: 1.LCA({u})uLCA\left(\left\{u\right\}\right) uLCA({u})u 2.若uuu是vvv的祖先,当且仅当LCA(u,v)uLCA\left(…

[Lua实战]Skynet-1.如何启动(linux环境启动)[开箱可用]

Skynet-如何启动1.依赖环境:可登录&联网的linux(Centos7)系统(可以是虚拟机)2.yum安装依赖库3.git clone skynet项目4.编译skynet4.1有可能遇到的错误(升级gcc到4.9以上即可解决):5.测试运行skynet6.运行结果最近用到了lua,想了解下云风大神的skynet,在网上看了半天也没入门…

Spire.Pdf for Java v9.1.4 Patcher

Spire.PDF for Java是一种 PDF API,它使 Java 应用程序无需使用第三方SDK 即可读取、写入和保存 PDF 文档。使用这个 Java PDF 组件,开发人员和程序员可以实现丰富的功能,从头开始创建 PDF 文件或完全在 Java 应用程序(J2SE 和 J2…

leetcode刷题记录总结-7.二叉树

文章目录零、二叉树理论二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树二叉树的存储方式二叉树的遍历方式二叉树的定义总结一、二叉树的遍历[144. 二叉树的前序遍历 ](https://leetcode.cn/problems/binary-tree-preorder-traversal/)题解递归实现迭代实现[94. 二叉树…

如何运营企业网站

企业网站的最终目的是给企业带来效益,树立企业形象。只要有这个目标定位,剩下的工作就是围绕这个定位去做和优化,米贸搜整理如下:1.增强被收录页面的重要性。收录页面的提升不仅仅是数量的提升,质量占据了很高的比重。…

网络安全协议

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会进行网络安全协议的讲解 一.网络安全 1.什么是网络安全 网络安全&#xff…

导数的概念——“高等数学”

各位CSDN的uu们你们好呀,今天小雅兰的内容是导数的概念,其实在高中时期,我们就已经接触过导数了,但是那个时候学得并不是特别深入,依稀记得,我们当初的导数大题一般都是压轴题,很多学校每次讲解…