This is a normal mishap, GIFs specify the display time for a frame in units of 10 milliseconds. But timers on Windows, by default, are not sufficiently accurate to time intervals that low. Timers are updated by the system clock interrupt, it ticks 64 times per second by default. Giving timers an accuracy no better than 15.625 milliseconds. In effect, your GIF will playback at 2/3rd speed, give or take.
You can change the outcome by starting another program, like Windows Media Player or a browser like Firefox or Chrome. And you'll suddenly see your GIF playing back at design speed.
You'll have to do the same thing these programs do, alter the clock interrupt rate to get consistent playback speeds. You need to pinvoke timeBeginPeriod, pass 10 to improve the timer accuracy to 10 milliseconds. You may need to go lower if your UI thread isn't responsive and starts the timer too late. Be sure to pinvoke timeEndPeriod() again when you no longer need the playback, typically in the FormClosed event handler.
Boilerplate code:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
timeBeginPeriod(timerAccuracy);
}
protected override void OnFormClosed(FormClosedEventArgs e) {
timeEndPeriod(timerAccuracy);
base.OnFormClosed(e);
}
// Pinvoke:
private const int timerAccuracy = 10;
[System.Runtime.InteropServices.DllImport("winmm.dll")]
private static extern int timeBeginPeriod(int msec);
[System.Runtime.InteropServices.DllImport("winmm.dll")]
public static extern int timeEndPeriod(int msec);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…