モバイルデバイスはCPU/GPUとメモリに制限されています。したがって、スクリプトロジックは Lua 最小限の割り当て、各フレームでの作業の削減、文字列と表の合理的な操作、ガベージコレクター(GC)の配慮など、非常に軽量である必要があります。以下は、最適化の「骨組み」であり、ここから始める価値があります。

1. 推測ではなく、プロファイリングを行います 🧭
フレーム時間が失われる場所を測定します。エンジンプロファイラー(Defold、Solar2D/Coronaなど)と内部タイマーを使用します。 ホット 機能を最初に最適化します。
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. メモリとGCの操作 🧹
新しい表を頻繁に作成する代わりに、表を再利用します。
update()および衝突の割り当てを避けてください。プロジェクタイル/パーティクルのエンティティプールを収集します。
-- Пул на таблицах
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. 高速変数とモジュール ⚙️
ローカルはグローバルよりも速いです。 頻繁に使用する関数をキャッシュします。
モジュール関数へのリンクをローカル変数に保存します。
-- Было (медленнее из-за глобальных поисков):
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. 文字列と連結 🧵
文字列は変更できません。各連結は新しい文字列を作成します。テーブルにパーツを蓄積し、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. ループとイテレーター 🔁
可能な場合は、数値の
forを優先してください。ipairsは便利ですが、数値のfor i=1,#tの方が速いことがよくあります。pairsは、関連テーブル用に残し、ホットスポットには残しません。
-- Быстро:
for i=1,# arr do local v = arr [i]; -- end処理6. メタテーブルと OOP 💼
メタテーブルを介したメソッドは便利ですが、余分な呼び出しと __index がホットパスでFPSを消費します。重要な箇所では、フィールドに直接アクセスするか、メソッドをローカルにキャッシュしてください。

Lua初心者開発者のトップエラー
エラー❌ | 悪い理由🐌 | ✅を修正する方法 |
|---|---|---|
フレームごとに新しいテーブルを作成する | GCスパイク、マイクロラグ | オブジェクトのプール、クリーンアップ、再利用 |
ループ内の文字列の連結 | 多くの割り当て |
|
ローカルではなくグローバル | アクセスが遅くなります |
|
| 予測不可能な順序/コスト | 数値 |
| FPSの低下 | 計算を実行し、タスクを分割し、キャッシュする |
アセットの「オンザフライ」ロード | I/Oの際のフリーズ | プリロード、アトラス、オーディオストリーミング |
「前/後」の例
-- До: много мусора и глобальных обращений
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
endモバイルでのLuaの最適化は、プロファイリング、余分な割り当ての排除、localでの関数のキャッシュ、文字列とループの慎重な処理、プールとアトラスの使用などの規律です。測定から始めて、意図的にボトルネックを「取り除く」ようにします。
コディック 最適化スキルの向上に役立ちます。ミニレッスン、実践的なタスク、チェック、ヒントがアプリ内で直接提供されます。
また、アクティブな テレグラムチャンネル、ここでは素晴らしいアイデアについて話し合い、経験を共有し、課題を一緒に分析します。学習は有益であるだけでなく、楽しいものになります。
