You would use a single region attachment that is a transparent image behind the skeleton. When you export, whitespace stripping prevents the exported frames from being any larger than they normally would be.
There is no need to interpolate at runtime. Eg:
float deltaSeconds = 1 / 60f; // The seconds between frames.
float fps = 1 / 30f; // The FPS we want skeletons to use.
float remaining = 0; // The amount of unused time from the last frame.
float total = 0; // The animation time.
for (int i = 0; i < 10; i++) {
remaining += deltaSeconds;
float step = Math.round(remaining / fps) * fps;
remaining -= step;
total += step; // You would pass step to AnimationState update()
System.out.println(total + "s, frame " + total / fps);
}
Output:
0.033333335s, frame 1.0
0.033333335s, frame 1.0
0.06666667s, frame 2.0
0.06666667s, frame 2.0
0.10000001s, frame 3.0
0.10000001s, frame 3.0
0.13333334s, frame 4.0
0.13333334s, frame 4.0
0.16666667s, frame 5.0
0.16666667s, frame 5.0