精灵图 · 实测

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

一叠呈扇形展开的半透明象牙色纸片,上面有姿势不断变化的炭黑色小人,旁边是同样的纸片首尾相接排成一行,其中一张是琥珀色
原创抽象编辑插画,在 Ciyo 中用 GPT Image 2.5 Sunburst 生成。

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 发出的消息
这段 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 贴在聊天里。

Ciyo 画板上,史莱姆精灵图分别显示在品红色棋盘格背景和透明背景上,智能体面板列出重复的首帧、一个像素的抖动和生硬的落地
第一张精灵图和智能体的逐帧检查:首帧重复、1 像素抖动、落地生硬。2026年9月30日。

先修好循环,再导出

我们请它做一张修好的精灵图。动笔之前,智能体先研究了现有的帧,弄清它们在描边、转角、明暗和高光上的规律。它甚至纠正了自己(“Highlight sits one pixel further in than I assumed”,即高光比我原先以为的再往里一个像素),并通过逐像素重建三张原始帧来证明这些规律没错。

修好的精灵图有六帧。重复帧去掉了,每一帧的中心都在 x = 16,新加的拉长下落姿势是 13 × 19 像素,它下落 3 个像素进入落地帧,而不是跳 4 个像素。现在一个完整循环是 640 ms。智能体还提醒,静止姿势变短了(120 ms,原来是 260 ms),如果跳跃显得太急可以调整。没有花任何额度。

两行放大 8 倍的绿色像素史莱姆:上面是与 GIF 一致的七帧,下面是修好的六帧,其中有一个新的细高下落姿势
上:和原 GIF 完全一样的精灵图(224 × 32)。下:带新下落姿势的修好的精灵图(192 × 32)。以 8× 显示。
修复请求
好的,请做修好的精灵图。去掉重复的那一帧,把第 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 放在项目里的同一个位置。如果你的引擎用别的格式,就直接点名要那种格式;真正重要的是帧列表。

Ciyo 智能体面板显示贴出的 JSON,共六帧、总时长 640 ms,旁边画板上是旧精灵图、修好的精灵图和一张 6 倍预览
贴出的 JSON、Godot 建议,以及画板上修好的精灵图和它的 6× 预览 GIF。

导入任何精灵图之前的五项检查

不管精灵图来自 AI、转换工具还是你自己的导出,这几项检查都能抓住常见问题。最后一列是修好的 Tumblebrook 精灵图的结果。

精灵图检查项,以及我们 2026年9月30日修好的精灵图
检查项方法修好的精灵图
原始尺寸GIF 尺寸 ÷ 导出倍数是整数192 ÷ 6 = 32
没有重复帧把最后一帧和第一帧对比重复帧已去掉
没有抖动每个格子的中心(或脚底线)相同六帧中心都是 x = 16
调色板数颜色;背景是透明的4 种颜色加透明
时长列出每个延迟;检查静止姿势的长度循环 640 ms,静止 120 ms

游戏美术的下一步

干净的精灵图进了引擎之后,用同一组帧画下一段动画,让风格保持一致,并在玩家实际看到的尺寸下检查精灵。

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 你用的引擎和导出倍数,请它在做精灵图之前先检查每一帧。