2018年7月12日星期四

Other - Asynchronous "Async"



Asynchronous 同步


什么是 Async? 我相信很多人都看到可是不懂他什么意思. 有的人说 Async 和 Sync 应该是一样的东西吧?某些方面上是一样 但 某方面上又不一样.

有些老外用简单的一句解释 "Async" : "Run off main thread" / "跑在主线程之外". 也就是所谓的多线程 让多个 Task 在一次 Run 完 且不影响 主线程的情况下,这个东西对 主线程Concept 的游戏来说 是很大的帮助 也就是 Minecraft.

举个例子:
Minecraft 我的世界 Server 在 生成世界的时候 全部玩家都会卡着不能动 可是能聊天 Chat 还能收到与发送讯息 这是因为多线程的关系。

主线程 - Server 在 生成世界中 ... ,玩家们正在游玩
聊天Thread - Chat 在 主线程外 玩家的讯息 发送与接受都能收到
当然一个时候只能做一个事情,伺服生成世界的时候 玩家是无法移动或者破坏方块之类的。
 通过这个 "Async" 就能达成 不影响游戏进程的情况下 做其他东西的处理,比如 生成世界,获取网页资料 / Request data from backend, 或者 也可以是 处理 database 的 资料进出.

这边我也分享两个好资料

  1. FastAsyncWorldEdit - https://github.com/boy0001/FastAsyncWorldedit
  2. 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 也给出例子 也给出很好的解释 大家能看看

0 comments :

发表评论