OSがVista以上かどうかで原因が異なる
XPならティアリングが原因
キャラの位置にティアリングが発生するとカクついてるように見える
(awaitだけで待つとティアリングの位置がずれてくので定期的にカクつくように見える)
ティアリングの位置を有る程度固定するモジュール(ディスプレイのリフレッシュレートとFPSが同じ時)
//指定FPSになるようにawaitするモジュール
#module
#uselib "winmm.dll"
#cfunc _timeGetTime "timeGetTime"
#func _timeBeginPeriod "timeBeginPeriod" sptr
#func _timeEndPeriod "timeEndPeriod" sptr
#deffunc timeEndPeriod onexit //タイマー精度を戻す(終了時に自動で呼びだされる)
if tbp {_timeEndPeriod tbp}
return
//SetFps 設定するフレームレート
#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
//GetFps フレームレート取得する変数
#deffunc GetFps var fps
to=t
fps_cnt+
fs_tim+f_tim //1フレームの時間を足して次フレームスタート時間にする
sms=fs_tim-(_timeGetTime()-ms_tim) //次フレームスタート時間からスタートからの時間を引いてawait時間にする(結果が負数なら1フレームの時間を越えた)
if sms < 0 {fs_tim-sms} //1フレームの時間以上使用したからオーバー分をフレームスタート時間に加算
await limit(sms,0,f_tim+1) //小数点以下のawaitは出来ないから最大await時間をf_tim+1にする
t=_timeGetTime()/1000
if t ! to {fps=fps_cnt:fps_cnt=0}
return int(f_tim-sms)
#global
//使用サンプル
//FPSを設定
SetFps 60
*rep
redraw 0
color 255,255,255:boxf
if s=0:xx+10:else:xx-10
if xx<0:s=0:else:if xx>590:s=1
color:boxf xx,0,xx+50,480
stick key,15
if Key&1 : x-=5
if Key&2 : y-=5
if Key&4 : x+=5
if Key&8 : y+=5
color : font "",30 : pos x,y : mes "凸"
pos 5,5:mes"fps:"+fps+" ms:"+ms
GetFps fps //指定FPSになるようにawaitして実際のFSPを返す
ms=stat //statにGetFps抜けてからGetFps実行時までの時間をmsで返す
redraw 1
goto*rep
タイトルバーをクリックすると動作が停止するので
放したとき時間は進んでるのでティアリング位置が変る
画面内にティアリングを発生させないようにするのがNO.54787に出されてるモジュール
>kanahironさんの教えてくださったモジュールが興味深いのですが、まだ未熟なためそれを使用するには時間がかかりそうです・・・
http://hsp.tv/play/pforum.php?mode=pastwch&num=46392
に使用サンプル
一応Vista以上でも安定化に効果あるらしい・・・