CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+collectgarbage:GC的手动触发与分步本质

2026-09-29 15:16 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

collectgarbage 的分步回收就这一行:

lua
collectgarbage("step", 200)

"step" 模式让 GC 执行一步增量回收——参数 200 是步长——分步回收的全部机制就这一行。可这一行的前后各有一个场景:前面是"内存持续增长但不想让 GC 一次性停顿太久",后面是"分步回收的总工作量等于全量回收"。今天拆开。

一、全量、分步、自动三段

collectgarbage 的三段。全量:collectgarbage("collect") 执行一次完整的 GC 循环——标记、清理、清扫三阶段一次性完成——耗时不可控,大堆可能停顿几十毫秒。分步:collectgarbage("step", size) 执行一步增量 GC——每次只做一小部分工作——多次调用分步 GC 的总工作量等于一次全量 GC——停顿被分散到多次调用中。自动:Lua 的 GC 默认自动运行——内存分配达到阈值自动触发——setpause 和 setstepmul 可以调自动触发的阈值和步进速度。三段连起来:collectgarbage 玩的是"GC 停顿的可控化"——全量 GC 是一次性大停顿,分步 GC 是多次小停顿——游戏开发中分步 GC 优于全量 GC。

mermaid
graph TD
    A["collectgarbage模式"] --> B["collect: 全量回收"]
    A --> C["step: 增量回收"]
    A --> D["count: 查询内存"]
    C --> E["参数size控制步长"]
    C --> F["多次step = 一次collect"]
    B --> G["一次性大停顿"]

二、分步回收的正确写法

lua
-- 每帧执行一步分步GC
local function onFrameGC()
    local stepSize = 200
    collectgarbage("step", stepSize)
end

-- 场景切换时执行全量GC
local function onSceneChange()
    collectgarbage("collect")
    collectgarbage("collect")   -- 两次确保彻底
end

-- 查询当前内存
local function getMemoryKB()
    return collectgarbage("count")
end

SL:RegFrameCallback(onFrameGC)
SL:On("scene_change", onSceneChange)

return { getMemoryKB = getMemoryKB }

collectgarbage("count") 返回当前 Lua 使用的内存量(KB)——监控内存趋势比监控单次值更有意义——内存持续增长说明有引用泄漏。

三、步长的选择与内存的监控

步长 200 是分步回收的默认建议值:步长太小 GC 进度太慢内存持续增长,步长太大单次停顿太长影响帧率——200 是"单步停顿不超过一帧"的经验值。内存监控的意义不在于"看当前值"而在于"看趋势":每秒采样一次 collectgarbage("count") 画趋势图——趋势平稳说明没有泄漏,趋势持续上升说明有引用泄漏——引用泄漏的根源通常是"全局表持有了不再使用的对象引用"。最后一条纪律:collectgarbage("stop") 可以暂停 GC——暂停后内存持续增长且不会被回收——collectgarbage("restart") 恢复 GC——除非有极其特殊的内存管理需求,否则不要停止 GC——GC 停了就没人帮你回收垃圾了。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

绝境回纹:血越少纹越亮,一口气回到满

【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

双纹换形:红纹饮刀蓝纹披甲,一念换身

【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

免死金纹:纹碎金光,刀下留人一线

【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

夺纹掠势:剥了它的怒,披在我身上

【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

反纹镜咒:纹光一闪,它的火原路奉还

【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…

2026-10-01 20:32 996 技术组