精灵图 · 实测
GIF 转精灵图:导入之前,先让 AI 检查每一帧

GIF 适合用来分享动画,却不适合直接放进游戏。Godot、Unity 和 Phaser 这类游戏引擎要的是精灵图:所有帧排在大小相同的格子里,保持美术的真实像素尺寸,外加每一帧在屏幕上停留的时间。GIF 还会把问题藏起来,直到动画在游戏里循环播放时才暴露:某一帧重复了,某一帧偏了一个像素,停顿放错了位置。
2026年9月30日,我们把一段 7 帧的史莱姆跳跃 GIF 交给 Ciyo Agent(Ciyo 智能体),请它做成可以导入的精灵图。它读取了每一帧,找出三个循环问题,并在我们要求后把它们修好了。每个文件我们都亲自检查过。
游戏引擎需要你的 GIF 提供什么
三样东西:原始尺寸的帧,排在大小相同的格子里;帧的尺寸和数量;以及每一帧的时长。原始尺寸就是画师作画时的尺寸。很多像素画 GIF 会以 4×、6× 或 8× 导出,好在社交媒体上显得好看;按这个尺寸导入既浪费内存,缩放时还会变模糊。
Ciyo 里的智能体能读取所附 GIF 的每一帧。这一点很重要,因为人以正常速度来回拖动 GIF 时,不会注意到某一帧偏了一个像素。
| 要求 | 原因 |
|---|---|
| 原始像素尺寸 | 一个文件像素对应一个美术像素;任何整数倍放大都清晰 |
| 一行大小相同的格子 | 引擎按格子尺寸切分精灵图 |
| 透明背景 | 不需要抠色,也没有杂边 |
| 每一帧的时长 | GIF 各帧的延迟常常不一样 |
| 逐帧检查 | 重复帧和抖动只有在循环播放时才看得出来 |
我们的测试 GIF:一款虚构平台跳跃游戏里的史莱姆跳跃
我们为虚构的平台跳跃游戏 Tumblebrook 做了一段小小的测试 GIF:一只绿色史莱姆压扁、起跳、落地。它是 192 × 192 像素、7 帧、4 种颜色,实际上是 32 × 32 的美术放大正好 6× 导出的。各帧延迟从 80 到 200 毫秒不等,这很常见。
我们故意把其中一帧向右移了一个美术像素,看智能体能不能发现。这段 GIF 的最后还多了一张第一帧的副本,这是我们没有安排的。
这段 GIF 是 Tumblebrook 的跳跃动画,这是我用 Godot 做的一款小型平台跳跃游戏。请把它转成我能导入的精灵图:一行、格子大小相同、透明背景、使用美术的原始像素尺寸(不是 6x 导出的尺寸)。在做之前,请先看每一帧,告诉我帧数、每帧的延迟,以及循环时任何会显得不对的地方。把精灵图和一个写有帧尺寸与时长的 JSON 文件保存到画板上。智能体在 7 帧里发现了什么
智能体确认 192 能被 6 整除,确认原始尺寸是 32 × 32,然后做出一张 224 × 32 的精灵图:一行七个格子,背景透明,没有混色的边缘像素。它列出了各帧延迟:120、80、80、80、200、80 和 140 毫秒。
接着它报告了三个问题,三个都是真的。最后一帧“pixel-for-pixel the same as frame 0”(和第 0 帧逐像素完全相同),所以静止姿势会在屏幕上停留 260 ms,“the hop will seem to stall at the landing”(跳跃在落地时会显得卡住)。第 5 帧是第 3 帧的副本,“moved 1 px right and 2 px down”(向右移了 1 px、向下移了 2 px),中心在 x = 17 而不是 16,所以史莱姆会向旁边抽动一下。另外,第 5 帧在下落时沿用了上升的姿势,所以底边会跳 4 个像素进入落地帧。
它也说明了自己做不到的事:画板只接受图片和视频,所以它没法把 .json 文件存到画板上。它提出改为把 JSON 贴在聊天里。

