下载 App

《万象纪》开发日志 #5|发布:最后一公里

前天 10:1454 浏览

写在前面

功能做完不等于游戏能发。最后这段路要做的事情很琐碎:装得上、打得开、存得住档,署名清楚,商店页面上的每一张图都符合规格,玩家第一次打开时不出问题。
《万象纪》1.0 已经准备上线。
horizontal linehorizontal line

一、只发 Windows

我们原本计划同时发Windows 版和 mac 版。临近发布时,我们决定首发只上 Windows 客户端。网页版和 mac 版仍然保留在工程里用于开发和测试,但这次不上传:与其三个平台都“差不多能玩”,不如先把一个平台测到放心。
最终交付两个包:
  • 安装版(约 114 MB):可以选择安装目录,只为当前用户安装,卸载时不会删除存档;
  • 免安装 zip(约 159 MB):解压后根目录就是 万象纪.exe。
存档放在 %APPDATA%\wanxiangji,两个包共用一份。字体许可证、第三方声明、运行环境的许可证和工作室品牌的授权说明,都放在安装目录下的 resources\licenses 文件夹里,游戏界面里不出现。
游戏没有做代码签名,第一次打开时 Windows SmartScreen 可能会拦一下(点“更多信息 → 仍要运行”),商店页面上写了说明。
打包时出过一个事故:解包检查全部通过,真机一安装,一启动就弹出系统错误框,原因是一个调色板文件没进打包白名单。修好以后,我们加了一道检查:对最终安装包里的文件递归检查依赖,不再只看解包结果。另一个小细节:exe 属性里的公司名原来是运行环境的默认值,现在改成了「Srcmax Studio 元极工作室」。
horizontal linehorizontal line

二、工作室片头与署名

游戏启动后,主菜单出现之前会播放一段 5 秒的元极工作室片头(墨夜底、朱砂印),任意键可以跳过。主菜单底部有工作室的横版标志,“关于”页面的右下角盖着工作室的印章,署名是「6thSh0w 刘秀 · Srcmax Studio 元极工作室」。
TapTap
第一篇日志里我们说过,游戏里的美术和音频都是用代码做出来的。到发布时,不是代码画出来的东西只有两样:第二篇提到的开源像素字体,以及我们工作室自己的片头和标志。
工作室标志是像素画,规矩很严:只能按设备像素的整数倍放大,四周留出印章宽度四分之一的安全区,不旋转、不拉伸、不加特效、不改色。结果就在这几条规矩上,栽了两个跟头:
  • 丢了一个 T:标志居中时落在了半个设备像素上,最近邻采样整列丢像素,“STUDIO”少了一个 T,“工作室”也缺了笔画。
  • 1/64 个像素:在 150% 的系统缩放下,浏览器内核用 1/64 像素为单位记录布局,137.333 只能存成 137.328125。图片的尺寸因此不再是整数个设备像素,被双线性插值混了色,标志边缘出现杂色。换采样方式、去掉亚像素偏移、改用局部画布都不行。最后的办法是:每个标志都画在一张铺满窗口的设备像素画布上,起点取整数,按原图的整数倍、关闭平滑来绘制。验证覆盖了 4 种浏览器内核 × 4 种缩放比例 × 4 种窗口尺寸,128 个标志逐像素 100% 正确。
TapTap
horizontal linehorizontal line

三、商店物料

TapTap 的发布物料有一长串:满版图标、LOGO、横版和竖版封面、3840×1240 的库壁纸、无 LOGO 宣传图、16:9 和 1:1 宣传图、编辑推荐图、截图、实机录屏、宣传片,还有简介、开发者的话和更新日志。itch.io 另有封面和 10 张截图。所有图都是游戏引擎原生渲染出来的,不是截图放大。
主视觉叫“一道雷,万象生”:同一座城、同一个机位、同一个时刻,一道雷劈下,三道地缝把画面分成四块,分别是这座城在修真、魔法、赛博朋克、蒸汽朋克四个世界里的样子。四块画面都是真实模拟出来的世界,在目标分辨率下由引擎直接渲染,再拼合起来;拍摄前后我们都核对过模拟状态没有变化。
库壁纸把五个世界排成一条长卷:
TapTap
TapTap
两条视频都遵守了平台的规则:
  • 实机录屏(约 103 秒):第 0 秒就是玩法,开局降雷、起火、火种传开,连续 16.6 秒;结尾是一局成功达成目标的完整结局,让玩家看到“这是能赢的”。
  • 宣传片(约 60 秒):第一帧就是星陨坠落(平台要求前 3 秒不能是 LOGO 或黑屏),片尾是游戏 LOGO 和工作室标志。
