用Lua的协程实现类似Unity协程的语句块
2024-09-01 02:55:33
local co_time_tbl = {}
setmetatable(co_time_tbl, { __len = function(o)
local count =
for k, v in pairs(o) do
count = count +
end
return count
end
}) local function isWindows()
return package.config:sub(, ) == "\\"
end local function sleep(n)
if isWindows() then
if n > then
os.execute("ping -n " .. tonumber(n + ) .. " localhost > NUL")
end
else
os.execute("sleep " .. tonumber(n))
end
end local function Update(deltaTime)
-- main loop
end local function updateCoroutine()
local iTime = os.time()
for kco, vTime in pairs(co_time_tbl) do
if iTime >= vTime then
if coroutine.status(kco) == "suspended" or coroutine.status(kco) == "normal" then
coroutine.resume(kco)
elseif coroutine.status(kco) == "dead" then
co_time_tbl[kco] = nil
end
end
end
end function coroutine.waitforSeconds(second)
assert(type(second) == "number" or second <= )
local iEndTime = os.time() + second
local co = coroutine.running()
if co then
co_time_tbl[co] = iEndTime
return coroutine.yield()
end
end local function main()
local co1 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 5 seconds")
end)
local co2 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 4 seconds")
end)
local co3 = coroutine.wrap(function()
coroutine.waitforSeconds()
print("after 3 seconds")
end)
local count =
local co4 = coroutine.wrap(function()
while (true) do
coroutine.waitforSeconds()
count = count +
print("coroutine num: " .. #co_time_tbl .. " | second count:" .. count)
end
end)
co1()
co2()
co3()
co4()
while true do
sleep(0.033)
Update()
updateCoroutine()
end
end main()
思路其实就是用一张表维护协程要等待的时间,在主循环之后更新计时器,根据时间将挂起的协程唤醒就行
最新文章
- Web API系列
- Discuz 7.2 /faq.php SQL注入漏洞
- HDU 1011-Starship Troopers(树形背包)
- Javascript进阶篇——(DOM—节点---属性、访问节点)—笔记整理
- zongjie
- 关于用模拟器运行百度地图API无法定位的问题 - 不能用模拟器
- Tomcat与Nginx服务器的配合使用及各自的区别
- 指定时间生成cron表达式
- MySQL索引优化看这篇文章就够了!
- JavaScript 运行机制详解
- 国内常用NTP服务器地址及
- 约束布局 ConstraintLayout
- 配置go语言编辑环境 - goland
- USB Mass Storage大容量存储 The Thirteen Class章节的理解
- 学习react教程
- 第六节 Go数据结构之集合
- 使用MATLAB设计FIR滤波器
- ATL7窗口类详细剖析
- 分布式缓存系统 Memcached 数据存储slab与hashtable
- 【洛谷P2426】删数