By William Van Winkle
Downloads
原文 Hot Shots* Warps Conventional Touch Gaming [PDF 656KB]
Apple 将触控功能引进智能手机后,开发人员迅速获得巨大的新机遇。 现在,触摸屏 PC 再次为行业提供了同样的机遇。 超极本™设备的发展可能已经激发了触摸功能的潜力,但是目前,这种趋势正在向其他笔记本电脑类型、台式机显示器和一体式(AIO)设计不断蔓延。 该领域非常开放,英特尔正在全球范围内用竞赛的方式激发开发人员的创造力,其中一些竞赛为触控技术创新提供了良好的基础。 近来,英特尔® 应用创新竞赛联合英特尔® 开发人员专区向开发人员提出了一个挑战,让他们发掘触控领域的下一个重要目标, >Adam Hill凭借其屡获殊荣的 Hot Shots* 宇宙飞船游戏引起业界广泛关注(见图 1)。
图 1: Adam Hill 在联想 Horizon* 一体机上对 Hot Shots* 主界面进行了测量。
起因、形式和功能
像许多开发人员一样,Hill 在编程方面保持了较高的职业水准,并沿承了许多传统视频游戏中的偏好,包括 Asteroids* (1979)、Micro Machines* (1991) 和 Geometry Wars* (2003)。 他是一位编写电子表格宏的管理员,并参加了软件程序员在职培训,而且一直关注娱乐方面的动态,希望有一天能够创建自己的游戏。 当英特尔在 2012 年开办第一次应用创新竞赛时,Hill 感觉自己可以大展身手。 这款名为 Celerity*的隧道游戏为 Hill 提供了许多有价值的见解。 Hill 知道自己应该将精力集中在少数几个有价值的想法上。 最重要的是,他知道自己的设计至少要吸引自己,毕竟他自己是第一位用户,如果他都感觉游戏没有趣,那么就不要提其他人了。
当英特尔应用创新竞赛于 2013 年 7 月开办时,Hill 参加了竞赛。 英特尔宣布将为参赛者提供一台基于 27 英寸触摸屏的联想 Horizon 一体机,协调者特别要求“充分发挥”该平台的作用。 Hill 决心要给他们一个惊喜。 六个月内,他在该平台上工作了数百个小时,终于开发出一款游戏,这款游戏非常像早些年的两款游戏 Asteroids和 Geometry Wars的结合体。 这款游戏融合了炫目的图形、重力效果和角逐激烈的玩家对抗合作设计(见图 2),Hill 承认这款游戏只有一个目的,那就是:热闹。
图 2: Hot Shots* 很明显更有利于基于触控的输入,但是它也能够与游戏控制器、键盘,甚至联想操纵杆输入兼容。
Hill 希望在游戏中复原以前多人游戏中面对面的感觉,而非通过互联网远程参与游戏赛。 玩家的宇宙飞船按照 Asteroids中的方式在屏幕中真实再现,迅速让玩家将疲倦抛诸脑后,集中全力向前方开火。 屏幕中的一颗行星能够对所有物体施加重力。 (此外,玩家还可以在屏幕上燃起第二颗恒星。) 这款游戏在整个游戏区的下方部署了一种金属丝网格,能够将上方因重力掉下的物体接住,为游戏营造出一种 3D 的效果,这是旧版的游乐场游戏所没有的。 这款游戏最多可支持九个玩家共同使用屏幕边缘的屏幕触摸控制,包括联想与触摸屏兼容的操纵杆和敲击杆(striker),其他玩家也可以通过键盘或与 Microsoft Xbox* 兼容的控制器加入游戏。 该款游戏的设计支持玩家多轮游戏 — 无论每轮持续多久。 玩家可以随时加入疯狂的破坏性大战,享受破坏的快感,然后可以随时离开,不会对其他玩家造成任何干扰。
如同大部分的现代触摸屏面板,联想的显示器支持 10 点触控。 Hill 将其玩家控制区设计在屏幕的边缘,但是他将其中一个边缘区域设计为游戏控制区,因此,最多可支持九个玩家而非十个(见图 3)。 这款游戏可以使用一根手指来玩,但是使用两根手指体验会更好,最多支持用户使用五根手指。
图 3: Hill 能够在显示器边缘配置 10 个触控区域。 其中一个用作游戏内的菜单控制。
Hill 表示:“我使用了屏幕图标按钮,因为我希望对游戏完全陌生以及不懂英语的玩家看一眼就能够了解如何控制应用。 许多控制都采用了二元的方式— 开或关,仿效了 Asteroids等经典游戏的控制方式。 此外,我还加入了大量的独立触摸设计。 当用户执行触摸操作时,为了简单起见,我希望了解几个用户中究竟是哪个用户创建了它,这样,当他们在同一个区域内触摸时将变得更简单。 从技术角度而言,这在大多数情况下是指了解 API 的情况,设计手势冲突并提供视觉反馈。”
为了让游戏更加完美,Hill 与自由作曲家 Patrick Ytting合作,邀请他在该款游戏中加入了星球配音。 而该款游戏中的炫目视觉效果要归功于游戏设计师兼图形艺术家 Thomas Tamblyn。 这两个人都希望从知识产权的所有权和收入中分一杯羹,Hill 只好满足他们的要求来完成这个项目。
解决的开发挑战
粒子系统和图形负载
毫无疑问,Hot Shots 后的图形负载可能会变得非常大。 当有两个玩家在使用时,GPU 负载尚可接受,但是玩家达到三人时,粒子和弯曲的网格就会变形,此外,恒星晨昏时刻的光线和其他效果可能会占用大量的处理资源。 如果下层引擎未正确编码,该负载将会加重。 因此,Hill 尽可能将显卡处理任务向 GPU 卸载。 为了能够在集成和独立显卡处理器之间实现流畅的性能,Hill 从头到尾编写了三遍粒子引擎。
Hill 表示:“只要我知道有东西会成为障碍,我就要着手处理它。 我不断改进,直至它成为系统中最快的部分,而非最慢的部分。 解决这一问题的一般做法是卸载到 GPU,但是对于粒子而言,解决办法是使用相对枯燥的阵列中的简单粒子池,而非有趣的链表或队列。 你所做的优化决策总是针对眼前的项目。
Hill 最初的粒子系统构基于具有粒子对象链表的一类对象。 他认为可以创建新的粒子,并将其添加到链表中,而且能够在不重建索引的情况下从列表中的任意位置删除失效的粒子。 但是,Hill 忽视了在 C# 中快速创建和销毁大量新实例对性能的影响,当实例创建和销毁达到一定的速度时,垃圾收集程序将会在繁重的负担下缓慢运行并导致性能明显下降。
为了诊断该性能低谷,Hill 开始调换软件组件。 当他删除粒子时,发现了问题的原因。 但是,他希望获得大量粒子为 Hot Shots带来的美观效果,因此,他开始浏览各种不同粒子引擎的源代码来寻找灵感。 他发现,通常情况下,其他人更倾向于使用对象池方法而非链表。 而且,他们会保留“无效”/自由粒子的 FIFO 请求。 这意味着,阵列的长度是固定的,粒子对象仅创建一次。 编程人员通过在粒子中加入一个参数来使其加入队列或从队列中删除(而非重建),从而根据需求在逻辑上激活或停用粒子。 因此,就不会用到垃圾收集程序,因为自一开始进行快速设置后,便没有再创建或销毁任何粒子。
Hill 表示:“我从中得到的教训是,在游戏中执行密集处理时,不要随便使用“新”关键词。 在项目开始时尽可能多加载关键词,然后尽量地循环使用。”
Hill 的第二个粒子引擎在速度上提高多个数量级,因此比上一个粒子引擎更稳定。 事实上,更多玩家能够在不知不觉间创建更多粒子。 但是,这款新引擎在管理自由粒子列表的队列时仍然存在效率低下的问题。 虽然不用每次都重新创建粒子,但是其效率仍然不高。 一些粒子(如弹道轨迹或刺击轨迹)的生命周期非常短,随着时间的推移,它们的重要性将会减弱或丧失。 Hill 意识到他无需回收已知状态为自由状态的粒子。 他无需不停地迭代操作列表直至找到自由粒子,而只需使用迭代中的下一个粒子即可。 借助这种方式,他只需保留一个索引值,而无需管理整个队列,从而能够大幅地减少工作量。 当索引打包至一颗已经使用的粒子时,该粒子可能已经失效或至少大部分为透明状态。 用户可能并未注意到粒子突然失效,尤其是在有其他视觉干扰的时候。 实质上,Hill 认为在这种环境中,他“...能够畏罪潜逃”。
他补充道:“面向 v3 进行优化不仅是出于技术原因,还因为我忽然发现了循环算法与用户感知大部分透明粒子的能力之间的模糊关系。 在你的游戏中,一定要考虑到这一点。 或许,你还有其他更好的方式可以采用?”
下列代码解释了 Hill 在重新修改前后的粒子引擎:
// Version 2 Init public override void Initialize() { this.particles = new FastParticle[MaxParticles]; this.freeParticles = new Queue<FastParticle>(MaxParticles); for (int i = 0; i < particles.Length; i++) { particles[i] = new FastParticle(); freeParticles.Enqueue(particles[i]); } base.Initialize(); } // Version 3 Init - can't get much more simple than this public override void Initialize() { this.particles = new FastParticle[totalParticles]; for (int i = 0; i < particles.Length; i++) { particles[i] = new FastParticle(); } base.Initialize(); } // Version 3 Update, with Version 2's redundant code commented out public override void Update(GameTime gameTime) { foreach (var p in particles) { if (p.Active) { this.UpdateParticle(gameTime, p); // No need to Queue up free particles any more // Just wrap round and re-use regardless // Recycle First. Recycle Hard. NO MERCY (or indeed, queuing). //if (!p.Active) //{ // this.freeParticles.Enqueue(p); //} } } base.Update(gameTime); }
语音识别
Hill 抽时间对不重要的游戏元素进行了试验(图 4)。 可能最值得注意的地方是游戏中“脏话警察”功能,它可以使用语音识别功能责骂对警察恶语相向的玩家。 (请记住,该游戏仅关注组设置,可能会混入年轻玩家。)但是事实证明,其执行非常困难。 底层引擎假定所有语音都是有意义的,但是此处的目的是忽略大部分的语音,只关注已知的脏话。 Hill 试图硬加入一个 API 来实现相反的目的。 不出所料,他得到的误报率很高。
图 4: Hot Shots* 的游戏设置极具吸引力。 Hill 实施了一个“脏话警察”功能,以便为各个年龄层的玩家提供相应体验。
Hill 表示:“因此,我没有提供字数受到限制的识别数据库,而提供了包括 20,000 个字的庞大字库。 通过这种方式,如果它认为听到了未包含在20,000 个随意的字之内的30多个主要脏字之一,则更可能出现了咒骂的情况。 我想到这一点的时候,还没有发现其他人这么做,但是我曾经看到过至少一款 EA Sports 游戏采用过这种类型的脏话管理方式。”
触控开发
Hill 非常喜欢使用 XNA4 处理任务,但是为 Windows* 8 上的触摸屏编写代码极具挑战,因为鉴于整个行业向 MonoGame* 迁移,内置的触摸板类型往往无法提供足够的支持。 幸运的是,Hill 已经从他以前的游戏 Celerity* 中找到了解决这一问题的方案。 Hill 强调:“解决方法是加入 Windows7.Multitouch.dll, 但是不要被它的名字所迷惑,因为它同时也对 Windows 8 解决方案非常有用。 它支持使用低级别触控处理,这能够提供出色的速度和可靠性。 虽然它支持打包版的 WM_GESTURE API,但是我更喜欢直接使用 WM_TOUCH API。”
访问 TouchUp、TouchDown 和 TouchMove 事件可通过下列基本 TouchHandler 来实现:
var touchHandler = Factory.CreateHandler<TouchHandler>(game.Window.Handle);
此外,Hill 还遇到了“触控卡住”的问题。 在某些情况下,抬起手指无法触发 TouchUp 事件。 很明显,例如,当阻止一艘船着火或添加其他用户时,这可能会导致出现严重的问题。 经验证发现,“触控选择”能够解决这一问题。
借助“选择”,每次从触控点接收到新信息时,倒计时就会重置。 这样,触控就能有效超时。 乍一看,这似乎可能导致按钮停止运行,但是实际上,触摸屏的传感器分辨率足以注册微小的手指运动 — 即使用户认为自己按住没有移动。 这些小运动注册为 TouchMove 事件,并可重启倒计时。
经验及建议
Hot Shots赢得 2013 年英特尔应用创新竞赛的一体机(AIO)类冠军出于以下几种原因。 毋庸置疑,该款游戏充分利用了大触摸屏界面,而且它还支持群体参与和互动。 Hot Shots沿承了一些经典的游戏元素,而且添加了多层图形向导,既能够让应用更现代,同时能够利用当代处理器的强大性能。 该款游戏的视效和音效非常棒,最重要的是,Hot Shots直观清晰地展现了未来的 AIO 系统如何采用全新的使用平台作为支持,并引领其不断向前发展。
有时,更多需要编码而非说明。 有时候,如要完美地确定一款应用,编程人员需要退一步考虑一下范例,尤其当涉及到新的硬件功能时。 Hill 表示:“我们必须接受,传统的按钮和滑动条的交互使用通常不是最佳的交互方式。 滑动手势非常简单,但非常有效。 比如,我们只需在一个平面上拖动指尖来操作,而非找到目标然后点击,前者轻松许多。 成功的手势通常有效且准确。 用户所需的精确度越低,他们所能达到的速度就越快。 您可以自行分析一下。 如要进一步增强性能,Hill 建议交互设计师先学习一下 Josh Clark 的 “Buttons are a Hack” 演讲。
有时候,经验将会引导编程人员在某些情况下对传统进行改变。 例如,Hill 表示,参加 2013 年英特尔应用创新竞赛等竞赛时,他并未使用单元测试。 许多编程人员都认为设备测试非常有必要,因为这能够确保质量。 但是,虽然他承认专业代码中需要单元测试。“...对于我个人而言,在这样一个竞赛中,我认为“仅编写代码”是一个极大地优势。”
Adam Hill 认为触摸屏和触觉技术拥有光明的未来。 目前,他准备开办一家公司,在 Windows 8 商店中发布Hot Shots,并帮助推广表计算。 Lenovo Horizon 证明该外形的设备具备较高的经济性,这意味着我们可以利用这一时机深入探索,通过丰富的想象力推动该平台进一步发展。
使用的资源
在开发 Hot Shots的过程中,Adam Hill 使用了英特尔的超极本™ 和平板电脑 Windows* 8 传感器开发指南,该指南位于英特尔® 开发人员专区。 此外,他还使用了 Visual Studio*、Git/Bitbucket*、Adobe Creative Suite*和 Stack Overflow。 Hill 强烈推荐MonoGame,来实现低级别的图形和效率之间的平衡。 最后,Hill 使用了 Farseer* Physics来处理撞击,虽然他对游戏的所有重力都进行了定制。
其它文章
- All-in-One PC: What are the developer possibilities?
- Developer's Guide for Intel® Processor Graphics for 4th Generation Intel® Core™ Processors
- Developing Immersive Apps For A New Breed Of All-In-One Computer
Intel, the Intel logo, Intel Core, and Ultrabook are trademarks of Intel Corporation in the U.S. and/or other countries.
*Other names and brands may be claimed as the property of others.
Copyright © 2014. Intel Corporation. All rights reserved.