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 也给出例子 也给出很好的解释 大家能看看

Other - Random 随机数值



No automatic alt text available.

Random ( Pseudo Random Distribution [ PRD ] )

P ( N ) = C * N 
N = 次数
C = 固定的数值 有算法的
在指定N 次数后 P(N) > 1 也就是100%了
100 * C = Approximate C (这个 value for every time increment 的 机率 )

etc 10% 他每次就会增加1.5% 在机率
第一次就 1.5%
第二次就 3%
第三次就 4.5%
第67次 就肯定是 > 100% 了

这个东西我觉得会比原本的 new Random().nextInt(100) 的 机率来的好 在 伺服主 与 玩家之间 。伺服主 如果推出付费的配套或者抽奖物品 会获得一定次数的赞助币 后 玩家才会获得 稀有物品 算是某些经济上的平衡(?)。

在有些技能上 这个也能做出平衡 打击下就 触发一下 不会到 第一下 100% 或者 打几千下 不会出一下的问题