Read this post in english:
http://androgeek.info/?p=299
以前代碼經(jīng)驗(yàn)很多都是基于windows的,所以對(duì)android下面的計(jì)時(shí)函數(shù)不是太了解。
在寫
Friut3D時(shí),我用的代碼是用gettimeofday()來(lái)計(jì)時(shí)的。但是效果不好,游戲里有個(gè)場(chǎng)景跑起來(lái)十分卡,acepig兄和我都覺(jué)得這個(gè)問(wèn)題很詭異。開(kāi)始覺(jué)得這是模型的問(wèn)題,現(xiàn)在看來(lái)是計(jì)時(shí)函數(shù)不精確惹得禍。
看看當(dāng)時(shí)寫的獲取系統(tǒng)時(shí)間的代碼:
static long getTime(void)
{
gettimeofday(&now, NULL);
return (long)(now.tv_sec*1000 + now.tv_usec/1000);
}
今天在一個(gè)google討論組里得知gettimeofday()記得的tick是不準(zhǔn)確的。而這個(gè)游戲邏輯依賴于time delta來(lái)計(jì)算各個(gè)物體運(yùn)動(dòng),計(jì)時(shí)不精確,渲染自然會(huì)卡頓。
于是用納秒級(jí)的準(zhǔn)確度的clock_gettime()重寫了getTime()函數(shù):
static long _getTime(void)
{
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return now.tv_sec*1000000 + now.tv_nsec/1000;
}
改了計(jì)時(shí)函數(shù)后,游戲各個(gè)場(chǎng)景都流暢了。