java毫秒级抖动怎么处理,java - 16.66ms帧时间。 当sleep()仅持续整毫秒时,如何获得完美的60 fps? - 堆栈内存溢出...

对于Windows,大多数具有以固定频率运行的线程的游戏物理引擎都使用与此代码类似的东西。 延迟基于高频时钟的原始读数,以防止长时间内出现任何漂移。 此示例与Windows XP兼容,其中Sleep(1)最多可花费2ms(对于Windows的更高版本,Sleep(1)最多可花费1ms)。 如果延迟太长,则dwLateStep会增加(可选的诊断工具)。

/* code for a thread to run at fixed frequency */

typedef unsigned long long UI64; /* unsigned 64 bit int */

#define FREQ 400 /* frequency */

static DWORD dwLateStep; /* late step count */

LARGE_INTEGER liPerfTemp; /* used for query */

UI64 uFreq = FREQ; /* process frequency */

UI64 uOrig; /* original tick */

UI64 uWait; /* tick rate / freq */

UI64 uRem = 0; /* tick rate % freq */

UI64 uPrev; /* previous tick based on original tick */

UI64 uDelta; /* current tick - previous */

UI64 u2ms; /* 2ms of ticks */

UI64 i;

/* ... */ /* wait for some event to start thread */

timeBeginPeriod(1); /* set period to 1ms */

Sleep(128); /* wait for it to stabilize */

u2ms = ((UI64)(liPerfFreq.QuadPart)+499) / ((UI64)500);

QueryPerformanceCounter((PLARGE_INTEGER)&liPerfTemp);

uOrig = uPrev = liPerfTemp.QuadPart;

for(i = 0; i < (uFreq*30); i++){

/* update uWait and uRem based on uRem */

uWait = ((UI64)(liPerfFreq.QuadPart) + uRem) / uFreq;

uRem = ((UI64)(liPerfFreq.QuadPart) + uRem) % uFreq;

/* wait for uWait ticks */

while(1){

QueryPerformanceCounter((PLARGE_INTEGER)&liPerfTemp);

uDelta = (UI64)(liPerfTemp.QuadPart - uPrev);

if(uDelta >= uWait)

break;

if((uWait - uDelta) > u2ms)

Sleep(1);

}

if(uDelta >= (uWait*2))

dwLateStep += 1;

uPrev += uWait;

/* fixed frequency code goes here */

/* along with some type of break when done */

}

timeEndPeriod(1); /* restore period */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值