如何优化周五夜放克Psych Engine中的Lua黑屏事件?
优化FNF「Lights Down」黑屏事件的卡顿问题
问题背景
我制作了一个复刻《VS Impostor V4》中「Lights Down」桥段的黑屏事件,核心代码如下:
--- --- @param eventName string --- @param value1 string --- @param value2 string --- function onEvent(eventName, value1, value2) if eventName == 'lights-out' then makeLuaSprite("blackout", "", -1000, -700.0); makeGraphic("blackout", 5500, 7500, "000000"); addLuaSprite("blackout", false); triggerEvent("Change Character", "Dad", "itsoutchy lights down"); triggerEvent("Change Character", "BF", "whitebf"); end end
触发事件时会出现几帧卡顿,推测是Lua精灵的创建方式导致。尝试缩小精灵尺寸但当前尺寸是必需的,提前在歌曲开始时创建精灵也未能解决卡顿问题,寻求优化方案。
优化方案
1. 预创建精灵并复用,避免事件触发时的资源生成
事件触发时调用makeGraphic会实时生成大尺寸图形,这是卡顿的核心原因。改为在歌曲启动时预创建精灵并隐藏,触发事件时仅切换可见性:
-- 标记精灵是否已创建 local isBlackoutReady = false function onSongStart() -- 预创建黑屏精灵 makeLuaSprite("blackout", "", -1000, -700.0); makeGraphic("blackout", 5500, 7500, "000000"); addLuaSprite("blackout", false); -- 初始隐藏精灵,调整层级确保在最上层 setObjectVisible("blackout", false); setObjectOrder("blackout", 9999); isBlackoutReady = true end function onEvent(eventName, value1, value2) if eventName == 'lights-out' and isBlackoutReady then -- 直接显示预创建的精灵 setObjectVisible("blackout", true); -- 替换triggerEvent为更高效的setCharacter setCharacter("Dad", "itsoutchy lights down"); setCharacter("BF", "whitebf"); end end
2. 用静态图片替代实时生成的图形
makeGraphic会在运行时动态生成位图,对性能影响较大。可以提前制作一张足够大的黑色PNG图片(尺寸匹配需求),用makeLuaSprite直接加载本地资源:
function onSongStart() -- 加载提前制作的黑色图片(假设图片路径为assets/images/blackout.png) makeLuaSprite("blackout", "blackout", -1000, -700.0); -- 按需缩放(如果图片尺寸不够) scaleObject("blackout", 5.5, 7.5); addLuaSprite("blackout", false); setObjectVisible("blackout", false); setObjectOrder("blackout", 9999); end function onEvent(eventName, value1, value2) if eventName == 'lights-out' then setObjectVisible("blackout", true); setCharacter("Dad", "itsoutchy lights down"); setCharacter("BF", "whitebf"); end end
3. 优化角色切换的调用方式
原代码使用triggerEvent触发角色切换,这种间接调用会增加额外的性能开销。直接使用setCharacter函数切换角色,能减少事件调度的延迟:
-- 替换原代码中的triggerEvent setCharacter("Dad", "itsoutchy lights down"); setCharacter("BF", "whitebf");
优化原理
- 预创建精灵将资源加载和图形生成的开销转移到歌曲启动阶段,避免事件触发时的瞬时性能波动;
- 静态图片替代动态生成图形,减少CPU实时计算的负载;
- 直接调用角色切换函数,减少事件系统的中间调度步骤,提升响应速度。
内容的提问来源于stack exchange,提问作者itsoutchy
相关产品推荐
相关产品推荐

