游戏测试完全指南读书笔记(第一到三章)
《游戏测试完全指南》一共 22 章,这里把前三章的笔记合在一起:第一章是基础理论,讲游戏测试和普通测试差在哪;第二章讲人工测试的思维工具;第三章以 UE5 为例,讲调试后门在今天以什么形态存在。
第一章 游戏测试和普通测试到底差在哪教程一共 22 章,第一章是基础理论。游戏测试和普通测试的差别,不只是“测的东西是游戏”。
一、交互复杂性:游戏的状态爆炸普通软件的测试模型是清晰的:从输入到程序处理,再到输出 B。
但是,游戏的每一帧都在发生多系统的交叉作用。就比如说一个太空弹幕小游戏(**用 Go 做的小游戏**),一帧里同时跑的东西有:
123帧 N: 玩家按空格 → 射击冷却检查 → 生成子弹 → 注册碰撞事件帧 N+3: 子弹撞到陨石 → 伤害计算 → 分数累加 → Combo 检查 → 陨石分裂帧 N+5: 小陨石生成 → 方向随机 → 检测出生位置是否与玩家重叠
复杂的网状交互让游戏的状态爆炸式增长。教程里给了个 MMO 战斗的复杂度公式:
C_combat = N_skills × N_buffs × N_targets × N_positions × N_t ...
F2P 游戏的切蛋糕困境:免费内容与付费内容的取舍
免费内容 vs 付费内容同样是 F2P(Free To Play) 游戏,不同类型切蛋糕的方式完全不同。
早期滚服游戏和传统 MMO,付费内容蛋糕切得很大。很多核心玩法花钱才能玩到,VIP 等级、经验加速、高级副本、竞技场排名,都直接和付费挂钩。免费玩家的游戏体验约等于给付费玩家当陪玩。这种模式单价高,每个付费玩家贡献的收入多,但玩家总量低。社区靠少量高付费玩家撑着,需要不断开新服维持收入。
二游走的是另一条路。免费内容的蛋糕切得很大,主线剧情、开放世界探索、大部分活动,零氪玩家也能完整体验。付费内容集中在角色和外观,不买角色也可以通关大部分内容。这种模式单价低,每个玩家花的钱不多,但玩家总量大。需要通过大量免费内容持续吸引新玩家进来,靠规模撑起收入。
单价与玩家量两种模式对应不同的经济模型。滚服游戏是单价高、玩家量低,每个付费玩家贡献大,但整体用户盘子小。二游是单价低、玩家量大,每个玩家可能只付月卡或首充,但靠人数撑起总流水。
二游的问题在于玩家群体复杂。同一个游戏里,有不同氪金能力,不同游戏目的,各种各样的群体。他们的需求完全不同。零氪玩家在意内容量够不够玩,重氪玩家在意角色有没 ...
DOTA2 Mod编辑器初探
这篇不是教程,我也不会做 Mod。只是记录从零开始接触这套工具时的真实体验。
为什么是 DOTA2?最近在网上冲浪看见一个LOL屎山代码的段子,说LOL的回血技能是在身旁隐形的召唤一个奶妈英雄,虽然也没有LOL源码可以验证这个段子,而我也觉得这大概率是假的,否则游戏负载要高出天际了。不过,可以肯定的是DOTA2 的代码一定不是这样。
DOTA2 的 Mod 生态有一套完整的官方支持——Steam Workshop Tools,包含了从关卡编辑器到 Lua 脚本引擎的所有东西。而且和那些纯粹依赖社区破解逆向的 Mod 不同,Valve 主动把工具交到了玩家手里。
更重要的是,DOTA2 的 Mod 编辑器是一个很自由的工具。自定义地图、自定义英雄、自定义技能机制、自定义 UI。你完全可以做一个基于 DOTA2 引擎的独立作品。
著名的例子:自走棋(Auto Chess)。一个 DOTA2 Mod 在 2019 年横空出世,直接催生了一个游戏品类。这证明了这套工具有足够的能力承载全新的设计。
安装与首次启动获取工具不需要单独下载——Steam 库中找到 Dota 2,右键 → 属性 ...
二游付费的悖论:为什么"不付费"才是最优解
游戏账号的”价值”究竟有多少假设一款二游长线运营七年。开服第一个月氪金抽到的角色,到第七年时价值还剩多少?就比如说,原神。
如果从纯粹理性角度出发,在漫长的数年时间中,经历了数次版本迭代、数值膨胀、新角色替代,某次氪金收益会不断边际递减,最后几乎趋近于零。
那么从纯理性角度出发,二游的最佳策略是不付费。玩的时间越长,单次付费提供的价值越低。开服时花钱最值,其次是创号第一天。
买断制游戏是付一次钱获得完整产品。订阅制是付钱获得当期服务。二游是付钱获得角色,得到的角色却在时间轴上持续贬值。
二游依然是全球最赚钱的游戏品类之一。所以为什么玩家会付费?
注意力经济与沉没成本一个常见的解释是:注意力经济
花的时间越多 → 沉没成本越高 → 更容易付费 → 付费后继续投入时间 → 循环强化。
这个说法有一定道理。但如果只到这里为止,就让人感到有些简单粗暴了。并且有些拿着结果去找答案的嫌疑,从事后,我们当然可以指着图表很自然说:看那,玩家付费和玩家游玩时长同增同减,它们具有相关性。然而相关性不等于因果,冰激凌销量和溺水事故激增之前也没有因果关系。
我们无法确定,玩家付费和玩家游玩时长时间谁是因谁 ...
竞技游戏的幻觉:为什么匹配系统在解决一个不存在的问题
匹配机制的抱怨从未消失过线上对战游戏这么多年了,为什么找不出一个好的匹配机制?
守望先锋 2 加了角色队列,五个辅助排到一起的情况不再发生,锁定职责,队友抢职责瞎选的情况确实少了,但抱怨改为了「系统在控制我的胜率」。
漫威争锋 官方反复否认用 EOMM,发了开发者视频逐帧解释匹配流程。但…社区好像一点也不买单。
Dota 2 的「强制 50%」指责存在了十多年。Valve 换了算法、又加了 Behavior Score、Role Queue、Immortal Draft,但指责匹配机制的声音始终存在。
这么多游戏、不同的算法、不同的公司,但「系统在针对我」的说法在所有竞技游戏里都差不多。
匹配机制真的有问题吗?
或许玩家抱怨的不是匹配算法。抱怨的是在团队游戏里输了的体验,而匹配系统只是最方便的背锅对象。
Elo 的来源1960 年,Arpad Elo 为美国国际象棋联合会设计了 Elo 评分系统。下棋是 1v1、零随机、对局结果基本等于实力差,这很公平,象棋玩家想要的就是精准的实力排序。对完全信息博弈的纯竞技来说,这个系统运行得不错。
六十年后,游戏行业把它搬进了 5v5、存在 ...
[代码练习] 喝100杯奶茶
QQ水群时看到这么一个段子,虽然段子很老套,但这么工整的一段话看起来就让人手痒,就做一个代码练习吧。
写一个能随机生成这段话的代码。但是如果只是一模一样地生成就有点太无聊了,最好是能根据输入的词能够按这样的模板输出。
这段文本每行的结构非常规律:{动词}{数字}{量词名词}。比如 “喝100杯奶茶” → 动词=”喝”、数字=100、后缀=”杯奶茶”。把 100 句拆完,动词和名词短语各自去重,就有了一个可复用的词库,换个输入文本也能按同样模板生成。
解析文本结构先定义数据结构。每行拆成三部分:数字前的动词、数字本身、数字后的名词短语。
1234567891011121314151617181920212223242526272829303132333435type Entry struct { Prefix string // 动词部分 Suffix string // 量词+名词 Num int}func parse(text string) [ ...
用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 # 单颗陨石:运动逻辑├── meteors.go # 陨石管理器:定时生成、批量更新├── timer.go # Ti ...
HowLinuxWorks随记
这本书讲 Linux 的骨架:内核、进程、内存、文件系统、命令行。我读的时候最有用的不是记住每条命令,而是搞清楚”敲一条命令时,系统里发生了什么”。这篇记录我留下的部分。
三层结构Linux 分为三层:用户进程、内核、硬件。
内核在硬件之上,管理硬件,是硬件系统和应用程序之间通信的接口。
进程指计算机中运行的所有程序,组成最顶层,叫做用户空间(user space)。
用户进程和内核最根本的区别:内核运行在内核模式(kernel mode),用户进程运行在用户模式。内核模式下不受限制,可以访问处理器和内存的任何部分。只有内核能访问的空间叫内核空间(kernel space),用户进程能访问的叫用户空间。一般来说,用户进程的影响范围被限制在用户空间内。
内核在管四件事
进程:决定哪个进程可以使用 CPU
内存:内存分配,管理进程间的共享内存与空闲内存
设备驱动程序:硬件系统和进程之间的接口
系统调用和支持:进程通过系统调用和内核通信
进程管理:上下文切换CPU 同时运行多个进程,靠的是轮流执行,叫多任务执行。CPU 从一个进程切换到另一个进程,叫上下文切换(context switc ...
全栈测试随记
为什么一个开发者要看测试书《Full Stack Testing》这本书不厚,但覆盖了从单元测试到探索性测试的整套方法论。以下不是书的内容摘要,是我读完后觉得真正有用、并且从开发者视角重新理解过的部分。
测试不是找 bug这是书里让我重新校准的第一个概念。
找 bug 是测试的结果,不是测试的目的。测试的目的是提供信息——这段代码在什么条件下正常工作,在什么条件下会出错,错了之后的表现是否可接受。这个信息服务于一个决策:现在能上线吗?
把测试理解为”信息获取”而不是”质量检验”,会改变你做测试的方式。你不会问”这个功能有 bug 吗”,而是问”在所有我知道的边界条件下,这个功能的行为我都看清楚了吗”。前者只有一个答案(有/没有),后者会引导你系统地列出一组场景。
等价类划分与边界值分析这两个是测试理论里的基础,几乎是所有测试方法论的起点。
等价类假设有一个输入值 x,业务逻辑分三段处理:x < 500、500 ≤ x ≤ 1500、x > 1500。理论上三个区间里的任意值行为都应该一致。所以你不必测全部数值,只需要在每个区间挑一个代表。
等价类的核心思想: ...
混沌工程随记
混沌工程目的不是在故意在生产环境里搞破坏。搞破坏很容易,难的是下面这几件事:减小爆炸半径,批判性地思考安全性,确定漏洞值不值得修复,决定是否应该做实验。
为什么做实验对复杂系统来说,寻找做对的地方比寻找做错的地方信息量更大。故障往往来自系统内部的未知相互作用,靠预测很难提前发现。
混沌工程用实验去认识系统的真实属性:在受控条件下注入故障,观察系统怎么反应,把”我以为它会怎样”变成”它实际怎样”。知道了这些,团队才能用测试手段规避错误,让系统更有韧性。
冗余不是答案想让系统更健壮,一味加冗余只会掩盖问题。冗余本身也在引入复杂度:多一套副本,就多一套同步、切换、失败处理的逻辑,这些都是新的故障点。
比如给订单服务加一台备用节点,听起来更稳了。但故障演练时可能发现:切换逻辑要 40 秒才完成,业务早就超时了。冗余只是把”故障”变成了”没被验证过的故障”。
先想清楚再动混沌工程不是想做就做的实验。每一步都要回答:爆炸半径多大?会不会伤到真实用户?这个漏洞值得修吗?这次实验要验证什么假设?
这四件事想清楚了,再决定要不要在生产环境动手。






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



