跳到正文
YiBoard

2026-10-19

性能优化:让棋盘更丝滑

性能是没人会主动要求、但一卡就会被察觉的东西。这篇把 YiBoard 的性能优化摊开讲:中端安卓机上测到的四个数字、棋盘从 225 个 DOM 节点改成单个 canvas 的取舍、500 毫秒引擎预算怎么不再冻住棋盘,以及我们拒绝做的几项优化。

#performance#engineering#roadmap

性能优化是那种没人会主动提、直到棋盘卡一下才被察觉的工作。在 YiBoard 上它落到几个具体的数字:棋盘画出来要多久、手指按下到棋子出现要多久、引擎搜索的那半秒里画面还顺不顺。下面是我们在一台 2021 年中端安卓机、限速 4G 下测到的数字,由此引出的改动,以及几项我们拒绝做的优化。先去 yiboardgame.com 的对战页落几颗子再往下读,这些数字会更有实感。

我们一开始测到的数字

测试机是一台 2021 年的中端安卓机,网络限速到 4G,因为这比光纤上的笔记本更接近我们的真实流量。改动之前,棋盘首屏绘制 380 毫秒,一次落子平均在手指按下后 140 毫秒才出现,引擎搜索的那 500 毫秒里帧率掉到 41。没有一个数字能让游戏玩不了,但它们合在一起,让这个游戏显得比它实际的做工便宜。

  • 棋盘首屏绘制:限速 4G 下 380 毫秒
  • 手指按下到棋子出现:平均 140 毫秒
  • 引擎搜索期间的帧率:41fps
  • 能落第一颗子之前要下载的产物:gzip 后 214KB

棋盘渲染优化:一个 canvas 换掉 225 个 div

第一版棋盘是 225 个 DOM 节点,每个交点一个,网格用 CSS 边框画。它好改样式,可浏览器一重绘就散架。我们把网格和棋子搬到单个 canvas,DOM 只留棋盘外的界面。重画一颗子现在变成裁剪后重绘一格,不再是整块棋盘走一遍布局。这一项把首屏从 380 毫秒压到 190 毫秒,也是我们不做落子动画的原因之一。

网页游戏性能,与 500 毫秒的引擎预算

五子棋引擎在浏览器里跑 alpha-beta,预算 500 毫秒。朴素的写法会把主线程整整吃掉半秒,于是我们把搜索挪进 worker,让棋盘在引擎思考时继续绘制;局面已经定了的时候,改成限制深度而不是限制时间。搜索本身的细节写在引擎那篇。那台安卓机上的结果是:搜索期间帧率从 41 变成 58,棋盘也不再在对手落子之前冻住那一下。

一个不卡的游戏,还欠网络什么

每一步都要送到服务器端校验,这正是作弊做不到的原因,也是延迟藏不住的原因。我们把每一手一个请求改成复用同一条连接,并让自己的棋子先在本地出现、服务器确认在后。如果服务器判定这一手不成立,棋子会被收回,并告诉你原因。猜错一次的代价是一段动画;每一步都等一个来回的代价是整局游戏。

  • 每局复用一条连接,不再一手一个请求
  • 自己的棋子先本地出现,服务器确认在后
  • 断线重连重放棋谱,而不是重开一局
  • 对局进行中不为排行榜做后台轮询

我们拒绝做的优化

  • 不做落子动画。它在截图里好看,却会让一个快节奏的游戏显得慢
  • 不预取对手的可能走法。猜错比多等 40 毫秒更糟糕
  • 不用 WebGL 画棋盘。2D canvas 画 15×15 的网格,跑满 60 帧不需要着色器
  • 不用 service worker 缓存对局状态。棋盘显示错了,比慢一点更难让人接受

FAQ

AI 思考的时候,棋盘还会卡吗?

这一轮之前会。搜索现在跑在 worker 里,我们测试用的那台中端机上棋盘可以保持 58 帧。桌面浏览器上前后其实都看不出差别。

YiBoard 在移动网络下要用多少流量?

落第一颗子之前约 214KB(gzip 后),之后除了棋步本身不再产生数据。没有广告,没有追踪脚本,也没有分析用的包跟着进来。

既要跑 worker 又要跑服务器,还能一直免费吗?

能。免费在这里是设计选择,不是试用期。引擎跑在你自己的设备上,这正是服务器成本压得住的原因。

老一点的手机能享到这些改进吗?

大部分能,只有一处例外:worker 需要大约 2018 年以后的浏览器。更老的设备会退回主线程,棋盘一样能下,只是保留原来那一下卡顿。

在 yiboardgame.com 开一局

Related

explore.title

YiBoard (yiboardgame.com) — 中华棋类,浏览器即玩,免费无注册。 去下一局 · 更多博客 · 玩法指南