我尝试使用协同程序来使用Lua实现剪切场景,除了大量的fps掉落之外没有任何问题。
我真的不知道为什么,但是coroutine.resume将我的程序从5000 fps(完全没有任何渲染)减慢到300-350 fps而事件couroutine没有死(例如不断恢复)。然后事件变成死了fps恢复正常。
我认为couroutines不能这么慢,我的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
FPS.lua
local FPS =
{
fps = 0,
lastFPS = 0,
framesTime = 0.0
}
function FPS.render(frameDelta)
FPS.fps = FPS.fps + 1
FPS.framesTime = FPS.framesTime + frameDelta
if FPS.framesTime >= 1.0 then
if FPS.fps ~= FPS.lastFPS then
print("[FPS] ".. FPS.fps)
FPS.lastFPS = FPS.fps
end
FPS.framesTime = 0.0
FPS.fps = 0
end
end
return FPS
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
Main.lua
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
答案 0 :(得分:1)
我尝试了你的代码,只有getFrameDelta
只返回前一个和当前调用之间的时间间隔,而没有任何要渲染的场景。我还把等待时间改为10秒。
local prevtime = os.clock()
local getFrameDelta = function()
local curtime = os.clock()
local framedelta = curtime - prevtime
prevtime = curtime
return framedelta
end
这是我的输出:
D:\ Dev&gt; lua5.1 LUAFPS.lua
活动开始等待...... 10[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
所以,是的,合作惯例确实会造成损失。每次协同例程yields
必须保留功能停止的位置,因此下次调用它时可以resume
。我认为这说明了我看到的差异:800Kfps v 1200Kfps
。
那就是说,我不明白为什么你需要co-routines
来计算FPS。您已经拥有了在FPS.render
中计算FPS的代码。只需在渲染场景后调用它就足够了,就像现在一样,只需跳过调用co-routine
的事件管理器部分即可。