You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化周五夜放克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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:55:26