Les appareils mobiles sont limités en termes de CPU/GPU et de mémoire. Par conséquent, la logique de script sur Lua doit être extrêmement léger : un minimum d'allocations, moins de travail dans chaque cadre, un travail raisonnable avec les lignes et les tableaux, une attitude prudente envers le ramasse-miettes (GC). Ci-dessous, vous trouverez le « squelette » des optimisations par lesquelles vous devriez commencer.

1. Profilons, ne devinons pas 🧭
Mesurez où le temps de l'image est perdu : utilisez le profileur de votre moteur (Defold, Solar2D/Corona, etc.) et les minuteries internes. Déterminez chauds fonctions et optimisez-les en premier.
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. Travail avec la mémoire et le GC 🧹
Réutilisez les tableaux au lieu d'en créer fréquemment de nouveaux.
Évitez les allocations dans
update()et les collisions.Collectez des « pools d'entités » (entity pooling) pour les projectiles/particules.
-- Пул на таблицах
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 rapides et modules ⚙️
locals plus rapide que globals : mettez en cache les fonctions fréquemment utilisées.
Conservez les liens vers les fonctions des modules dans les 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. Chaînes et concaténation 🧵
Les lignes sont immuables : chaque concaténation crée une nouvelle ligne. Accumulez les pièces dans le tableau et utilisez 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. Boucles et itérateurs 🔁
Privilégiez le
fornumérique dans la mesure du possible.ipairsest pratique, mais lefor i=1,#tnumérique est souvent plus rapide.pairslaisser pour les tables associatives et pas dans les endroits chauds.
-- Быстро:
for i=1,# arr do local v = arr[i]; -- traitement end6. Métatables et POO 💼
Les méthodes via les métatables sont pratiques, mais les appels inutiles et __index dans les chemins chauds coûtent des FPS. Dans les endroits critiques, référez-vous directement aux champs ou mettez en cache les méthodes dans les méthodes locales.

TOP des erreurs des développeurs Lua débutants
Erreur ❌ | Pourquoi est-ce mauvais 🐌 | Comment corriger ✅ |
|---|---|---|
Création de nouveaux tableaux à chaque image | Soudures GC, microlags | Pool d'objets, nettoyage et réutilisation |
Concaténation de lignes dans les boucles | Beaucoup d'allocations |
|
Mondiaux au lieu de locaux | Accès plus lent | Mettez en cache dans |
| Ordre imprévisible / coûts |
|
Logique lourde dans | Affaissement FPS | Faites des calculs, divisez les tâches, mettez en cache |
Chargement des actifs « à la volée » | Frises à l'E/S | Préchargement, atlas, streaming audio |
Exemple « avant/aprè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
endL'optimisation de Lua sur mobile est une discipline : nous profilons, excluons les allocations inutiles, mettons en cache les fonctions dans local, travaillons soigneusement avec les chaînes et les boucles, utilisons des pools et des atlas. Commencez par les mesures et « enlevez » les goulots d'étranglement de manière ciblée.
Code aide à améliorer les compétences d'optimisation : mini-leçons, tâches pratiques, vérifications et conseils directement dans l'application.
Et nous avons aussi un chaîne de télégram, où nous discutons d'idées intéressantes, partageons nos expériences et analysons ensemble les tâches, apprendre devient non seulement utile, mais aussi amusant.