录屏时高画质只有约 11 帧每秒,所以两条视频都用中画质录制。商店文案的标语是:“一个念头,传成一个文明。”
horizontal linehorizontal line

四、发布前复审

发布前做了一次完整复审:逐个核对安装包的校验值、许可证和版本号;在 itch 式的网页嵌入环境里用真实键鼠打了一局;从安装包装好 mac 版实测;标志逐像素检查;TapTap 物料 15 项逐项对照规格;近一万项自动化测试全部通过。
结论是有条件发布:没有阻断级问题。标志发虚(上文)是唯一的高优先级问题,已经修好;另有 9 个小问题一并修掉,比如:
  • 正式版里还留着英文默认菜单和开发用的快捷键;
  • 菜单音乐要先点一下才会响;
  • 直接关闭窗口时不保存;
  • 打开游戏后的第一次点击会丢失;
  • 新手引导会压住其他浮窗;
  • 信仰有时显示成“195/194”。
唯一的条件是:在一台真正的 Windows 电脑上实测一遍。复审是在 Mac 上做的,手边没有 Windows 机器。
horizontal linehorizontal line

五、Windows 白屏之谜

条件很快就派上了用场。在我们自己的一台 Windows 笔记本(RTX 4060)上,游戏出现了两种问题:一种提示“你的电脑不支持 WebGL2”,另一种界面一切正常,但 3D 世界是一片纯白。
第一步是让问题看得见:
  • 加了一个随时可以打开的图形诊断面板(F8),出错、白屏或图形上下文丢失时会自动弹出,可以一键复制,同时写入日志文件;
  • 图形上下文按几组参数依次重试;
  • 显卡后端可以有限次自动切换,并记住成功的那个;
  • 渲染目标不支持高精度格式时,自动降级到兼容格式。
诊断结果出乎意料:显卡完全支持 WebGL2,各项上限也都正常。真正的原因是:在默认的 D3D11 后端下,GPU 进程在编译地形着色器时栈溢出了(错误码 0xC00000FD)。所谓“不支持 WebGL2”,只是崩溃之后的表象。
为了看清 Windows 那一侧拿到的着色器是什么样子,我们在 Mac 上编译了同版本的着色器翻译器,对比转换出来的 HLSL,然后简化 Windows 版着色器:去掉不可达的函数,把固定次数的循环改掉,拆分最大的函数(缩小了约 40%),画面逐像素不变。但 D3D11 上仍然栈溢出,OpenGL 后端则是 GPU 进程直接崩溃。我们没有用“调大栈空间”这种办法来掩盖问题。
转机出在 Vulkan:系统报告说这台电脑“不支持 Vulkan”,实际一试却运行得很健康。最终的后端顺序是 Vulkan → 串行 D3D11 → 默认 D3D11 → OpenGL → 软件渲染,每种最多尝试一次,Vulkan 初始化有 8 秒的看门狗。设置页、失败页和命令行参数都可以手动指定后端。
顺带,游戏第一次启动时会在主显示器上最大化窗口,并记住你上次是窗口、最大化还是全屏。
horizontal linehorizontal line

六、最后一个修复:文字溢出

