DXライブラリでのFPS制御
Posted: 2012年1月19日(木) 19:39
ScreenFlip関数を使えばディスプレイの更新にあわせて
更新してくれますがリフレッシュレートが60でない場合も
あるので手動で調節したいと思っています
いろいろ調べてみたところ次のフレームを処理するまでの間を
Sleep関数で処理をとめるようなのですがここで疑問があります
まず
60HZでは16.666667ms
80HZでは12.5ms
ごとに画面が更新されます
つまり更新タイミングは
60HZ:16,33,49,66,83
80HZ:12,25,37,50,62
です
fpsを60にしたいときは、
処理が3msのときに完了したとしたら16msまでSleepします
しかし80HZのディスプレイだとScreenFlipを行なっても
ディスプレイの更新が25msなので9ms待つことになります
これではSleepの13msと9msの22ms待つことになり
無駄に待っているし、次は33msまでSleepなので8msしか処理する
時間がないことになります
処理できたとしても次の画面更新が37msなので12.5msの間隔となり
60fpsを保っているとは言えないと思うのですがこの方法でfpsを
制御できてるといえるのでしょうか?
また、60HZのディスプレイでの場合でも
ディスプレイの更新が
16,33,49,66,83・・・
としてCPUが基準となる時刻を取得したのが
20のときとすると、
フレーム制御の部分では20+16.6666で36msまでSleepさせることになります
そしてScreenFlipで49msまでの13ms間も待機することになり、
次は20+16.6666x2の53msまでなので4ms間しか処理や描画をする時間が
ありません
基準となる時間は1秒ごとにとり直しているので常にというわけではないですが
このようなことが起きる可能性があると思うのですが基準となる時間を
ScreenFlipの直前にするようにする、というような処理を入れなくても
fpsが安定するものなのでしょうか?
fps制御の考え方は同じサイト内の
http://dixq.net/rp/43.html
を主に参考にしました
あと、ついでにFPS制御とは関係ない部分ですが質問したいことがあります
次のようなコードがあります
これのa=0はforの中で使うためなのでforの初期化のところに入れたいのですが
入れて
[code=Cpp]
for(int i=0,a=0;i<10;i++){
[/code]
このようにするとaもfor内での宣言とみなされてmainで宣言したaに反映されません
intを先に書いてはいけないのかと思い
[code=Cpp]
for(a=0, int i=0;i<10;i++){
[/code]
このように書くと、この場所にintは書けない のようなコンパイルエラーになります
forの初期化部分でintなどを宣言する場合はすでにある変数の値を変更できないのでしょうか?
長文失礼しましたm(__)m
更新してくれますがリフレッシュレートが60でない場合も
あるので手動で調節したいと思っています
いろいろ調べてみたところ次のフレームを処理するまでの間を
Sleep関数で処理をとめるようなのですがここで疑問があります
まず
60HZでは16.666667ms
80HZでは12.5ms
ごとに画面が更新されます
つまり更新タイミングは
60HZ:16,33,49,66,83
80HZ:12,25,37,50,62
です
fpsを60にしたいときは、
処理が3msのときに完了したとしたら16msまでSleepします
しかし80HZのディスプレイだとScreenFlipを行なっても
ディスプレイの更新が25msなので9ms待つことになります
これではSleepの13msと9msの22ms待つことになり
無駄に待っているし、次は33msまでSleepなので8msしか処理する
時間がないことになります
処理できたとしても次の画面更新が37msなので12.5msの間隔となり
60fpsを保っているとは言えないと思うのですがこの方法でfpsを
制御できてるといえるのでしょうか?
また、60HZのディスプレイでの場合でも
ディスプレイの更新が
16,33,49,66,83・・・
としてCPUが基準となる時刻を取得したのが
20のときとすると、
フレーム制御の部分では20+16.6666で36msまでSleepさせることになります
そしてScreenFlipで49msまでの13ms間も待機することになり、
次は20+16.6666x2の53msまでなので4ms間しか処理や描画をする時間が
ありません
基準となる時間は1秒ごとにとり直しているので常にというわけではないですが
このようなことが起きる可能性があると思うのですが基準となる時間を
ScreenFlipの直前にするようにする、というような処理を入れなくても
fpsが安定するものなのでしょうか?
fps制御の考え方は同じサイト内の
http://dixq.net/rp/43.html
を主に参考にしました
あと、ついでにFPS制御とは関係ない部分ですが質問したいことがあります
次のようなコードがあります
これのa=0はforの中で使うためなのでforの初期化のところに入れたいのですが
入れて
[code=Cpp]
for(int i=0,a=0;i<10;i++){
[/code]
このようにするとaもfor内での宣言とみなされてmainで宣言したaに反映されません
intを先に書いてはいけないのかと思い
[code=Cpp]
for(a=0, int i=0;i<10;i++){
[/code]
このように書くと、この場所にintは書けない のようなコンパイルエラーになります
forの初期化部分でintなどを宣言する場合はすでにある変数の値を変更できないのでしょうか?
長文失礼しましたm(__)m