1

Lua を使用してコルーチンを使用してカット シーンを実現しようとしていますが、fps が大幅に低下することを除けば問題はありません。

理由は本当にわかりませんが、coroutine.resume は、イベント couroutine が死んでいない (たとえば、常に再開する) 間、5000 fps (まったくレンダリングなし) から 300-350 fps のようにプログラムを遅くします。その後、イベントがデッド 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

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
4

1 に答える 1

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>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 を計算するコードは既にありますFPS.render。現在行っているように、シーンをレンダリングした後にそれを呼び出すだけで十分ですco-routine。.

于 2013-08-26T16:22:52.197 に答える