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