网站建设哪便宜,群晖 wordpress 设置,做一网站要什么,网站集约化建设情况的汇报问题#xff1a;发现Lua协程执行到一半#xff0c;突然被掐断了一样等到了设定的时间没有正常执行协程后续代码#xff01;非必现bug#xff0c;若发生大概率在高频率使用协程时易触发。
LuaFramework或xLua uLua都自带有协程coroutine#xff0c;而且基本都使用对象池缓…问题发现Lua协程执行到一半突然被掐断了一样等到了设定的时间没有正常执行协程后续代码非必现bug若发生大概率在高频率使用协程时易触发。
LuaFramework或xLua uLua都自带有协程coroutine而且基本都使用对象池缓存协程对象当我们稍微不小心就会引起对象池的问题也就是持有一个已入池的对象。
1、所有持有写法必须要在使用完协程时手动置空持有对象。
self.co coroutine.start(function()coroutine.waitxxxself.co nil... ...
end)
2、究极神坑究极神坑究极神坑重要的事情说三遍 当你想持有协程对象时一定要保证协程执行过至少1次延迟无论是延迟1帧还是多少秒例如下面出问题的代码
local cnt param --外部传入param参数
local co
co coroutine.start(function()for i 1, cnt docoroutine.waitxxx... ...end
... ...table.removebyvalue(coTable, co)
end)
table.insert(coTable, co)
不要在意细节,param一定是整数,但可能为0问题就出在cnt被赋予了一个0导致for循环没有执行过1次从而导致协程没有进行过1次延迟waitxxx所以协程函数体会立即执行完成关键点是table.removebyvalue(coTable, co)先于table.insert(coTable, co)执行而table.insert(coTable, co)后执行就加入了1个已回收入对象池的对象。持有已入池对象行为后面发生什么就是你会发现有些协程好像无法正常执行完成明明上一个还在正常输出下一个就突然消失了也就是存在这种持有已入池对象行为要把这种行为全部抹除才能恢复正常或者直接干脆不用对象池了可能性能开销会上升点不然就得排查全部相关的持有代码将上面代码加一行延迟1帧或延迟渲染结束就能解决问题保证至少执行过1次延迟
local cnt param --外部传入param参数
local co
co coroutine.start(function()coroutine.waitforendofframe()--延迟渲染结束帧for i 1, cnt docoroutine.waitxxx... ...end
... ...table.removebyvalue(coTable, co)
end)
table.insert(coTable, co)
我试过在remove后直接将conilinsert时检查co~nil再进行还是会有异常情况。 如果Lua协程本身是没有对象池缓存机制的那就不会存在我说的问题。
实际上这个问题就是对象池的坑只是演变到了协程这里让人很抓狂