Lua剪切场景-coroutine.resume导致fps下降(或者我做错了)

Lua剪切场景-coroutine.resume导致fps下降(或者我做错了),lua,Lua,我尝试使用协程来实现使用Lua的剪切场景,除了大量的fps下降外,这没有任何问题 我真的不知道为什么,但是coroutine.resume会将我的程序从5000 fps(完全没有渲染)降到300-350 fps,而event coutroutine并没有死机(例如不断恢复)。然后事件变为死亡,fps恢复正常 我觉得我的event.lua/eventManager.lua代码有问题,或者我测量fps的方法不对,或者我做的每件事都非常糟糕 Event.lua function event()

我尝试使用协程来实现使用Lua的剪切场景,除了大量的fps下降外,这没有任何问题

我真的不知道为什么,但是coroutine.resume会将我的程序从5000 fps(完全没有渲染)降到300-350 fps,而event coutroutine并没有死机(例如不断恢复)。然后事件变为死亡,fps恢复正常

我觉得我的event.lua/eventManager.lua代码有问题,或者我测量fps的方法不对,或者我做的每件事都非常糟糕

Event.lua

function event()
    print("Event started")
    --simply as it can be
    for i = 1,1000 do
        coroutine.yield()
    end
    --[[ wait
    local wait = 0.0
    print("Waiting 5 sec")
    while wait < 5.0 do
        wait = wait + coroutine.yield()
    end
    --]]
    --[[ then play sound
    local alarmSound = SoundsManager.getSound("sounds/alarm.ogg")
    alarmSound:play()
    while alarmSound:isPlaying() do
          coroutine.yield()
    end
    --]]
    print("Event ended")
end
EventsManager.lua

require "event"
local EventsManager = {}

function EventsManager.init()
   EventsManager.event = coroutine.create(event) 
end

function EventsManager.update(frameDelta)
    if coroutine.status(EventsManager.event) ~= 'dead' then
       coroutine.resume(EventsManager.event, frameDelta)
    end
end

return EventsManager
梅因·卢阿

EventsManager = require "EventsManager"
FPS = require "FPS"

EventsManager.init()

while true do
local frameDelta = getFrameDelta() --getting frameDelta somehow
EventsManager.update(frameDelta)-- comment this and fps will be ok
--render scene 
FPS.render(frameDelta)
end

我尝试了你的代码,只有
getFrameDelta
只返回上一次调用和当前调用之间的时间间隔,没有任何场景要渲染。我还将等待时间改为10秒

local prevtime = os.clock()

local getFrameDelta = function()
    local curtime = os.clock()
    local framedelta = curtime - prevtime   
    prevtime = curtime
    return framedelta
end
以下是我的输出:

D:\Dev>lua5.1 LUAFPS.lua
事件已开始等待。。十,

[FPS]879171 [FPS]882366[FPS]880471[FPS]882018[FPS]880513[FPS]881368[FPS] 879623[FPS]881938[FPS]880498

活动结束

[FPS]882053[FPS] 1279909[FPS]1279631[FPS]1279899[FPS]1277089[FPS]1278399[FPS] 1279005[FPS]1280125

所以,是的,共同例行程序确实要付出代价。每次协同例程
产生
时,它都必须保留该函数停止位置的标签,以便下次调用该函数时,它可以在该点上恢复。我假设这可以解释我看到的差异:
800Kfps vs 1200Kfps


也就是说,我不明白为什么计算FPS需要
co例程。在
FPS.render
中,您已经有了计算FPS的代码。只要在渲染场景后调用它就足够了,就像您现在所做的那样,只需跳过调用
co例程的事件管理器部分

我尝试了你的代码,只有
getFrameDelta
只返回上一次调用和当前调用之间的时间间隔,没有任何场景要渲染。我还将等待时间改为10秒

local prevtime = os.clock()

local getFrameDelta = function()
    local curtime = os.clock()
    local framedelta = curtime - prevtime   
    prevtime = curtime
    return framedelta
end
以下是我的输出:

D:\Dev>lua5.1 LUAFPS.lua
事件已开始等待。。十,

[FPS]879171 [FPS]882366[FPS]880471[FPS]882018[FPS]880513[FPS]881368[FPS] 879623[FPS]881938[FPS]880498

活动结束

[FPS]882053[FPS] 1279909[FPS]1279631[FPS]1279899[FPS]1277089[FPS]1278399[FPS] 1279005[FPS]1280125

所以,是的,共同例行程序确实要付出代价。每次协同例程
产生
时,它都必须保留该函数停止位置的标签,以便下次调用该函数时,它可以在该点上恢复。我假设这可以解释我看到的差异:
800Kfps vs 1200Kfps


也就是说,我不明白为什么计算FPS需要
co例程。在
FPS.render
中,您已经有了计算FPS的代码。只要在渲染场景后调用它就足够了,就像您现在所做的那样,只需跳过调用
co例程的事件管理器部分

也许,闭包而不是协同程序可以帮助您保持速度。i、 也许吧,但我仍然不明白为什么空屈服会对性能产生如此大的影响,即使我每帧都调用resume。我想,一个好地方应该是
ldo.c(554):LUA\u API int LUA\u yieldk
。我的猜测是,让步并不是微不足道的,因为协同程序应该为恢复做好安全的准备。只是猜测。也许,闭包而不是协同程序可以帮助您保持速度。i、 也许吧,但我仍然不明白为什么空屈服会对性能产生如此大的影响,即使我每帧都调用resume。我想,一个好地方应该是
ldo.c(554):LUA\u API int LUA\u yieldk
。我的猜测是,让步并不是微不足道的,因为协同程序应该为恢复做好安全的准备。只是猜测而已。谢谢你的测试。我不使用联合例程来计算FPS,我的意思是使用联合例程对我的FPS影响很大。有趣的是,即使我通过绘制更多的对象来降低基本FPS,当事件处于活动状态时FPS保持在300-350,我想还是这样吧。谢谢你们的基准测试。我不使用联合例程来计算FPS,我的意思是使用联合例程对我的FPS影响很大。有趣的是,即使我通过绘制更多对象来降低基本FPS,当事件处于活动状态时FPS保持在300-350,我想还是这样吧。