Lua剧情场景 - coroutine.resume导致帧率下降(或者我做错了)
2013-8-26 15:8:49
收藏:0
阅读:81
评论:1
我尝试使用 Lua 中的协程来实现剪辑场景,但是出现了 massive fps drop 的问题。
我真的不知道为什么,但是 coroutine.resume 会使我的程序减速,从 5000 fps(完全不进行任何渲染)降到在 event coroutine 不死亡的情况下(例如不断地进行 resume)的 300-350 fps。当 event 变得死亡时,fps 返回正常。
我认为协程不能如此缓慢,这可能是由于我的 event.lua/eventManager.lua 代码中存在问题,或者我的测量 fps 的方式不正确,或者我做的一切都非常糟糕。
Event.lua
function event()
print("Event started")
-- 最简单的形式
for i = 1,1000 do
coroutine.yield()
end
--[[ 等待 5 秒钟
local wait = 0.0
print("Waiting 5 sec")
while wait < 5.0 do
wait = wait + coroutine.yield()
end
--]]
--[[ 然后播放声音
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() -- 以某种方式获得 frameDelta
EventsManager.update(frameDelta)-- 关掉它 fps 就会好
--渲染场景
FPS.render(frameDelta)
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我尝试了你的代码,只有
getFrameDelta返回前一次和当前调用之间的时间差,而没有任何情景需要渲染。另外,我将等待时间更改为 10 秒。local prevtime = os.clock() local getFrameDelta = function() local curtime = os.clock() local framedelta = curtime - prevtime prevtime = curtime return framedelta end这是我的输出:
所以,是的,协同程序确实会产生影响。每次协同程序
yield,它都必须记录函数离开的位置,以便在下一次调用时在该点上resume。我认为这解释了我所看到的差距:800Kfps v 1200Kfps。话虽如此,我不明白为什么你需要用协同程序来计算 FPS。你已经有了在
FPS.render中计算 FPS 的代码。只需在渲染场景后调用它即可,就像你现在所做的那样,只是跳过调用协同程序的事件管理器部分。