您可以使用与互斥锁关联的
循环计时器。这是IHMO做您想要的事的最有效方法。但是,然后您应该考虑跳过帧以防计算机延迟(您可以使用计时器代码中的另一个非阻塞互斥锁来做到这一点。)
编辑:一些伪代码来澄清
计时器代码:
While(true): if acquireIfPossible(mutexSkipRender): release(mutexSkipRender) release(mutexRender)
睡眠代码:
acquire(mutexSkipRender)acquire(mutexRender)release(mutexSkipRender)
起始值:
mutexSkipRender = 1mutexRender = 0
编辑 :更正了初始化值。
以下代码在Windows上运行良好(以50 fps的精度精确到毫秒地循环)
import java.util.Date;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.Semaphore;public class Main { public static void main(String[] args) throws InterruptedException { final Semaphore mutexRefresh = new Semaphore(0); final Semaphore mutexRefreshing = new Semaphore(1); int refresh = 0; Timer timRefresh = new Timer(); timRefresh.scheduleAtFixedRate(new TimerTask() { @Override public void run() { if(mutexRefreshing.tryAcquire()) { mutexRefreshing.release(); mutexRefresh.release(); } } }, 0, 1000/50); // The timer is started and configured for 50fps Date startDate = new Date(); while(true) { // Refreshing loop mutexRefresh.acquire(); mutexRefreshing.acquire(); // Refresh refresh += 1; if(refresh % 50 == 0) { Date endDate = new Date(); System.out.println(String.valueOf(50.0*1000/(endDate.getTime() - startDate.getTime())) + " fps."); startDate = new Date(); } mutexRefreshing.release(); } }}


