战斗日志全量滚动,烈火剑法暴击、治疗、拾取一场下来上千条,列表越长滑动越卡。改造分两件事:内存里只留最近 220 条的环形缓冲,界面用 ListView 按四档颜色分级展示,滑动帧率稳定在满帧。分级的意义在可读性:重要信息一眼可辨,普攻噪音一眼略过,日志从流水账变成战术面板。缓冲只存字符串与色值,单场战斗内存占用稳定在两兆以内,不再随战斗时长线性膨胀。改造只动展示层,日志的产生与上报链路一行不改,回归范围可控。
ListView 承载日志,每条用 RichText 拼装,伤害数值与技能名分色。追加只建一条新控件,缓冲超过 220 条时一次性裁掉头部 20 条并重建,均摊成本可控。
local logList = GUI:ListView_Create(panel, "BattleLog", 20, 80, 400, 300, 1)
local buf = {}
local function addItem(e)
GUI:RichText_Create(logList, "", 0, 0, e.s, 380, 14, e.c, 2, nil, "")
end
local function appendLog(str, color)
local e = { s = str, c = color }
table.insert(buf, e)
addItem(e)
if #buf > 220 then
for i = 1, 20 do table.remove(buf, 1) end
GUI:ListView_removeAllItems(logList)
for _, x in ipairs(buf) do addItem(x) end
end
end
普攻灰、技能白、烈火剑法暴击金、拾取绿四档,金色条目字号加大一号,裁决之杖掉落这类珍贵条目在战斗结束时随结算面板常驻展示。
local COLOR = {
hit = { r = 160, g = 160, b = 160 },
skill = { r = 255, g = 255, b = 255 },
crit = { r = 255, g = 215, b = 0 },
pick = { r = 120, g = 220, b = 120 },
}
function onBattleEnd()
GUI:ListView_removeAllItems(logList)
buf = {}
end
模拟一场 1500 条日志的战斗,滑动帧率对比改造前后的差距;四档颜色逐条核对;裁剪触发时核对头部删除条数与缓冲长度一致。监控列表子控件数量,超过 240 说明裁剪失效。真机长战斗跑满 30 分钟,缓冲稳定在 220 条上下,内存无阶梯上涨。
每条日志追加都全量重建列表的版本测过,追加一次重建 200 条,CPU 直接打满,改成追加建一条、每 20 条批量裁剪一次才稳。RichText 宽度按短技能名给的,烈火剑法加伤害数字一折行,行距全乱,宽度按最宽条目留两成余量。灰色档在暗色界面里看不清,灰度提了两档才达到可读标准。战斗结束只清了列表忘了清 buf 表,下一场开局先冒出上一场的尾巴,onBattleEnd 里两个清空动作必须成对。四档颜色色值曾散落在代码各处,改一次要全文搜索,收进 COLOR 表后策划可以自行调色。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 盟重矿洞挖出的黑曜石除了堆仓库没有去向,矿工玩法缺一条消耗链。黑市商人每 4 小时换一批限时货架,6 个…
实战应用:用在哪里 盟重码头到沙巴克水路要 20 分钟,商船运货收益高但会被半兽海盗打劫,单人押船九死一生。码头护航做成对抗…
实战应用:用在哪里 拍卖行竞拍高峰,一件屠龙刀 1 秒能产生 60 条竞价事件,逐条 sendluamsg 下发,竞拍面板每…
实战应用:用在哪里 金盒转盘 8 格奖池,普通奖越来越疲,大奖既要概率递增又不能失控。动态权重轮盘:每抽一次普通奖权重缩减 …
实战应用:用在哪里 周年庆礼包开领 30 分钟,3000 名玩家多领了一份礼盒,回收与舆情处理耗掉两天。事故根因简单得刺眼:…
实战应用:用在哪里 一次回档让玩家的裁决之杖从强化 7 退回 5,口头承诺补偿却没有账可查。强化流水把每次强化的时间、道具、…