游戏开发中的成功度量
作者:Katy Farmer / 产品,用例,开发者
2018年7月31日
导航到
我仍然在个人使命中探索和理解指标作为技术基本组成部分的价值。我们已经进入了一个仪器化的时代,我觉得自己落后了。我看到指标被用来监控复杂系统,分析行为(包括软件、硬件和人类)以及跟踪机器学习算法的变化。传感器数据可以告诉我空气中一氧化碳过多,或者我的在线商店在黑色星期五崩溃。指标可以帮助工厂工人安全,并跟踪我的杂货配送。这些都很令人印象深刻,当其他人向我解释他们的指标时,很容易看到价值。
我决定,探索我在自己工作中指标价值的最佳方式是仪器化一个对我有价值的应用程序。欢迎来到“Paper Pirates”:一个基于浏览器的、用Node.js构建的游戏,它只有一个目的,那就是有趣(在此找到repo)。没有赢得“Paper Pirates”的方法——唯一的胜利策略就是不去玩。
我选择了一款网页游戏,原因有几个:1)我喜欢游戏。它们比现实世界好得多。2)游戏开发真的很困难。即使是这样的简单游戏,也存在着许多可能导致故障和不可解释行为的机会。
游戏是指标的宝库,我可以收集到大量统计数据,以确保我的应用程序运行正常。这是DevOps的核心,但我想从一个稍微不同的角度进行探索。在本文中,我将重点介绍指标是如何帮助我调整游戏性能和提高游戏体验的。让我们开始吧!
从“纸海盗”中收集指标很简单;我使用了InfluxDB Node.js客户端。本质上,我会监听某些事件,当它们发生时,我会向InfluxDB发送1的值。在这种情况下,我不需要特定的值——我只需要知道事件发生了以及何时发生。
与InfluxDB的所有交互都位于index.js中。查看代码,你会发现我正在收集指标来帮助构建排行榜、衡量导弹精度和整体玩家详情。目前,我们将关注这个代码块。
socket.on("enemyfire", results => {
client.writeMeasurement("events", [
{
tags: { sessionID, gameID, enemyID: results.enemyID, event: "enemyMissile" },
fields: {
enemyFires: 1,
}
}
])
})
});
游戏中最重要的部分之一是玩家与世界互动,这坦白说是我最后才想到的事情——直到我第一次玩这款游戏。这是敌舰发射的方式。
export const enemiesFire = () => (dispatch, getState) => {
const { enemies } = getState();
_.each(enemies, enemy => {
const roll = _.random(4000);
if (roll <= 10) {
Client.emit("enemyfire", { enemyID: enemy.id })
dispatch({ type: "ENEMYFIRE", payload: enemy });
}
});
};
这里发生了很多事情。本质上,我们处理的是敌人发射的概率。选择一个0到4000之间的随机数,只有当它小于10时,敌人才会发射导弹。当我第一次写这段代码时,我不知道哪些数字会起作用,所以我猜了一下。我们将这个第一次实验的结果称为“虚空”。
<figcaption> 只有你自己与错误相伴的地方 </figcaption>
敌人的发射过于频繁,以至于仅仅生成导弹就造成了画布上其他所有东西的延迟。然后玩家立即被大量的导弹击中而死。
这导致我多次更改rand函数中的数字,直到找到不会杀死浏览器的方案。然而,游戏开发中最困难的部分之一就是找出什么才感觉正确。比如控制响应速度、精灵反应速度或者碰撞检测的精确度,所有这些都会影响玩家是否享受(或不享受)游戏体验。所以找到正确的敌人发射率对我来说很重要,即使这很难。
这时,指标就派上用场了!重新审视第一个代码片段,我标记了每个敌舰导弹为一个事件,该事件会将计数增加并发送到我的InfluxDB实例。这使我能够跟踪与我在代码中选择的随机数相关的有意义的聚合数据。
通过这种方式,指标推动了“纸海盗”游戏体验的改进,并使我成为了一名更加了解情况的开发者。我第一次写随机发射代码时,它看起来是这样的
_.each(enemies, enemy => {
const roll = _.random(1000);
if (roll <= 10) {
Client.emit("enemyfire", { enemyID: enemy.id })
dispatch({ type: "ENEMYFIRE", payload: enemy });
}
跟踪事件,我发现它摧毁整个游戏的原因是它在10秒内发射了大约3500次。“纸海盗”根本无法承受这样的负载。随着我玩游戏并跟踪发射情况,我发现每秒大约一次的敌人发射率对我来说感觉最好,并使玩家能够在超过一分钟的时间内生存下来。
<figcaption> 海上最精良的船只 </figcaption>
我需要聚合数据的另一个原因是屏幕上有多个敌人。目前游戏限制同时存在四个敌人,但它们发射的频率略有不同,简单来说就是我不知道会发生什么。收集敌人射击事件的次数减轻了我试图弄明白的心理负担。这也让我能够对它进行各种聚合操作,尽管我主要关注平均值。
理解指标的价值对每个人来说都不一样。是的,我想知道“纸海盗”正在运行,指标和事件可以帮助做到这一点。但我也想知道当它运行时,它也是最好的。
能够精细调整游戏玩法是制作人们真正想玩的游戏的一部分,测量游戏玩法随我的代码变化而变化的方法是我成为一名更好的游戏开发者的途径。