HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0213
_hamyuuカク付き(コマ落ち?)について19解決


_hamyuu

リンク

2013/2/13(Wed) 11:22:53|NO.52359


#include"d3m.hsp" *rep redraw 0 color 255,255,255:boxf color:boxf x,215,x+50,215+50 pos 5,5:mes"fps:"+d3getfps() redraw 1 if s=0:x+2:else:x-2 if x<0:s=0:else:if x>590:s=1 await 16 goto*rep

これを実行してみるとスムーズに動いているようでよく見ると定間隔でカク付いているというか
行き詰まるような動きをしてしまいます。

DirectXを使って描画すれば一切カク付きませんが
それはそれとして置いておいてください。

PCによっては普通にスムーズに動くのですが、
家にあるPC4台で試したところ全てでカク付きました。
高スペックなPCほどカク付きがひどくて
古いPCほどスムーズに動く傾向がある気がします。
キャプチャしてプレーヤーで見てみるとカク付いていないので
実際に目で見てみるしか判断のしようがありません。

グラフィックドライバのバージョンによってもかなり左右されます。
GM45チップセットのPCの場合は2008年台のドライバを入れるとスムーズになることが分かっています。


カク付いていても分かってくれる人と分かってくれない人がいて、
2009年以降ずっと悩み続けています。(もう諦め掛けていますが・・・)

どんな些細な事でも構いません、思ったことなどがあれば何でも教えてください!



この記事に返信する


kanahiron

リンク

2013/2/13(Wed) 12:36:29|NO.52360

おそらくモニターのリフレッシュレートが関係していると思います
当方1280x1024@75fpsと1920x1080@60fpsのデュアルモニターなのですが、
ウィンドウをモニターとモニターの真ん中に置くとリフレッシュレートが60fpsの方だけ起きます


#module #deffunc hold60fps a++ if a != 3{ await 17 } else { a=0 await 16 } return #global
をスクリプトの最初に置き、
await 16を hold60fpsに置き換えてください
そうすると多少はまともになります

DirectXを使うとこの現象が起きないのは、DirectXを使うとモニターの垂直同期に合わせて
画面が更新されるためだとと思います



_hamyuu

リンク

2013/2/13(Wed) 20:15:31|NO.52366

kanahiron様
回答ありがとうございます。

>DirectXを使うとこの現象が起きないのは、DirectXを使うとモニターの垂直同期に合わせて
>画面が更新されるためだとと思います

なるほど...リフレッシュレートが関係しているかもなのですね。
モジュール使わせてもらったところ確かに多少滑らかになりました。
解決するまで使わせて頂きますね!
カク付くのがHSPだけじゃないのでまだ疑問だらけですが・・・
長年の悩みがやっと少し答えに近づいた気がします^^



暇人

リンク

2013/2/13(Wed) 22:17:26|NO.52368

