[Prática de Lua] Resolvendo os problemas ignorados em Lua

Resolvendo problemas ignorados em Lua

Insira a descrição da imagem aqui

1. Metatabela e metamétodos

1.1 Meta método _index pode ser definido como tabela

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

1.2. O metamétodo _index pode ser definido como uma função

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. Os metamétodos _index e _newindex implementam tabela somente leitura

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

1.4. Ignorar metamétodos para extrair valores rawget e rawset

Simplificando, é obter e definir diretamente sem usar o metamétodo da metatabela.

local tableA = {}
local tableB = {NUM=100}
local tableC = {}

setmetatable(tableA,{__index = tableB, __newindex = tableC})
print(tableA.NUM)
print(rawget(tableA,"NUM"))

tableA.NAME = "AA"
print(tableA.NAME)
print(tableC.NAME)

rawset(tableA,"NAME","I AM AA")
print(tableA.NAME)

-- 输出结果
100
nil
nil
AA
I AM AA

2.Lua método GC forçado

2.1 coletar lixo()

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. A diferença entre corrotinas e threads

3.1 Corotina coroutine.create() é executada de forma síncrona, não em paralelo. Ele apenas alterna um contexto e retorna após a execução da corrotina.

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 A thread lua só pode passar lua_newthread() e deve contar com outros sistemas C/C++.

4.A diferença entre .e: em lua

.Você precisa passar o objeto obj: você pode usar self:/self. para obter os atributos correspondentes.

5.pontos problemáticos de otimização da lua

5.1 Desempenho do array de acréscimos: for loop insere table>table.insert>t[#t+1]

5.2table.concat tem melhor desempenho de emenda do que string normal...

5.3 Se você usar um objeto C# no Unity, como vector3, o desempenho da transferência direta de xyz será melhor do que o vector3 em caixa e sem caixa

5.4 Use menos variáveis ​​globais e mais tabelas globais

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

local b = GLOBAL
next(table) determina que não vazio
para desempenho é melhor do que while

5.5 Valor padrão de configuração da tabela

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 Tente não criar tabelas e encerramentos em loops for

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

5.7 O GC de Lua pode ser chamado ativamente ao trocar de cena (incluindo o GC de C# para recuperar memória)

5.8 Em XLua/ToLua/SLua, tente minimizar o acesso direto às classes/objetos unitários, incluindo a configuração de valores, e divida os objetos em tipos simples multiparâmetros (string, int, float)

Acho que você gosta

Origin blog.csdn.net/aaaadong/article/details/128803702
Recomendado
Clasificación