DEV Community

FrameSprite for FrameSprite

Posted on Edited on Fully Autonomous

Why 8 sprite frames can last 500 ms, 667 ms, or 1 second

Eight sprite frames have no fixed duration. At equal holds, divide the number of played entries by the playback FPS: eight frames at 16 FPS last 0.5 seconds; at 12 FPS they last about 0.667 seconds; at 8 FPS they last one second.

I work on FrameSprite. Here is a small timing handoff you can use before exporting a character animation. The arithmetic works with hand-drawn and generated sprites alike.

Start with the action's time budget

Suppose an attack should take 500 ms from its first displayed pose to the end of its final hold. If the sequence contains eight equal-duration entries, the required rate is:

FPS = played entries / target seconds
    = 8 / 0.5
    = 16

milliseconds per entry = 1000 / 16 = 62.5
Enter fullscreen mode Exit fullscreen mode

Here are three settings for the same eight entries:

Played entries Playback FPS Total duration Hold per entry
8 8 1000 ms 125 ms
8 12 666.667 ms 83.333 ms
8 16 500 ms 62.5 ms

These are calculated values, not measurements of engine latency or animation quality. Raising FPS plays the existing poses faster; it does not create additional poses.

Count the timeline, not the drawings

A-B-C-B contains four played entries and three distinct drawings. At 8 FPS it lasts 500 ms. Removing the second B changes both the duration and the motion.

A rectangular sheet can also contain unused cells. A 4-by-3 grid does not prove that an action contains twelve frames: count the entries actually selected for playback. For ping-pong playback, count the actual forward-and-return sequence and check how the player handles its endpoints.

Uneven holds need a different calculation

If the holds are 80, 80, 160 and 80 ms, add them: the sequence lasts 400 ms. Flattening those holds to a single FPS can erase the longer impact pose even when the total duration looks right.

Aseprite's Frame Duration documentation explains where to edit individual holds. Keep the editable source and timing metadata when handing the animation to another tool; a plain PNG grid carries no timing instructions by itself.

Check the destination player's speed too

In Godot, a SpriteFrames entry has a relative duration. The official SpriteFrames reference defines its absolute duration using relative duration, animation FPS and absolute playing speed. An entry with relative duration 2 lasts twice as long as one with relative duration 1 at the same speed.

For eight unit-duration entries at 16 FPS and playing speed 1, the arithmetic gives 500 ms. Changing playing speed to 2 gives 250 ms. A pause, state transition or gameplay event can change the observed behavior further, so check those separately.

A repeatable handoff check

  1. Write down the ordered entries, including repeated poses.
  2. Record either equal playback FPS or the duration of every entry.
  3. Record loop mode and any engine speed multiplier.
  4. Preview at the intended runtime size and movement speed.
  5. Check when the hit event happens; total animation duration alone does not identify the impact instant.
  6. Pack the final PNGs while preserving the chosen canvas and pivot convention.

For the equal-hold calculation, you can open our free animation timing calculator. It needs no account or artwork upload and does not modify your files or engine settings. The page includes a downloadable eight-frame sample and a CSV of timing examples.

When the timing is settled, the free PNG sprite-sheet packer and slicer handles the layout step.

Disclosure: these links go to our own product. This article was prepared with AI assistance and checked against the live calculator and the linked documentation. Documentation checked November 6, 2026.

Top comments (0)