>なるほど...リフレッシュレートが関係しているかもなのですね。
ティアリングがカクついてるように見せてる(vistaからは違うらしい)
awaitの安定性にも問題あるかもしれないけど・・・
リフレーッシュレート60なら1フレームが16.6666・・・msになる
await 16だとredrawの切換が早くなり徐々にティアリングが起きる場所が上にずれる
#include"d3m.hsp"
*rep
redraw 0
color 255,255,255:boxf
color:boxf x,0,x+50,480
pos 5,5:mes"fps:"+d3getfps()
redraw 1
if s=0:x+10:else:x-10
if x<0:s=0:else:if x>590:s=1
await 16
goto*rep
こうすると分かりやすい
ティアリングを境に上側は前フレームの画像が見えてる
タイマーを利用してタイミングを計って
フレームの開始時間に合わせれば
ずれてくのを少なく出来る
#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
//何故か自分の環境だと常に1になっててtimeBeginPeriodの必要無くなってるけど・・・
if tbp=0{tbp=1 : _timeBeginPeriod tbp} //タイマー精度変更
f_tim=1000.0/fps //1フレームの時間
ms_tim=_timeGetTime() //スタート時間(_timeGetTime()-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
SetFps 60
*rep
redraw 0
color 255,255,255:boxf
color:boxf x,0,x+50,480
pos 5,5:mes"fps:"+fps+" ms:"+ms
GetFps fps
ms=stat
redraw 1
if s=0:x+10:else:x-10
if x<0:s=0:else:if x>590:s=1
goto*rep
それでもフレーム毎に1ms前後ずれるし
誤差も蓄積して徐々にずれる
タイトルバーをクリックしてる間はawait行でストップするのでティアリング位置が変る
>カク付くのがHSPだけじゃないのでまだ疑問だらけですが・・・
それはHspとは関係ない事だからWindowsの仕様
vista以上かDirectX(OpnGL等)を使わないと解決しない
vista以上でもティアリングは防げてもカクつきはどうかは知らない
DirectX使って良いなら
WinXP環境のウィンドウ描画でティアリング(チラツキや波打つ現象)を無くすモジュール
http://hsp.tv/play/pforum.php?mode=pastwch&num=46392