Los dispositivos móviles están limitados en CPU/GPU y memoria. Por lo tanto, la lógica de secuencias de comandos en Lua debe ser extremadamente ligero: un mínimo de asignaciones, menos trabajo en cada cuadro, trabajo razonable con filas y tablas, respeto por el recolector de basura (GC). A continuación se muestra el «esqueleto» de las optimizaciones por las que vale la pena empezar.

1. Perfilamos, no adivinamos 🧭
Mida dónde se pierde el tiempo del cuadro: utilice el perfilador de su motor (Defold, Solar2D/Corona, etc.) y los temporizadores internos. Determine calientes funciones y optimízalas primero.
local clock = os.clock
local function bench(fn, iters)
local t0 = clock()
for i=1,iters do fn() end
return (clock()-t0)*1000
end
print("ms:", bench(updateEnemies, 1000))2. Trabajo con la memoria y GC 🧹
Reutiliza las tablas en lugar de crear nuevas con frecuencia.
Evite las asignaciones en
update()y las colisiones.Recopila «grupos de entidades» (entity pooling) para proyectiles/partículas.
-- Пул на таблицах
local pool = {}
local function acquire()
return table.remove(pool) or {x=0,y=0,vx=0,vy=0,alive=false}
end
local function release(obj)
obj.alive=false; obj.x=0; obj.y=0; obj.vx=0; obj.vy=0
pool[#pool+1]=obj
end3. Variables rápidas y módulos ⚙️
locals es más rápido que globals: almacene en caché las funciones de uso frecuente.
Guarda los enlaces a las funciones del módulo en variables locales.
-- Было (медленнее из-за глобальных поисков):
function tick(dt) math.sin(dt); math.cos(dt) end
-- Стало (быстрее благодаря локальным ссылкам):
local sin, cos = math.sin, math.cos
function tick(dt) sin(dt); cos(dt) end4. Cadenas y concatenación 🧵
Las cadenas son inmutables: cada concatenación crea una nueva cadena. Acumula las partes en una tabla y usa table.concat.
-- Плохо:
local s = ""
for i=1,1000 do s = s .. i end
-- Хорошо:
local t = {}
for i=1,1000 do t[i]=i end
local s = table.concat(t, ",")5. Ciclos e iteradores 🔁
Prefiera el
fornumérico siempre que sea posible.ipairses conveniente, pero elfor i=1,#tnumérico suele ser más rápido.pairsdejar para tablas asociativas y no en lugares calientes.
-- Быстро:
for i=1,# arr do local v = arr[i]; -- procesamiento end6. Metatablas y OOP 💼
Los métodos a través de metatablas son convenientes, pero las llamadas innecesarias y __index en rutas calientes cuestan FPS. En lugares críticos, dirígete a los campos directamente o almacena en caché los métodos en locales.

Los principales errores de los desarrolladores principiantes de Lua
Error ❌ | ¿Por qué es malo? 🐌 | Cómo arreglarlo ✅ |
|---|---|---|
Creación de nuevas tablas en cada fotograma | Soldaduras GC, microlags | Grupo de objetos, limpieza y reutilización |
Concatenación de cadenas en bucles | Muchas asignaciones |
|
Globales en lugar de locales | Acceso más lento | Almacenar en caché en |
| Orden/costes impredecibles |
|
Lógica pesada en | Descenso de FPS | Realiza cálculos, divide tareas, almacena en caché |
Carga de activos «sobre la marcha» | Frisos en I/O | Precarga, atlas, transmisión de audio |
Ejemplo de «antes/después»
-- До: много мусора и глобальных обращений
function spawnBullets(n)
for i=1,n do
local b = {x=0,y=0,vx=0,vy=0,alive=true}
table.insert(bullets, b)
end
end
-- После: пулы + локальные ссылки
local insert = table.insert
function spawnBullets(n)
for i=1,n do
local b = acquire() -- из пула
b.alive=true; b.x=0; b.y=0; b.vx=0; b.vy=0
insert(bullets, b)
end
endLa optimización de Lua en dispositivos móviles es una disciplina: perfilamos, excluimos asignaciones innecesarias, almacenamos en caché funciones en local, trabajamos cuidadosamente con cadenas y bucles, usamos grupos y atlas. Comience con las mediciones y «elimine» los cuellos de botella de forma intencionada.
Kodik ayuda a mejorar las habilidades de optimización: minilecciones, tareas prácticas, comprobaciones y sugerencias directamente en la aplicación.
Y también tenemos un canal de telegram, donde discutimos ideas geniales, compartimos experiencias y analizamos juntos las tareas: aprender no solo es útil, sino también divertido.
