レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
おちゃめくらぶ掲示板
-
レスにょ
チラシ裏次郎さんへ
>何もしなければ周期が乱れる時期と整う時期が交互に現れますが、
>周期が整っている時期にフタを開閉すると
>意図的に乱れを引き起こせる・・・?
こんな方法は私は全く考えもしなかったにょ。
確かに面白い方法ではあるけどここからスリープのフレーム数を割り出すのは困難にょ。
あとBGMPLAYは内部の1/60秒ごとの割り込みで制御されていると思うのでここから割り出す
ことができてもMAINCNTLから求めるのと同一の値が出ると思うにょ。
>MAINCNTLが増える瞬間と秒が増える瞬間と
>その判定のしかたがキモですよね
私が動作検証した結果、MAINCNTLが増えるタイミングはVSYNCのタイミングで秒が増える
タイミングはVSYNCとは無関係であることが判明したにょ。
つまり、MAINCNTLの値は変わらなくても秒数は変わるという場合もあるためTIME$の読み
出しはVSYNC 1の直後に設定する必要があるにょ。
>2/60秒だけスリープしたとして、それを知ることが出来るのは
>最も遅い場合で約1秒後になるのかな
スリープが行われたかどうかは開いてから最長で約1秒後に分かると思っていたけれど実際に
いろいろ試しているうちに1フレームで判断可能なことが分かったにょ。
FOR I=0TO 1:WAIT 1:GCLS:A=B:B=MAINCNTL:I=B-A==2:NEXT:GCLS 2
これを実行すれば画面に何も表示されないけどスリープが行われたら画面が赤くなるにょ。
こんな感じでMAINCNTLのカウントの進み方だけを見ればTIME$を使わなくても「スリープ
したかどうか」というのは簡単に分かるにょ。
これはスリープ復帰直後はMAINCNTLのカウンタが1フレームに1カウントではなく1フレームの
間に2カウント進んでしまうことを利用したものにょ。
一種の処理落ち状態となってしまうわけでこれはGCLSという適度な負荷があって初めて
成立するにょ。(GCLSくらいの負荷がないと処理落ちはしないのでFOR〜NEXTのループで
いえば80回ループくらいがボーダーラインとなる)
ただし、スリープの時間をフレーム単位で取得するためにははTIME$を併用してスリープする
前から2回秒数が変わったときのMAINCNTLの値が必要になるにょ。(約1秒)
それを元に先日のスリープ時間取得ルーチンを作り直してみたけど少し長くなってしまった
のである程度リスト短縮ができ、十分な動作確認をしたのちに正式公開するにょ。(上記の
プログラムを実行して見て分かるようにスリープから復帰した時はMAINCNTLの挙動が不安定
であるため動作が上手くいくときと上手くいかないときが出てしまう)
リスト短縮は無理にする必要もないけど初出時に「すでに発表されているものよりも短い」
ということをウリにしていためある程度は短くする必要があると考えているにょ。
|
|
|
掲示板管理者へ連絡
無料レンタル掲示板