Lua cut-scene - coroutine.resume导致fps下降(或者我做错了)

时间:2013-08-26 11:09:26

标签: lua

我尝试使用协同程序来使用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

1 个答案:

答案 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的事件管理器部分即可。