游戏人物 是一系列关于 Web 游戏开发的访谈。在第一期中,我们采访了 Johan Dahlberg,他创作了 HTML5 太空射击游戏 WPilot。
关于 Johan Dahlberg
Johan 目前居住在瑞典斯德哥尔摩,并在 10 岁时开始学习编程(使用 QuickBasic)。他曾在 North Kingdom 担任业务开发人员两年,然后在两年前创办了 Hydna。他还创作了 HTML5 游戏 WPilot,它真正展示了 Web 上多人游戏的强大功能。
是什么促使你决定开发 WPilot?
我有很多朋友在使用 Adobe Flash 开发游戏。我非常喜欢开放标准和开放 Web,因此我想向他们和社区展示仅使用 Web 浏览器可以实现的功能。我之前没有见过仅使用 JavaScript 和 HTML 构建的实时动作游戏,但我知道这是可能的。所以,WPilot 就是这样诞生的。一个无需插件即可在浏览器中运行的高帧率多人游戏。
在开发 WPilot 之前,你是否做过游戏开发?
是的,我之前也参与过一些项目,但都没有完成。我 20 年前就开始用 QBasic 编程,主要原因就是游戏。六七年前,我也用 C# 做过一些游戏编程。
WPilot 是我第一个浏览器游戏,也是我唯一完成的游戏项目!
你是如何确保 WPilot 项目能够完成的?你是否有计划,还是边做边想?
嗯,我一开始并没有打算做一个完整的游戏。目标只是展示网络功能。基本上,我想展示两艘飞船在两个不同的屏幕上飞行,使用 WebSockets 传输位置信息。但我觉得这是一个很有趣的项目,所以它随着时间推移不断发展。
我每次只添加几个功能。然后,大约一个月后,我决定设置几个里程碑。我想实现很多功能,但我了解自己的局限性。如果清单上列出的内容太多,就很难完成任务。所以,今天的 WPilot 就像我最初想法的 0.5 版本。
所以,我理解你一开始并没有将游戏代码设想成现在的样子——代码库随着时间的推移逐渐演变和完善,而不是严格按照计划进行的?
是的,没错。我想我已经重写了游戏逻辑和网络功能四五次了。我在网络性能方面遇到了一些问题,因此我不得不不断重新思考我的做法。旧版 WebSocket 标准的问题是,你必须使用 UTF8 而不是二进制(两个控制字符 0x0 和 0xff 非常麻烦)。我尝试聪明地编码数据包,但没有找到最佳解决方案。最终我使用了 JSON。它不是最理想的,但它有效。
我过一会儿想谈谈网络方面,但既然你提到了问题,除了网络之外,你在创建游戏过程中还遇到了哪些最棘手的问题?
第二个最棘手的部分是插值。在网络游戏中,你始终在玩过去的画面;服务器始终领先于你。我花了很多时间来尽可能地使游戏体验流畅。我使用的算法试图猜测飞船的运动方向。我认为现在效果还不错,但一开始真的很难掌握。
从源代码来看,你的网络逻辑似乎非常扎实;消息优先级、单数据包消息、插值等等。这些是你边做边学到的,还是你之前就有过关于如何使网络体验良好的经验?
十年前,我开始用 C# 开发一个用于游戏的网络协议。我没有完成该库,但这个项目让我学到了很多关于游戏网络、延迟、插值等方面的知识。
《雷神之锤》也是一个很好的灵感来源。该协议现在是开放的,我从中借鉴了很多设计决策。我查看的大多数示例都是针对使用 UDP 和 C 语言的高帧率多人游戏设计的。JavaScript 有一些限制,因此我不得不重新思考一些逻辑。
从你的游戏网络经验中,你学到了哪些关键技巧和经验教训,其他游戏开发者在开始开发之前应该了解这些内容,以免被吓到?
我的最佳建议是:保持简单,一旦掌握了基础知识,它就不难了。关键是查看其他项目。我认为这教会了我今天所知道的一切。不幸的是,我无法提供更具体的技巧,这都是综合知识。
我的协议版本 1 过于复杂和高级。例如,我在每个游戏周期都发送子弹位置。这当然是一个很大的错误。子弹永远不会改变方向,因此我只需发送一次,让客户端进行计算即可。
如果你今天重写这个游戏,你会怎么做得不同?
哦,这是一个很难回答的问题!我肯定应该保持更简单。今天的代码是多次重写后的结果。我尝试过早地解决未来可能出现或可能不会出现的问题。这种方法使项目比必要复杂得多。我计划将游戏移植到我们的新平台 (Hydna),主要目标是减少代码量。
在游戏完全功能完善并且你知道它需要做什么的情况下,重写它是否有帮助?与在开发过程中重写游戏时相比,游戏功能仍在不断发展和变化。
是的,今天会容易得多,更直接,思考更少,实验更少。如果你第一次编写某些内容,那么一开始很难将所有内容都弄清楚。我发现创建小型实验项目很有用,这样我可以在将其应用于“真实”项目之前测试某个概念。
是否有计划更新游戏以支持 WebSockets 的最新改进?
是的,有一个计划,当然,这个计划是将其移植到 Hydna 的基础设施上!Hydna 解决了我在处理 WPilot 中服务器逻辑时遇到的许多问题和挑战。Hydna 将完全消除对服务器的需求。玩家只需访问网站并在本地机器上创建游戏即可。
这是个好消息,Hydna 听起来很棒!你能详细介绍一下它的工作原理以及如何帮助游戏开发者吗?
Hydna 是一种所谓的“托管平台”。目标是以尽可能快的速度将消息从 A 点发送到 B 点,并且无需考虑扩展性等问题。例如,如果你是游戏开发者,则无需担心如何设置 Linux 服务器、使用哪种服务器语言以及如果游戏变得流行会发生什么等问题。你只需要专注于游戏本身(JavaScript 和 HTML),我们负责其余的工作。
Hydna 不会消除延迟和插值等问题,但我们会在这里向社区提供很多技巧。我们目前正在撰写一些文章,解释网络游戏的基本概念以及如何使用 Hydna 解决这些问题。Hydna 非常易于上手。界面与 WebSocket 类非常相似,但在幕后实现了一些真正的“魔法”。
我真的很喜欢可以在客户端运行“服务器”的概念,Hydna 为你解决了这个问题。你的 Web 浏览器同时充当服务器和客户端,无需任何服务器端脚本。
人们现在可以使用 Hydna 吗?
是的,它已上线运行,地址是 Hydna.com。
我们的梦想是尽可能地帮助开发者(游戏和 Web 开发者)。我们在这个行业工作了很多年,我真的认为我们积累的知识可以帮助其他人解决日常问题。Hydna 真正消除了构建实时应用程序时通常会遇到的很多麻烦。这是一个为期两年的项目,我们付出了很多汗水和泪水。但我们对最终结果非常满意,我们真的希望/相信其他人也会发现它有用。
感谢 Johan!
请关注下一期的内容。
关于 Robin Hawkes
Robin 热衷于通过代码解决问题。他是一位数字爱好者,Pusher 的开发者关系负责人,前 Mozilla 布道师,书籍作者,以及一位英国人。