Go 自诞生以来,因其简单高效的处理效率和对于并发的出色支持,获得开发人员的关注和实践。并在 2013 年随着重磅项目 Docker 的诞生和发展,逐步在云计算领域造成燎原之势。在占领了云计算后,Go 的下一个发力点将会在何方?前端
在 ECUG Con 十周年盛会上,七牛云 CEO、Go 首席布道师许式伟给出了他心中的答案:游戏行业。jquery
如下是对他这次演讲的内容记录git
做为一个技术型 CEO,我认为技术人员都是很纯粹的,以数据为导向,理性判断趋势,因此今天我会站在理性角度分析,来聊聊将来 Go 的趋势,重点是在游戏行业。程序员
图1github
由图 1 咱们能够看出 Go 在 Mobile 的发展时间轴,从 12 年初开始,实际上最开始它的关注度并不高,直到 14 年中旬其活跃程度才有显著的增长。web
编程
图 2后端
图 2 则显示,尽管 Go 官方对 Mobile 的支持力度大于 Web,可是 gopher 们对 Web 前端的支持度远远高出 Mobile。Gopherjs 在社区的活跃度从 13 年 8 月开始一直很高,从图中咱们能够看出,Gopher 们也有着和 JavaScript 程序员们共同的梦想,使用一种语言统一先后端。websocket
经过上面两张图的对比,得出一个很重要的结论,就是 Go 在桌面侧的发展,即便用 Go 语言来写桌面程序,固然目前也有不少人在尝试,包含两个流派:通用 UI 和垂直行业(游戏行业)。Go 团队官方给出的回答更加侧重后者,关注垂直行业——游戏产业。并发
为何会是游戏行业呢?能够从如下两点来看一下可行性:
接下来探讨一下使用 Go 写游戏的可行性,对于 GUI 来讲,基础支撑是 OpenGL,它自己支持 PC(Windows/Mac/Linux/FreeBSD),Mobile (Android/iOS)以及Web (基于WebGL)。对于游戏来讲,分如下几点:PC 端游戏(PC)、页游(Web)、手游(Mobile),这三项使用 Go也是能够进行开发的:PC端能够经过 OpenGL,手游经过Go Mobile,页游经过GopherJS(将Go 的代码编译成 JavaScript)Go 页游是很是成熟的,使用的技术栈也是相对较少的,只须要使用 WebGL 和 GopherJS,还能够调用JavaScript框架,诸如
WebGL (https://github.com/gopherjs/webgl)、 jQuery (https://github.com/gopherjs/jquery)、 Websocket (https://github.com/gopherjs/websocket)
整体来讲,Go 对 Web 的支持算得上是很是成熟的,它的应用面也不局限于页游,如图 3 所示是一个仿 React 的一个项目「vecty」,是使用 Go 进行开发的,由图咱们能够看出这个项目是在 15 年启动的,活跃度也比较可观。

图 3
使用 Go 去作全平台游戏支持相对于 Web 而言,所能用到东西相对会收敛不少,相似 Javascript 的不少库就不能再用。
此时我选择的技术方案为:使用 Go 作跨平台的 Scratch。
首先讲一下什么是 Scratch,它是一门面向儿童编程教学的语言,能够教儿童编写游戏,目前其排名已经挤进工程类语言排名的前 20。为何要使用 Go 来重写 Scratch 呢? 一是出于我对其的热爱,其次是 Scratch 目前仍旧存在一些瑕疵,我但愿能够去慢慢完善。
2.X 版本(https://github.com/LLK/scratch-flash)只能基于 Flash 编写而且只能跑在 PC 上,而基于 Google Blockly + React 编写的 3.0 版本(https://github.com/LLK/scratch-gui)虽然已经可用,可是兼容方面仍然存在问题,好比与 2.X 不少地方不兼容,可是2.X的用户群体是很庞大的。所以 Scratch 还存在不少进步空间,是很是值得期待的。
正是因为 Scratch 的不足,让我看到了挑战。我为本身定了一个目标,作一个兼容 Scratch 2.X 的跨 PC、移动、Web 多终端平台的 Scratch 脚本执行器。下面是我所面临的多种挑战:
1.脚本支持—Json 脚本
Scratch2.X 是 Json 脚本,从 parser 角度来看难度不大,可是从 executor 角度来看其难度与使用其余的脚本的难度是一致的。其次,其脚本是单线程伪并行的,因为不一样的 Scratch 脚本之间可能会共享变量而且 Scratch 并无 mutex 语法,因此真的并行会致使系统逻辑错乱。在Go 当中模拟一个单线程伪并行的程序相对而言仍是比较复杂的,因此这是我面临的第一个挑战。
2.多行文本排版与显示
True Type 字体的支持,小型排版系统须要考虑行禁(例如:标点不能在行首,英文单词不能分拆到两行显示)
3.音频播放
须要支持常见音频格式,而且要支持混音(能够同时播放多个声音,应当要有多我的同时说话的效果)
4.SVG 格式支持
Scratch 2.X 内建的精灵 (sprite) 都是矢量格式的,而且基于 SVG 格式,SVG 有着很是复杂的指令集,完整支持等价于写一套 GDI Canvas(当前Go 社区并没有成熟的 SVG 渲染的项目)
5.复杂图形

图 4
图 4 所示的图形,虽然看似简单,可是支持却比较难,固然,一旦有 SVG 的支持,这个只是SVG 的一条指令。
6.碰撞检测
这基本上是游戏类程序最基础的需求:两个精灵(sprite)的碰撞检测
历经半个月实际开发,同时也因为我在教我儿子学习编程时积淀的 2 年经验,让我沉淀了不少素材,如今我所写的全部 Scratch 教程基本能够正常执行,下面就是我这 2 年所积淀的一些素材举例:
1.社交类
对话:weather-conversation.sb2;包含音频播放,多行文本排版与显示,也有不少复杂的图形、背后脚本等。图 5 所示就是。

图 5
2.棋牌类
五子棋:five-chess.sb2;围棋:go-chess.sb2;国际象棋:chess.sb2,这些看起来简单,但要作到完整要包含协程(共享全局变量的处理)、复杂脚本等比较复杂的东西。图 6 所示是围棋的示意图。
图 6
3.小游戏
吃蛋糕:eat-cake.sb2;这个是我儿子写的,里面的难点在于碰撞检测,如图 7

图 7
Scratch3.0 是使用 React 作的,而我是使用 Go 去作来进行一个全新挑战。Scratch3.0 作了不少东西,花了一年多的时间,功能相对比较完善,可是对于我我的而言我仅仅作了一个执行器,难度不一样,因此最后我会对二者作一个对比,比较一下他们之间的优缺点。
1.React+React Native
优点:场景比较通用,能够基于 WebGL 也能够开发游戏; 劣势:倾向于将 Web 搬到 Native(mobile)技术栈复杂,性能相对低;React 框架对开发游戏的难度基本没有减负。
2.Go+GopherJS
优点:技术栈极简,上手容易,性能极好; 劣势:较为小众; 场景:比较垂直,对游戏有较完整的支持。
Go 的桌面侧战场刚刚开始,但技术相对而言已经比较成熟,尽管很早期,可是因为 Go 所带来的研发效率的提高,必定程度上消除了因为早期而致使的资源不足,所以,即使前端知识不足,可是通过多年发展,Go 社区的丰富资源偏偏弥补了这个不足。
建议能够适当关注,选择合适的时机进军「战场」。进军方向能够选择:其一是使用 Go 写游戏,它能够作到全平台支持;其二是使用 Go 写 Web 应用来代替 React 等框架。