Try a loop with a call to sleep in it, which will reduce the CPU usage a bit. Example stuff over here from Ryan Geiss, the bloke behind a famous WinAmp visualization. It's in C, though . Remember that you'd use Int64s instead for QueryPerformanceCounter in Delphi, rather than fiddling with LARGE_INTEGER unions/structures as he's doing. Also, he doesn't mention in the section on timeGetTime whether he prefixed/postfixed his code with timeGetDevCaps + timeBeginPeriod and timeEndPeriod. These are necessary for accurate timing under NT - which he's not getting, suggesting that maybe he didn't do this (or maybe he did and timeGetTime just sucks...).

In a similar fashion, here's another article about locking the frame rate (see near the end, "Applying a Throttle". They might give you some ideas.

I've found that averaging a few times gives better results - especially for time-based motion. You might want to keep that in mind.