Other - Asynchronous "Async"
Asynchronous 同步
有些老外用简单的一句解释 "Async" : "Run off main thread" / "跑在主线程之外". 也就是所谓的多线程 让多个 Task 在一次 Run 完 且不影响 主线程的情况下,这个东西对 主线程Concept 的游戏来说 是很大的帮助 也就是 Minecraft.
举个例子:
Minecraft 我的世界 Server 在 生成世界的时候 全部玩家都会卡着不能动 可是能聊天 Chat 还能收到与发送讯息 这是因为多线程的关系。
主线程 - Server 在 生成世界中 ... ,玩家们正在游玩当然一个时候只能做一个事情,伺服生成世界的时候 玩家是无法移动或者破坏方块之类的。
聊天Thread - Chat 在 主线程外 玩家的讯息 发送与接受都能收到
通过这个 "Async" 就能达成 不影响游戏进程的情况下 做其他东西的处理,比如 生成世界,获取网页资料 / Request data from backend, 或者 也可以是 处理 database 的 资料进出.
这边我也分享两个好资料
- FastAsyncWorldEdit - https://github.com/boy0001/FastAsyncWorldedit
- TaskChain - https://github.com/aikar/TaskChain
FastAsyncWorldEdit
简称 "FAWE" 大家都懂吧 这个插件 在 minecraft 能在让服务器不卡的情况下 处理 worldedit 的 process,当然他也做了 额外的一些 wrapper for asynchronous process,例如 AsyncWorld 来处理 创建世界 与 关闭世界。
TaskChain
这个应该没很多人懂但这个很有用. 喜欢lambda的人也推荐使用 ( Java 8 ).
简单来说个例子 :
Database 读取 / Querying 需要时间 因 Minecraft 是个 主线程concept 的游戏 那些会耽误到玩家的 游玩进度 随时卡顿 所以 最好把 这些都丢去 多线程处理 让游戏顺畅进行 也不会破坏玩家的游戏体验
Example of TaskChain :
TaskChainFactory tcf;
tcf.newChain()
.asyncFirst( // 处理资料的进入 )
.abortIfNull( // 资料获取失败 可以加入ErrorHandler)
.sync( // 处理 游戏的进程 ) [ Bukkit 的东西需要在主线程 很正常 ]
.execute()
就这样处理一个过程。这个作者也有推荐 为什么要使用 TaskChain 也给出例子 也给出很好的解释 大家能看看