Windows 实测还发现了最后一个问题:在 1920×1080、系统缩放 100%、窗口最大化(实际可用 1920×1009)时,很多面板的文字显示不全,有的被“……”截掉,有的直接超出了屏幕。
原因是界面按 1280×720 定好了这些组件的宽度,而大窗口下文字会更大。修法是:
  • 大窗口下各种便签和卡片加宽约三分之一;
  • 不再用“……”截断,改为换行;
  • 人物卡的“所知”只列最新 3 项,加上“等 N 项”;
  • 过长的提示框限制高度,可以滚动;
  • 结算字幕让开“跳过”按键。
我们写了一个扫描工具,检查 76 个界面 × 9 种窗口尺寸,共 684 种组合:修改前有 230 种组合存在溢出(共 1891 处),修改后是 0。
TapTap
horizontal linehorizontal line

七、已知问题与 1.1

已知问题(发布说明里同样写明):
  • 没有代码签名,首次打开可能被 SmartScreen 拦截;
  • 后期的大城市对 CPU 和显卡都比较重,自动画质最高到中档,漫游和平移时偶有卡顿;
  • 4 倍速时帧时间偏高,赛博世界的内存峰值偏高;
  • D3D11 下的着色器栈溢出没有根治,目前靠 Vulkan 优先绕开;
  • 目前只有简体中文。
1.1 计划:
  • 神谕和托梦在后期经常没有可选目标,要改;
  • 后两道目标根据玩家选择的非常神力随机给出,不再总是“发展到现代”;
  • 文明倾向栏显示全部形态;
  • 根治 D3D11 的问题;
  • 重新设计文字大小档位。
horizontal linehorizontal line

写在最后

开工的第一天,《万象纪》还只是一句话:你创造了世界,却无法决定它会成为什么。
现在它是一个能装进 Windows 电脑的游戏:猿人会自己学会用火,路是被走出来的,修真宗门会搬到山上,赛博城市会一层层叠起来,史书会记下这一切的起因。我们最喜欢的,永远是那些没人设计过的局。
谢谢一路看到这里。下载《万象纪》,造一个世界,然后看看它会长成什么。
第一关卡制作完成!【开发者日志·三】截图
第一关卡制作完成!【开发者日志·三】
那些潜藏在这片空间里的异影幻影,不再只存在我们脑海中,而是可以给大家最直观的呈现;我们的兔大侠,也终于拥有了属于三维世界的形体。[表情_开心] 国庆假期后,安排内容真是太紧张了!目前第一关卡已大致搭建完成,老辈子手搓模式,不知道18号前是否完成三关和最后的落幕演出[表情_豹哭] 但整体是向前踏出一大步的! 从纸面草图,到把轮廓捏进三维空间。本次可透露的为以下内容: 怪物立绘、怪物白模搭建、
8 赞
6 回复
《万象纪》开发日志 #4|变体:同一个文明,四种活法截图
《万象纪》开发日志 #4|变体:同一个文明,四种活法
写在前面 《万象纪》的核心承诺是:上帝不能选择文明的样子,只能改变世界的条件。阶段 3 证明了不干预时文明会走向现代;阶段 4 要证明另一半:改变条件,文明会长成别的东西,而且这些“别的东西”要真的是从个体之间的想法里长出来的。 四种形态各跑 20 局,每种至少 70% 能被认出来;而且不看界面,随便截一张图,就要能认出这是哪个世界。 一、五个非常神力 常规神力(雷霆、降雨……)和托梦都打不开变体
官方
5 赞
2 回复
《万象纪》开发日志 #3|时代:从茅草屋到摩天楼截图
《万象纪》开发日志 #3|时代:从茅草屋到摩天楼
写在前面 第二篇结束时,猿人刚学会用火,世界停在部落时代。阶段 3 要回答两个问题: 不干预时,文明能不能自己走到现代? 不靠脚本、不按时间发科技,只靠想法的发现和传播。 每个时代能不能一眼认出来? 房子、夜景、动物、神力,都要跟着时代变。 这个阶段的闸门叫 M1:50 个随机世界不干预,至少 90% 要自己走到现代,而且一局看下来画面要“对”。 一、时代的规则 时代 一个 tick 约等于 一眼
官方
13 赞