游戏测试和普通测试到底差在哪 —— 读《游戏测试完全指南》第 1 章
上篇写了《全栈测试》的读书笔记——那是普通软件的测试方法论。这篇开始读一个专门讲游戏测试的教程,22 章,从人工测试讲到强化学习代理。第一章是基础理论。
读之前我有个直觉上的问题:**”游戏测试和普通测试,不就差一个’测的东西是游戏’吗?”**
读完第一章发现不是。差的东西很具体,而且每一条都直指游戏代码和普通应用代码的底层差异。以下是我理解后的梳理。
一、交互复杂性:不是输入 → 输出,是持续碰撞普通软件的测试模型是清晰的:输入 A → 处理 → 输出 B。测试用例就是”给定 A,验证结果是 B”。
游戏不是这样。游戏的每一帧都在发生多系统的交叉作用。以我写的那个 Go 射击游戏为例,一帧里同时跑的东西:
123帧 N: 玩家按空格 → 射击冷却检查 → 生成子弹 → 注册碰撞事件帧 N+3: 子弹撞到陨石 → 伤害计算 → 分数累加 → Combo 检查 → 陨石分裂帧 N+5: 小陨石生成 → 方向随机 → 检测出生位置是否与玩家重叠
这不是一条线性链路,是网状交互。教程里给了个 MMO 战斗的复杂度公式:
$$C_{combat} = N_{skills} \ti ...
DOTA2 Mod编辑器初探
前言这篇文章是我作为初学者的踩坑记录。不会说怎么做 Mod(我也不会),只是记录从零开始接触这套工具时的真实体验。
为什么是 DOTA2?最近在网上冲浪看见一个LOL屎山代码的段子,说LOL的回血技能是在身旁隐形的召唤一个奶妈英雄,虽然也没有LOL源码可以验证这个段子,而我也觉得这大概率是假的,否则游戏负载要高出天际了。不过,可以肯定的是DOTA2 的代码一定不是这样。
DOTA2 的 Mod 生态有一套完整的官方支持——Steam Workshop Tools,包含了从关卡编辑器到 Lua 脚本引擎的所有东西。而且和那些纯粹依赖社区破解逆向的 Mod 不同,V 社是主动把工具交到玩家手里的。
更重要的是,DOTA2 的 Mod 不是”做一个小游戏放在大游戏里”——它允许你重新定义一切。自定义地图、自定义英雄、自定义技能机制、自定义 UI。你完全可以做一个基于 DOTA2 引擎的独立作品。
最著名的例子:自走棋(Auto Chess)。一个 DOTA2 Mod 在 2019 年横空出世,直接催生了一个游戏品类。这证明了这套工具有足够的能力承载全新的设计。
安装与首次启动获取工具不需 ...
二游运营节奏回顾:那些维系"陪伴契约"的成功与翻车
前言上一篇文章讨论了一个核心命题:二游的本质是”陪伴型长期契约”。玩家付费买的不是角色强度,而是和角色一起走向未来的承诺。
如果接受这个前提,那么接下来的问题就是:长线运营游戏的这份契约如何维系?
答案是运营节奏。版本更新、活动排期、限定角色投放、福利发放。每一次版本更新,都是”游戏还在为你做新内容,你的陪伴资产还在增值”的承诺。
本文将回顾几起著名的二游运营事件,从”陪伴型契约”的视角重新审视它们——为什么有些危机只是骂几天,有些却直接致命?案例一:《明日方舟》——“21年多索雷斯假日”发生了什么:
限定干员”假日威龙陈”立绘质量引发大规模不满
无预告推出新六星限定,打破以往惯例
活动奖励和内容量被认为与限定密度不匹配
玩家争议:立绘丑、吃相难看、空降限定逼氪。
《明日方舟》的玩家一直以来被培育的期待是”限定很珍贵,一年只有少数几次,每一次都是高品质。”
而多索雷斯无疑是打破了这个约定或者说打破了这个预期。当限定从”限定”变成”多一个收钱理由”,玩家相信长线运营未来的信念就被动摇了,变得开始怀疑。”
这个事件之后,《明日方舟》花了近两年时间修复信任,包括后续的大规模福利调整和内容 ...
二游付费的悖论:为什么"不付费"才是最优解
一个违反直觉的事实为什么对于氪金抽卡游戏”不付费”才是最优解?
让我们算一笔账。
假设一款二游长线运营数年,比如原神,明日方舟,都是运营了7年的“长青游戏”。你开服第一个月氪金抽到的角色,到第7年时,经历数次版本迭代、数值膨胀、新角色替代,它的实际价值还剩多少?
答案是:随着游戏内容的不断更新,以及玩家游玩总游玩时长市场的不断累计,那部分氪金收益会无限边际递减,最后几乎趋近于零。
这意味着,从纯理性角度出发,二游的最佳付费策略是不付费。而且玩的时间越长,单次付费提供的价值越低。游戏开服越久,氪金边际效益越低。氪金“最值”的时候第一是在开服时,第二是在账号创建时。
这与我们熟知的消费逻辑完全相反。买断制游戏:付一次钱就获得完整产品。订阅制服务:付钱就获得当期服务。二游:付钱获得角色,然而角色在时间轴上持续贬值。
但二游依然是全球最赚钱的游戏品类。为什么?一个普遍的解释:注意力经济与沉没成本对于这个悖论,最常见的解释是注意力经济与沉没成本的循环:
玩家在游戏上花的时间越多 → 注意力被持续捕获 → 沉没成本累积 → 更容易打开钱包 → 付费后为了”让钱不白花”继续投入时间 → 循环强化。 ...
[代码练习] 喝100杯奶茶
QQ水群时看到这么一个段子,虽然段子很老套,但这么工整一段话段话看起来就让人手痒,就做一个代码练习吧。
写一个能随机生成这段话的代码。但是如果只是一模一样的生成就有点太无聊了,最好是能根据输入的词能够按这样的模板输出。
也就是将 “喝xx杯奶茶”提取出来,然后根据提取词随机生成。
提取数字与汉字把数字与汉字分别提取出来,存储在一个[]string切片中 也就是[][]string
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849func preParam() [][]string { var s = "喝100杯奶茶\n来99个拥抱\n看98场日落\n要97次接吻\n拍96张照片\n买95朵玫瑰\n去94家餐馆\n看93次大海\n走92条小巷\n打91次雨伞\n要90场牵手\n种89个草莓\n盖88次被子\n递87杯温水\n热86次剩饭\n看85次电影\n做84顿午饭\n切83个水果\n吃82次甜品\n喝81次暖茶\n要80次拥抱\ ...
用Go语言来做一个小游戏吧!
GitHub 仓库: goTraining
前言2024 年夏天用 Go 做了个东西:一个能跑能玩的陨石射击游戏。最初动机很单纯——学了 Go 的语法,想做点不是命令行输出 Hello World 的东西。游戏是很好的选择:有状态管理、有实时循环、有碰撞检测、有资源加载。一个几十兆的小程序,碰了工程里的许多问题。
引擎选的是 Ebitengine(当时还叫 Ebiten),Go 原生的 2D 游戏库。没有 Unity 那么庞大的编辑器,库只要引进来就能写 main(),跑起来。对于做个小游戏来说,刚刚好。
这篇文章是一次完整的技术复盘。不是教程,是我做完之后回头看:每一块怎么做的,为什么这么做,有什么坑,以及如果再写一次会怎么改。
架构总览整个项目只有 8 个 .go 文件,没有第三方依赖(除了 Ebitengine 本身和 Go 标准库):
12345678├── game.go # 游戏主循环,碰撞检测,分数管理├── player.go # 玩家飞船:移动、旋转、射击├── bullet.go # 子弹:生成、飞行、绘制├── meteor.go ...
HowLinuxWorks随记
本文将记录《how linux works》一书中的知识。
第一章 概述Linux层次Linux分为用户进程,Linux内核,硬件。内核在硬件之上管理硬件系统,是硬件系统和应用程序之间进行通信的接口
进程指计算机中运行的所有程序,组成了最顶层,称作用户空间或用户进程
用户进程与内核之间最主要的区别是内核在内核模式 kernel mode中运行,用户进程在用户模式运行。内核模式中运行不受任何限制访问处理器与内存。那些只有内核可以访问的空间叫做内存空间 kernel space,反之用户进程可以访问的为用户空间 user space。一般来说用户进程的影响范围被限制在用户空间内。
主内存与CPU频繁产生读取行为的内存。数据以特定排列的0与1 bit存储,这被称为状态 state。我们可以用状态的变化阶段来描述进程的执行过程(eg. 进程的执行阶段 ,进程正在执行启动任务阶段)。镜像 image 通常表示比特值在内存中的特定物理排列
内核内存负责管理以下四个方面:
进程:决定哪个进程可以使用CPU
内存:内存分配,管理进程间的共享内存与空闲内存
设备驱动程序:作为硬件系统和进程之间的接口
...
全栈测试随记
为什么一个开发者要看测试书《Full Stack Testing》这本书不厚,但覆盖了从单元测试到探索性测试的整套方法论。以下不是书的内容摘要,是我读完后觉得真正有用、并且从开发者视角重新理解过的部分。
测试不是找 bug这是书里让我重新校准的第一个概念。
找 bug 是测试的结果,不是测试的目的。测试的目的是提供信息——这段代码在什么条件下正常工作,在什么条件下会出错,错了之后的表现是否可接受。这个信息服务于一个决策:现在能上线吗?
把测试理解为”信息获取”而不是”质量检验”,会改变你做测试的方式。你不会问”这个功能有 bug 吗”,而是问”在所有我知道的边界条件下,这个功能的行为我都看清楚了吗”。前者只有一个答案(有/没有),后者会引导你系统地列出一组场景。
等价类划分与边界值分析这两个是测试理论里的基础,几乎是所有测试方法论的起点。
等价类假设有一个输入值 x,业务逻辑分三段处理:x < 500、500 ≤ x ≤ 1500、x > 1500。理论上三个区间里的任意值行为都应该一致。所以你不必测全部数值,只需要在每个区间挑一个代表。
等价类的核心思想: ...
混沌工程随记
混沌工程并不是在生产环境中搞破坏。搞破坏很容易但完成下述事情很难:减小爆炸半径,对安全性进行批判性思考,确定漏洞是否值得修复,决定是否应该进行实验。寻找做对的地方比寻找做错的地方提供的信息多得多,因为对于复杂系统而言,故障可能是因为熵增而导致的系统性错误,这些并不能被预测到。而混沌工程通过实验认识到系统的属性信息,从而可以通过测试的方法规避掉错误,让团队拥有更好韧性。 对与让系统更加健壮而言,一味的冗余只会掩盖问题的存在,同时冗余的同时引入了故障,发生了熵增。


![[代码练习] 喝100杯奶茶](/img/HaveACup/cup.png)


