SVGA 预览:如何跨平台对比一个 SVGA 文件

完整走一遍 SVGA 预览——SVGA DIY 用于跨平台对比 SVGA 文件的工具:用三种方式加载文件、双栏或六宫格对比全部播放器、逐帧精确定位、量化像素差异、读懂自动生成的兼容体检报告、匹配真实设备尺寸,并浏览完整的兼容矩阵。

SVGA 格式由五套完全独立的播放器各自实现——SVGAPlayer-Web、SVGAPlayer-Web-Lite,以及官方 Android、iOS、Flutter 库——它们支持的能力并不完全一致。同一个文件在一个播放器里看起来完美无缺,换到另一个播放器里可能悄悄丢失 matte 遮罩、内嵌音频,甚至连形状都不对。SVGA 预览——/preview 这个工具——就是为了在文件正式使用前抓出这类问题:它在你的浏览器里同时跑起每个平台真实的解析和绘制代码,用同一个文件、同一时刻做对比。这篇教程把 SVGA 预览页面上的每一块都过一遍。

第一步:加载文件

SVGA 预览页面顶部是文件输入区。你可以把 .svga 文件拖进去或点击选择文件,也可以直接载入一个文件直链(下一步详细讲),或者点击四个内置样例中的任意一个,不用自己准备文件也能马上体验。每个样例都专门用来演示一类跨端差异:Matte 遮罩(只有支持 matte 合成的播放器才会渲染出精灵本应呈现的形状)、音频键名(内嵌音频只有部分播放器会准备好播放)、布局尺寸不一致(精灵的布局框和它的位图尺寸对不上)、旧版 1.x(一些较新的播放器已经不再支持的老版本 SVGA 格式)。所有处理都发生在你本地的浏览器标签页里,不会上传到任何地方。

文件输入区,包含上传、直链和样例文件三种方式
上传本地文件、载入直链,或选择一个内置样例

这篇教程用一个真实的礼物动画来演示,而不是内置样例——因为它展示的是真实生产环境里的 bug 长什么样:远没有形状渲染错误那么明显,而这恰恰是这个页面存在的意义。

第二步:用直链加载文件

除了上传,你也可以直接在 URL 输入框里粘贴一个直链,点击载入链接。只要对方服务器允许浏览器发起 CORS 请求,任何 .svga 直链都可以这样加载——这里没有服务端代理帮你转发请求,所以如果对方服务器屏蔽跨域请求,就是加载不出来。这个方式很适合直接从 CDN 或同事分享的链接拉取文件,不用先存到本地磁盘。

URL 输入框里已经填好一个 .svga 文件的直链,准备加载
粘贴一个直链,点击载入链接

第三步:查看文件信息

文件加载后,文件信息面板会展示原始尺寸、文件体积、帧数、FPS、播放时长、预估运行时内存、位图数量,以及 SVGA 格式版本(1.x 或 2.x)。在深入研究渲染表现之前,先在这里做一次快速体检。

文件信息面板展示尺寸、帧数、FPS、时长和格式版本
已加载文件的尺寸、帧数、FPS、时长和格式版本

第四步:双栏对比两个播放器

同步对比舞台默认是双栏视图:两个面板,各自带一个平台下拉框,同步播放。六个画像——SVGAPlayer-Web、SVGAPlayer-Web-Lite、Android、iOS、Flutter,以及 SVGA DIY 自己的渲染器——任选两个,用下方的共享时间轴拖动或播放,逐帧对比。

用默认的 SVGAPlayer-Web 对 SVGAPlayer-Web-Lite 组合对比这个文件——一款狮子造型的礼物动画——两个面板乍一看完全一样。这很真实:大多数跨端差异都不像"渲染成了错误的形状"那么显眼,光靠肉眼对比两个面板恰恰会漏掉这类问题。接下来两步会展示怎么抓出肉眼看不出来的差异。

双栏对比 SVGAPlayer-Web 和 SVGAPlayer-Web-Lite 渲染同一款狮子造型礼物动画;两个面板乍看完全一样
SVGAPlayer-Web 和 SVGAPlayer-Web-Lite 并排对比——目前还看不出差异

第五步:逐帧精确定位

两个面板下方的播放控制条,除了播放按钮和共享时间轴,还有上一帧下一帧按钮。当某个差异只出现在特定一帧——一次转场、一道扫过去的高光、一个形状短暂变化——逐帧前进比拖动滑杆或等播放循环回来精确得多。右侧的帧数读数会一直显示你当前具体停在第几帧。

向前逐帧点击几次之后的播放控制条,展示帧数读数和滑杆位置
上一帧/下一帧按钮让你一次只前进一帧

第六步:用像素差异量化差别

这一步两个面板才真正开始显出不一样。点击像素差异(只在双栏视图下可用),两个渲染结果会叠加对比,每一个不一致的像素都会被高亮标成洋红色——不管差异出在颜色还是透明度上都是同一个颜色——工具栏上还会实时显示差异像素的具体数量。Lite 那一侧的角色边缘会出现一圈细细的洋红色轮廓:两个库在渲染这个文件边缘时确实存在真实的差异,刚才还完全看不出来,现在一眼就能看见。

