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