このことで多くのテストを行った後、ミリ秒の制限に余分なミリ秒が追加されている理由をまだ理解できません。
この場合、実行中のループ全体が 4000 ミリ秒続き、4000 に続いて他のデータが出力されますが、常に約 4013 ミリ秒かかります。
問題はストレステストではないことを現在知っています。ストレステストがなければ、まだ約4013ミリ秒です。また、ストレス テストにかかる時間には制限があり、残りの時間でどれだけのレンダリングを実行できるかによって時間は正当化されます。また、最初に呼び出されたときにのみタイミングを開始するため、変数を初期化する時間を含めて「SDL_GetTicks」ではないことも知っています。非常に軽量なナノ秒タイマーでもこれをテストしたため、関数を呼び出すのにかかる時間でもありません。結果は同じです。
これが私の結果の一部で、最後に印刷されています。
- 4013 100 993 40
- 4013 100 1000 40
- 4014 100 1000 40
- 4012 100 992 40
- 4015 100 985 40
- 4013 100 1000 40
- 4022 100 986 40
- 4014 100 1000 40
- 4017 100 993 40
3 番目の列 (レンダリングされたフレームの量) とは異なり、最初の列は、ループなどを終了するのにかかった数ナノ秒よりも大きく変化してはなりません。この場合、タイマーの範囲はミリ秒であるため、違いを示すべきではないことを意味します。それらすべての間で再コンパイルしましたが、リストはほとんど同じです。
コードは次のとおりです。
#include <iostream>
#include <SDL/SDL.h>
void stress(int n) {
n = n + n - n * n + n * n;
}
int main(int argc, char **argv) {
int running = 100,
timestart = 0, timestep = 0,
rendering = 0, logic = 0,
SDL_Init(SDL_INIT_EVERYTHING);
while(running--) { // - Running loop
timestart = SDL_GetTicks();
std::cout << "logic " << logic++ << std::endl;
for(int i = 0; i < 9779998; i++) { // - Stress testing
if(SDL_GetTicks() - timestart >= 30) { // - Maximum of 30 milliseconds spent running logic
break;
}
stress(i);
}
while(SDL_GetTicks() - timestart < 1) { // - Minimum of one millisecond to run through logic
;
}
timestep = SDL_GetTicks() - timestart;
while(40 > timestep) {
timestart = SDL_GetTicks();
std::cout << "rendering " << rendering++ << std::endl;
while(SDL_GetTicks() - timestart < 1) { // - Maximum of one rendering frame per millisecond
;
}
timestep += SDL_GetTicks() - timestart;
}
}
std::cout << SDL_GetTicks() << " " << logic << " " << rendering << " " << timestep << std::endl;
SDL_Quit();
return 0;
}