像素差异叠加视图,在 SVGAPlayer-Web-Lite 面板的角色边缘显示一圈细细的洋红色轮廓,并统计差异像素数量
像素差异在 Lite 面板上显出一圈洋红色轮廓——普通双栏视图下完全看不出来,这里却真实可见、可统计

第七步:一次对比全部六个平台

点击全部平台,对比舞台会展开成六宫格——每个画像同时渲染同一个文件、同一帧。上一步那圈边缘差异太细微,放到六宫格里根本看不出来(它只有在双栏专属的像素差异模式下才会显形),所以这一帧六个面板看起来都是一致的——这就是老实的结果,但这个视图依然有用:如果差异大到肉眼可见(比如某个效果整个丢失,或者布局完全对不上),一次性扫一遍全部实现正是抓这类问题的办法。六路实时渲染的开销比双栏大得多,所以工具会提示:不需要同时看六个的时候,双栏视图内存占用更低、检查也更流畅。

SVGA 预览六宫格同时对比全部平台,渲染同一款狮子造型礼物动画;这一帧六个平台看起来都一致
六个平台并排同时渲染同一帧

第八步:读懂兼容体检报告

兼容体检报告面板会对加载的文件跑一组自动检查,把真实检出的问题列出来,每条都带严重程度标签、通俗易懂的说明,以及具体受影响的平台。这个文件一共检出了 38 条——这是和上一步像素差异发现的问题完全独立的另一个发现,也正好说明这个面板存在的意义:它检出部分帧在协议层缺失了显式的透明度数值,导致 Android 和 iOS 有可能推断出和作者原意不同的默认值。Android 和 iOS 在这里是根据真实源码模拟出来的,并不是真的在你的浏览器里跑起来——所以这是一类只有兼容体检报告才能抓到、而两个真实渲染的播放器之间做像素对比永远抓不到的问题。不是每个文件都会有问题——如果没有检出任何问题,面板会直接告诉你;但这个文件恰好提醒了一件事:一个文件看起来完全正常,也可能藏着真实的、可检测出来的 bug。

兼容体检报告检出 38 条 "Frame alpha is absent" 错误,列出受影响平台和修复入口
38 条真实检出的问题:部分帧在协议层缺失显式透明度数值,影响 Android 和 iOS

每条问题卡片上都有一个用修改器打开并修复按钮。它只是跳转到 SVGA DIY 修改器的一个快捷方式——值得知道的是它只会打开一个全新的修改器页面,并不会自动把当前加载的文件带过去,到了修改器里还需要重新加载一次同一个文件。

第九步:选择背景和画布尺寸

右侧的画布设置面板控制的是对比舞台本身的呈现方式,和文件内容无关。背景可以切换成透明棋盘格、白色、黑色,或者用旁边的取色器选一个自定义颜色。画布尺寸提供三个设备预设——iPhone 15 Pro、iPhone SE、Pixel 8——你也可以自己填一个精确的宽度高度,单边最大到 4096px。切换成白色背景加 iPhone 15 Pro 预设,立刻就能看到默认棋盘格正方形看不出来的东西:在一块真实的、纵向的手机屏幕上,图案周围到底空出了多少空白。

画布设置面板选择白色背景和 iPhone 15 Pro 尺寸,展示留白后的效果
白色背景配合真实手机尺寸,能看清默认状态下图案周围有多少空白

第十步:匹配真实画布比例和缩放模式

画布尺寸下方是画布比例快捷按钮(9:16、16:9、1:1、4:3),一键把画布调整成常见比例——保留当前宽度,自动算出对应高度——和上面的设备预设是相互独立的两套工具。把它和缩放模式搭配使用:等比适应会把内容完整装进画布、四周留白;拉伸填充会把内容强行拉伸铺满整个画布(比例被破坏);等比填充则是把内容放大到刚好盖满整个画布,多出来的部分被裁掉——和 CSS 里的 background-size: cover 是同一个取舍。切换成 16:9 的画布并选择等比填充,图案的上下两端会被裁掉,让画面刚好铺满这个宽画布,而不是像等比适应那样留白。

画布设置面板选择 16:9 画布比例和等比填充,展示图案被裁切以铺满宽画布
16:9 加等比填充会裁掉图案的上下两端以完全铺满画布,而不是留白

第十一步:浏览完整兼容矩阵

/preview 页面再往下滚动,还有一份完整的 SVGA 播放器兼容矩阵,记录了这个工具会检查的每一项能力——matte 遮罩、.matte 后缀约定、旧版 SVGA 1.x 支持、内嵌音频、矢量图形处理等等——覆盖全部五个真实播放器。每个单元格都写明核实状态(支持、部分支持或不支持)、通俗易懂的实现说明,以及一个指向具体核实用的源码文件和行号的链接。这张表很宽,需要横向滚动才能看全所有平台;它更像是一份参考资料而不是需要操作的工具,但每当你需要确认某项能力到底支不支持时,它都在那里。

兼容矩阵表格展示能力行、核实状态,以及两个平台的出处引用
每个单元格都引用了用于核实这项能力的具体源码文件和行号

以上就是 SVGA 预览 的全部——不需要账号,不需要上传,你加载的每一个文件都只停留在浏览器标签页里。