先修好循环,再导出
我们请它做一张修好的精灵图。动笔之前,智能体先研究了现有的帧,弄清它们在描边、转角、明暗和高光上的规律。它甚至纠正了自己(“Highlight sits one pixel further in than I assumed”,即高光比我原先以为的再往里一个像素),并通过逐像素重建三张原始帧来证明这些规律没错。
修好的精灵图有六帧。重复帧去掉了,每一帧的中心都在 x = 16,新加的拉长下落姿势是 13 × 19 像素,它下落 3 个像素进入落地帧,而不是跳 4 个像素。现在一个完整循环是 640 ms。智能体还提醒,静止姿势变短了(120 ms,原来是 260 ms),如果跳跃显得太急可以调整。没有花任何额度。

好的,请做修好的精灵图。去掉重复的那一帧,把第 5 帧放回中心,给落地换上一个真正拉长的下落姿势,不要沿用上升的那一帧。保持同样的 4 种颜色和 32x32 的格子。然后把 Godot 可用的 JSON 贴在这里(帧尺寸、帧数、每帧时长),再把修好的循环保存成一个 6x 的预览 GIF,让我看一看。JSON 和 Godot 设置
智能体贴出了一段 JSON,里面有图片名称、精灵图尺寸(192 × 32)、帧尺寸(32 × 32)、一行六帧、每帧的区域和以毫秒计的时长,以及供 Godot 使用的相对时长。由于每个延迟都是 40 ms 的倍数,它建议用一个 25 帧每秒的 SpriteFrames 动画,相对时长为 3、2、2、2、5 和 2,并使用最近邻过滤,让像素保持清晰。
把 JSON 和 PNG 放在项目里的同一个位置。如果你的引擎用别的格式,就直接点名要那种格式;真正重要的是帧列表。

导入任何精灵图之前的五项检查
不管精灵图来自 AI、转换工具还是你自己的导出,这几项检查都能抓住常见问题。最后一列是修好的 Tumblebrook 精灵图的结果。
| 检查项 | 方法 | 修好的精灵图 |
|---|---|---|
| 原始尺寸 | GIF 尺寸 ÷ 导出倍数是整数 | 192 ÷ 6 = 32 |
| 没有重复帧 | 把最后一帧和第一帧对比 | 重复帧已去掉 |
| 没有抖动 | 每个格子的中心(或脚底线)相同 | 六帧中心都是 x = 16 |
| 调色板 | 数颜色;背景是透明的 | 4 种颜色加透明 |
| 时长 | 列出每个延迟;检查静止姿势的长度 | 循环 640 ms,静止 120 ms |
2026-09-26 发布。作者用中文列出了 AI 生成精灵图的常见痛点:角色在帧与帧之间会变样,绿色或品红色背景会留下杂边,帧也对不齐网格。作者推荐用一个开源工具 sprite-gen 来做这件事。那是另一个产品、另一种工作流程;我们的测试显示了同样的三个风险,并逐一做了检查。
游戏美术的下一步
干净的精灵图进了引擎之后,用同一组帧画下一段动画,让风格保持一致,并在玩家实际看到的尺寸下检查精灵。
GIF 转精灵图
怎么找出 GIF 的原始像素尺寸?
用 GIF 的尺寸除以导出倍数,检查结果是不是整数。我们的 192 × 192 GIF 是 32 × 32 的美术放大 6× 得到的。智能体确认了每一帧都能被精确缩小。
为什么我的循环会卡顿或抽动?
通常是末尾多了一个重复帧(静止姿势在屏幕上停留的时间变成两倍),或者某一帧偏离中心一个像素。在我们的测试中,智能体通过对比每一帧把这两个问题都找了出来。
Ciyo 画板能存 JSON 文件吗?
不能。2026年9月30日时,画板只接受 png、jpg、webp、gif、mp4 和 mov,所以智能体把 JSON 贴在聊天里,由你自己保存。
这次花了多少钱?
在我们的测试中一分没花。读取帧、做两张精灵图、画新帧和预览 GIF,全都在智能体的工作区里完成,没有用到图像模型。
在 Ciyo 里检查你的 GIF
附上你的动画,告诉 Ciyo Agent 你用的引擎和导出倍数,请它在做精灵图之前先检查每一帧。