虽然标题不太好,但我不知道该怎么取名。
无论如何,我正在使用long int
计算我的游戏中的总帧数(以便我可以计算平均FPS)。万一游戏持续时间非常长,我应该怎么做才能确保我的long int
不会超过其限制?如果它确实超过了限制会发生什么?
谢谢。
虽然标题不太好,但我不知道该怎么取名。
无论如何,我正在使用long int
计算我的游戏中的总帧数(以便我可以计算平均FPS)。万一游戏持续时间非常长,我应该怎么做才能确保我的long int
不会超过其限制?如果它确实超过了限制会发生什么?
谢谢。
extern volatile uint32_t counter;
uint32_t one_second_elapsed = counter + 1000;
while ( counter < one_second_elapsed ) do_something();
uint32_t start = counter;
while ( counter - start < 1000 ) do_something();
在进行算术运算时,您可以积极检查是否存在溢出。例如,SafeInt 可以为您完成此操作。当然,性能比 i++
差。
但是,如果您始终按一递增,则不太可能发生 32 位整数溢出。
long long
,或者一些高级数学库提供的动态长度整数。但对于这种情况来说,这并不值得。这只会使事情变得更慢、更复杂,总体上变得更糟,而没有任何收益。 - peoro最好使用少量帧的平均值。您提到要计算平均值,但实际上没有必要保留这么多样本来计算平均值。只需在一段较短的时间内(可以是10-50帧之间,我们通常使用16)保持帧时间的累加总和即可。然后,您可以使用该总和来计算每秒帧数的平均值。这种方法还有助于平滑帧时间报告,使数字不会跳动。但需要注意的是,如果平均时间太长,帧速率峰值将变得更加“隐藏”,这意味着如果那些帧仅偶尔发生,则可能更难以发现导致帧速率下降的帧。
我认为像这样的代码就足够了(以下是未经测试的代码):
// setup some variables once
const int Max_samples = 16; // keep at most 16 frametime samples
int FPS_Samples = 0;
int Current_sample = 0;
int Total_frametime = 0.0f;
float Frametimes[Max_samples];
for ( int i = 0; i < Max_samples; i++ ) {
Frametimes[i] = 0.0f;
那么当你计算帧时间时,你可以像这样做:
// current_frametime is the new frame time for this frame
Total_frametime -= Frametimes[Current_sample];
Total_frametime += current_frametime;
Frametimes[Current_sample] = current_frametime;
Current_sample = ( Current_sample + 1 ) % Max_samples; // move to next element in array
Frames_per_second = Max_samples / Total_frametime;
这只是一个初步版本,可能需要一些错误检查,但它能够传达基本思想。