>これはつまり、前回のhgsyncからの時間ではなく、単純に指定した時間だけ
> ウェイトを取っている、ということなのでしょうか?
そこまでは酷くないがメイン処理で時間食うと時間待ちの誤差か何かが増える感じ
hgimg3の場合いまだにawaitは精度が低いままなのでhgsyncの代わりに使う事も出来ない
>1ループにかかった時間を計測し、その差分だけウェイトを取るといった処理を
> 自前で実装するしかないのでしょうか?
なるべく安定させたいならそうなる
その時もhgsyncでのウェイトは使えない
//FPS固定取得モジュール
#module
#uselib "winmm.dll"
#cfunc _timeGetTime "timeGetTime"
#func _timeBeginPeriod "timeBeginPeriod" sptr
#func _timeEndPeriod "timeEndPeriod" sptr
#uselib "KERNEL32.DLL"
#func global _Sleep "Sleep" sptr
#deffunc timeEndPeriod onexit //タイマー精度を戻す(終了時に自動で呼びだされる)
if tbp {_timeEndPeriod tbp}
return
#deffunc SetFps double fps
if tbp=0{tbp=1 : _timeBeginPeriod tbp} //タイマー精度変更
f_tim=1000.0/fps //1フレームの時間
ms_tim=_timeGetTime() //スタート時間(d3timer()-ms_timでスタートからの時間にする)
fs_tim=0.0 //フレームスタート時間
return f_tim
#deffunc GetFps var fps
to=t
fps_cnt+
fs_tim+f_tim //1フレームの時間を足して次フレームスタート時間にする
await 0//Sleepはawaitの代わりにならないので必ず何処かでawaitが必要
sms=fs_tim-(_timeGetTime()-ms_tim) //次フレームスタート時間からスタートからの時間を引いてスリープ時間にする(結果が負数なら1フレームの時間を越えた)
if sms < 0 {fs_tim-sms} //1フレームの時間以上使用したからオーバー分をフレームスタート時間に加算
_Sleep limit(sms,0,f_tim+1) //小数点以下のスリープは出来ないから最大スリープ時間をf_tim+1にする
t=_timeGetTime()/1000
if t ! to {fps=fps_cnt:fps_cnt=0}
return int(f_tim-sms)
#global
//モジュールここまで
#include "hgimg3.as"
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
addxfile m_xmodel,dir_exe+"\\sample\\hgimg3\\font_a.x" ; モデルを読み込む
regobj obj, m_xmodel ; オブジェクトの登録
clscolor $80 ; 背景色の設定
//使用サンプル
//FPSを設定
SetFps 60
*rep
repeat 100000 //適当な負荷をかける
temp=cnt
loop
stick key,$3ff
if key&128 : goto *owari
if key&4 : addpos HGOBJ_CAMERA, -0.2, 0.0
if key&1 : addpos HGOBJ_CAMERA, 0.2, 0.0
if key&2 : addpos HGOBJ_CAMERA, 0.0, 0.2
if key&8 : addpos HGOBJ_CAMERA, 0.0, -0.2
addang obj,0,0.05,0
hgdraw ; 描画
fprt "fps"+fps+" ms"+ms,8,8
GetFps fps //指定FPSになるようにawaitして実際のFpsを返す
ms=stat //statにGetFps抜けてからGetFps実行時までの時間をmsで返す
hgsync 0 ; 時間待ちを0に指定
goto*rep
*owari
end
後はモニターのリフレッシュレートに合わせる方法
mod_d3d9vsync(ティアリングを無くしFPS安定化)の更新と、ヘルプ
http://hsp.tv/play/pforum.php?mode=pastwch&num=53549