Bei Handyspielen entscheidet die Bildrate. Ein Mikrolag - und der Spieler klickt bereits unzufrieden auf das Kreuz. Auf einem PC kann man sich ein paar zusätzliche Operationen leisten, aber ein Smartphone verzeiht das nicht: Es gibt weniger Leistung, weniger Speicher und der Akku ist schneller leer als der Kaffee in der Tasse eines Programmierers.
Wenn Sie ein Spiel in Lua schreiben - sei es Defold, LÖVE2D, Solar2D oder eine andere Engine - haben Sie bereits einen Vorteil: Die Sprache ist einfach, schnell und flexibel. Das bedeutet aber nicht, dass man sich entspannen kann. Selbst auf Lua kann man FPS leicht ertränken, wenn man nicht über Optimierung nachdenkt.
In diesem Artikel werden wir die Techniken analysieren, die Ihnen helfen, das Beste aus dem Code herauszuholen: die Leistung zu steigern, den Prozessor zu entlasten, den Energieverbrauch zu senken und Ihr Spiel auf jedem Gerät zum Laufen zu bringen.
📢 Besuchen Sie uns in Telegram-Kanal! Dort ist es gemütlich, geschäftlich und ohne Spam 😊

Warum ist das gerade auf Mobilgeräten wichtig? ⚡
Plattformbeschränkungen
Weniger CPU/GPU und RAM.
Empfindlichkeit gegenüber GC-Pausen und „Mikrofrost“.
Der Spieler sieht den FPS-Abfall und schließt das Spiel einfach.
Aufgabe des Entwicklers
Minimieren Sie die Speicherzuweisungen im Frame.
Reduziere die Anzahl der Draw Calls und die Arbeit außerhalb des Bildschirms.
Nur das aktualisieren, was wirklich benötigt wird.
1) Messen statt raten 🧪
Optimierung ohne Profiler ist wie Reparatur mit geschlossenen Augen. Schalte die Engine-Tools ein (Defold Profiler, FPS-Grafiken in LÖVE2D/Solar2D) und messe die „heißen“ Bereiche direkt im Frame.
-- Простой таймер под LÖVE2D / Lua
local t0 = os.clock()
-- горячий код
local dt = os.clock() - t0
if dt > 0.004 then
print(("Slow: %.3f ms"):format(dt * 1000))
end
Lifehack: Halte den FPS-Indikator während der Entwicklung auf dem Bildschirm — du wirst Lags früher als der Spieler fangen.
2) Wir entfernen den Müll: weniger Allokationen - weniger Frisierungen 🧹
♻️ Objektpools: Tabellen/Schalen/Vektoren wiederverwenden.
📦 Wählen Sie Arrays der gewünschten Größe im Voraus aus.
🔗 Verketten Sie keine Zeilen in einer Schleife — kopieren Sie sie in eine Liste und führen Sie
table.concataus.
-- Пул снарядов
local pool = {}
local function acquire()
return table.remove(pool) or {x=0,y=0,active=true}
end
local function release(b)
b.active=false; b.x=0; b.y=0
pool[#pool+1] = b
end
Stimme GC ab: collectgarbage("setpause",110), setstepmul≈200. Führe beim Szenenwechsel eine vollständige Sammlung durch.
3) Lokale Variablen — kostenloser Turboboost 🚀
-- Вместо глобальных обращений кэшируй ссылки
local sin, cos, sqrt = math.sin, math.cos, math.sqrt
local gfx = love.graphics -- или display/go/sprite под ваш движок
Globale Variablen werden über eine Hash-Tabelle gesucht. Die Einsparungen bei einer Operation sind gering, aber bei 60 FPS × Hunderte von Objekten sind es bereits Sekunden.
4) Schneller Zyklus: dichte Arrays und vorhersehbarer Durchlauf 🔢
-- Хорошо: плотный числовой массив
local actors = {a1, a2, a3}
for i = 1, #actors do actors[i]:update(dt) end
Vermeide „Lücken“ und gemischte Tabellen. for i=1,#t ist normalerweise schneller und stabiler als pairs.
5) Erzeugen Sie keinen Müll im Hot Code 🔥
Anti-Beispiel
-- каждый кадр создаёт новую функцию сравнения
table.sort(enemies, function(a,b) return a.hp > b.hp end)Richtig
local sortByHP = function(a,b) return a.hp > b.hp end
table.sort(enemies, sortByHP)6) Aktualisieren Sie nur das, was Sie brauchen: Lazy Ticks und Sichtbarkeit 🎛️
Entferne Objekte außerhalb des Bildschirms (Kamera/Fenster).
KI und Pfadsuche — alle 0,1–0,2 Sekunden, nicht jedes Bild.
Physik - fester Schritt (30-60 Hz), Render - jedes Bild.
7) Mathematik ohne Überflüssiges: Quadrate statt Wurzeln 📐
local dx, dy = x1-x2, y1-y2
if dx*dx + dy*dy < r*r then
-- столкновение
end
Konstanten (local PI2 = math.pi*2) zwischenspeichern, trigonometrische Werte - wenn möglich vorab berechnen.
8) Schwierige Aufgaben — außerhalb des Game Loops 🧵
JSON-Analyse, Ebenengenerierung, Laden von Sounds - beim Laden der Szene oder in Coroutines zwischen den Frames starten. Lass nur das Wichtigste im Frame.
9) Rendering: Patches und Atlases 🎨
Sammle Sprites in Atlanten - weniger Texturwechsel.
Gruppiere das Zeichnen: ein Material/Shader - ein Block.
Zeichne nicht das Unsichtbare: Clipping/Frustum-Culling für 2D - ein Muss.
10) Schnelle Diagnose — schnelle Lösungen 🩹
Symptom | Mögliche Ursache | Was tun? |
|---|---|---|
Absenkung beim Wellen-Spawn | Massenallokationen/Objekterstellung | Pools, Preload, Spawn auf mehrere Frames verteilen |
Periodische Mikrofrisuren | Müll sammeln | Zuweisungen reduzieren, GC-Tuning, manuelles GC beim Szenenwechsel |
Hoher Batterieverbrauch | Unnötige Updates / Timer | Seltene Ticks von sekundären Systemen, Stop-Updates off-screen |
Die Benutzeroberfläche zuckt | Häufige Überarbeitung von Text/Layout | Bitmap-/Render-Target-Cache, Rebuild nur bei Änderung |
Mini-Beispiel: „seltenes“ Update des Hilfssystems ⏱️
local acc = 0
function updateAmbient(dt)
acc = acc + dt
if acc >= 0.1 then -- 10 Гц вместо 60
acc = acc - 0.1
-- лёгкая логика фона / частицы / AI на дальних слоях
end
end
📚 Möchten Sie tiefer in das Thema einsteigen?
Im Anhang Kodik Sie finden detaillierte Lektionen zu diesem Thema, Schritt-für-Schritt-Übungen, Fehleranalyse und praktische Übungen direkt auf Ihrem Handy oder im Browser.
Und wenn Sie über Neuigkeiten, neue Funktionen und nützliche Materialien informiert werden möchten, abonnieren Sie unseren Telegram-Kanal. Dort ist es gemütlich, geschäftlich und mit Liebe zum Code ❤️
