この関数は、clock_gettime を使用して時刻を double として取得します。
// return current time in milliseconds
static double time_get_ms(void)
{
struct timespec res;
#ifdef ANDROID
clock_gettime(CLOCK_REALTIME_HR, &res);
#else
clock_gettime(CLOCK_REALTIME, &res);
#endif
return (double)(1000.0*res.tv_sec + res.tv_nsec/1e6);
}
シェーダーに送信するには、float への変換が必要です。仮数がオーバーフローしており、シェーダーへの途中で切り捨てられています。
例:
double として = 1330579093642.441895
float として = 1330579111936.000000
切り捨てが原因で、浮動小数点値が長時間 1 つの数値でスタックします。
また、res.tv_sec の秒の値も float に対して大きすぎるようで、GPU への途中で切り捨てられています。
アプリケーションの起動からの時間を測定しようとすると、同じ問題にすぐに遭遇します。
では、実行時間の値をシェーダーに取得する最良の方法は何でしょうか? Linux の世界ではクロス プラットフォーム (つまり、IOS、Android、Linux) です。