>なるほど...リフレッシュレートが関係しているかもなのですね。
ティアリングがカクついてるように見せてる(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



晩御飯

リンク

2013/2/13(Wed) 22:29:25|NO.52369

>//何故か自分の環境だと常に1になっててtimeBeginPeriodの必要無くなってるけど・・・
timeBeginPeriodとtimeEndPeriodの設定は共有されるらしいから
他のアプリケーションでtimeBeginPeriod呼んでたら常に1になる・・・のかもしれない



暇人

リンク

2013/2/13(Wed) 22:39:05|NO.52370

>他のアプリケーションでtimeBeginPeriod呼んでたら常に1になる・・・のかもしれない
PC起動して最初にHSPエディタ開いて試しても変わりなし
1年ぐらい前はtimeBeginPeriod 1にしないとダメだったが・・・



晩御飯

リンク

2013/2/13(Wed) 22:54:44|NO.52371

まじか
勘違いだったわ



_hamyuu

リンク

2013/2/14(Thu) 00:45:10|NO.52376

暇人様
回答ありがとうございます。

>ティアリングがカクついてるように見せてる(vistaからは違うらしい)

なるほど、ティアリングと言う現象があるのですね。(ググりました)
OSについて書き忘れていましたが試したOSはXP、Vista、Win7です。
確かにXPだと映像がズレまくりますね。vista、7でもAeroを切ると同じでした。
でも有効にするとズレ(ティアリング)はなく、カク付くのでこれが原因ではなさそうですね。。

>DirectX使って良いなら
>WinXP環境のウィンドウ描画でティアリング(チラツキや波打つ現象)を無くすモジュール
>http://hsp.tv/play/pforum.php?mode=pastwch&num=46392

これはDirectXを使っていても標準命令の描画ができるんですか!?
Win7で試してみたところ1〜2秒の間隔で1回だけカク付くだけで済みました。
やっぱりリフレッシュレート関連の問題ですかね。
恐ろしく長いスクリプトで私には理解できませんが、すばらしいです!
おそれながら使わせて頂きます!



暇人

リンク

2013/2/14(Thu) 01:55:57|NO.52378

>でも有効にするとズレ(ティアリング)はなく、カク付くのでこれが原因ではなさそうですね。。
ティアリングを無くすために画面更新に垂直同期をとってるらしい
でもゲーム側は同期を取って無いので16.6msの間に2フレーム分の処理が出来たり
16.6msの間に間に合わないと次のフレームまでWin側が画面更新を待つ事になってカクつく

完全に同期が取れないとティアリングかカクつきかどちらかになる(目立たないように工夫は出来るだろうけど)
これはHspには関係なくPCとモニタの関係

>Win7で試してみたところ1〜2秒の間隔で1回だけカク付くだけで済みました。
XPsp3でしか試せてないから情報ありがとう
Aero有り無しで変化あるかな・・・

>恐ろしく長いスクリプトで私には理解できませんが、すばらしいです!
現在の水平走査線数を取得してウィンドウより下になるまでsleepって言う単純なものですけどね
下準備と使えなかった時の処理とか途中で水平走査線数が取得出来なくなったらとか考えたら長く・・・

>おそれながら使わせて頂きます!
お役に立てれば幸いです



_hamyuu

リンク

2013/2/14(Thu) 16:59:39|NO.52385

>完全に同期が取れないとティアリングかカクつきかどちらかになる(目立たないように工夫は出来るだろうけど
つまりはそういうことなのですね。
16.6msに完全に合わせられないとどちらかの現象が起こると!

>Aero有り無しで変化あるかな・・・
有りの時は大分スムーズになります。
無しにするとティアリングとカクつきが・・
XPだと完璧にスムーズでした。


詳しいご説明本当にありがとうございます。
すごく勉強になるとともに疑問がひとつ解けました。



暇人

リンク

2013/2/14(Thu) 19:20:22|NO.52386

>有りの時は大分スムーズになります。
>無しにするとティアリングとカクつきが・・
検証ありがとう
ちょっと予想と違う結果・・・

http://hsp.tv/play/pforum.php?mode=pastwch&num=46392
の最初の使用例実行したときの
タイトルに表示されてる数値と
RasterStatusの()内に二つある数値の右側の数値を
教えてもらえますか?

その右側の数値が0以外だったらウィンドウを縦に
移動した時にそれに合わせて数値が変化するかも教えて欲しい

何時でも良いんでAero有り無しの結果を出してくれるとありがたい・・・



_hamyuu

リンク

2013/2/14(Thu) 21:47:19|NO.52394

タイトルが60

RasterStatusの右は

ウインドウを一番上に持って来たときで 508
真ん中あたりで 660
下へ持っていって窓が画面外に触れるあたりで 800

Aero有り無しで変わりませんでした!
ちなみに解像度は1280x800です。



暇人

リンク

2013/2/14(Thu) 22:32:02|NO.52397

ありがとうございます

>ウインドウを一番上に持って来たときで 508
ラスター取得には問題無さそうですね
安定して同じ数値になってました?
あ、ティアリング起きる場所はウィンドウの下の方とか一定の場所?

>Aero有り無しで変わりませんでした!
無しの時はラスター取得出来てないからティアリング起きてるのかと思ったら違ったか・・・
ウィンドウがアクティブじゃ無いときは走査線監視OFFにするからティアリング起きるけど・・・



_hamyuu

リンク

2013/2/14(Thu) 23:16:07|NO.52398

>安定して同じ数値になってました?
>あ、ティアリング起きる場所はウィンドウの下の方とか一定の場所?

508に見えますがよくみるとブレる感じに509〜512にもなってます。
ティアリングはどの場所でも同じで起きます。
非アクティブにすると物凄いブレながら少しずつ数値が下がって行きますね。
Aero有り無しで数値は変わらない感じです。



暇人

リンク

2013/2/14(Thu) 23:39:29|NO.52399

度々ありがとう

>508に見えますがよくみるとブレる感じに509〜512にもなってます。
少しsleepの時間が余分に設定(解像度を元に自動設定)されてる感じだけど特に問題は無さそう

>ティアリングはどの場所でも同じで起きます。
なにもしなくてもティアリング位置はずれてったりします?
ずれてくならXPとは何か根本的に違ってそう・・・

>非アクティブにすると物凄いブレながら少しずつ数値が下がって行きますね。
タイマー式に切り替わりますからね
NO.52368に出したのと同じような処理になる



暇人

リンク

2013/2/14(Thu) 23:50:27|NO.52400

あ、後FPSは安定してるのかどうか聞きたかった



_hamyuu

リンク

2013/2/15(Fri) 08:14:36|NO.52404

>なにもしなくてもティアリング位置はずれてったりします?
何もしなくてもずれて行きます。

>あ、後FPSは安定してるのかどうか聞きたかった
FPSはAero有り無しともに常に60でたまに1秒だけ59になったりします。



暇人

リンク

2013/2/15(Fri) 21:14:13|NO.52414

>何もしなくてもずれて行きます。
DWMの関係なのかドライバの設定なのか
redraw 1したタイミングで更新してくれない感じ・・・

関係あるか分からないけど

Windows7/Vistaがゲーマーから避けられる要因
http://www.ouma.jp/ootake/delay-win7vista-j.html

>FPSはAero有り無しともに常に60でたまに1秒だけ59になったりします。
ありがとうございます
参考になりました。

ちょっと思ったのはAero有りの時に
↓のでFps60になるって事は無いよね・・・

#include"d3m.hsp" *rep redraw 0 if s=0:x+2:else:x-2 if x<0:s=0:else:if x>590:s=1 color 255,255,255:boxf color:boxf x,0,x+50,480 pos 5,5:mes"fps:"+d3getfps() await 10 redraw 1 goto*rep



_hamyuu

リンク

2013/2/15(Fri) 22:31:16|NO.52417

>Windows7/Vistaがゲーマーから避けられる要因
最大3フレーム遅れるんですか!知らなかったぁ
もしかすると関係してるのかな・・

>↓のでFps60になるって事は無いよね・・・
100fpsになりますねぇ
でも昔使っていたPC(Pentium4&core2&core i5)ではawait 1でも10でも60fpsになりましたね・・・
そのせいでawait 1で60fpsになるものなんだとつい最近まで誤解してましたw



暇人

リンク

2013/2/16(Sat) 00:04:55|NO.52421

>100fpsになりますねぇ
特に違いは無いんだねぇ
ありがとう

>でも昔使っていたPC(Pentium4&core2&core i5)ではawait 1でも10でも60fpsになりましたね・・・
昔のawaitがOS依存の精度だったからね



ONION software Copyright 1997-2023(c) All rights reserved.