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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0305
近所の老人await で 正確な1秒5解決


近所の老人

リンク

2017/3/5(Sun) 15:24:59|NO.78364


*main redraw 0 color 255,255,255 : boxf : color 0,0,0 pos 0,0 : mes time if count \ 600 = 0 : time = time + 1 count = count + 1 redraw 1 await 1 goto *main
このスプリクトとを起動すると
一秒が早かったり遅かったりなります。
正確な1秒を測ることができないでしょうか?
わかりづらくてすみません。



この記事に返信する


近所の老人

リンク

2017/3/5(Sun) 15:33:54|NO.78365

追加
マウスの座標を使ってオブジェクト無しのボタンを使いたいんで
wait 100などは使いたくありません。



空気

リンク

2017/3/5(Sun) 16:48:21|NO.78366

恐らく、await 1の場合、HSPのタイマーが出せる精度を超えていると思われますので、
一般的な画面の周波数60Hzに合わせて、1000ms / 60fps = 16.666666....(ms)。
割り切れませんが、16msで1回待機させ、17msで2回待機させると、全く問題無い精度が出せます。
リアルタイム性が問われるアクションゲームやシューティングゲーム等でも60fpsで動作していますので、
マウスの座標を使ったオブジェクト無しのボタンもほぼラグなしで操作可能です。

記述例

*main redraw 0 color 255,255,255 : boxf : color 0,0,0 if count \ 60 = 0 : time = time + 1 pos 0,0 : mes time - 1 ; 0からカウントしたいので-1を付加する。 redraw 1 if count \ 3 = 0 : await 16 : else : await 17 count = count + 1 goto *main



近所の老人

リンク

2017/3/5(Sun) 19:36:53|NO.78367

空気さん ありがとう御座います。
ゲーム作成 頑張ります(笑)



GENKI

リンク

2017/3/5(Sun) 20:26:09|NO.78371

await命令はその性質上、時間計測に使用するのはおすすめできません。
HDL(マニュアル)を読むと分かる通りawaitで吸収しきれないほどの計算負荷が発生した場合、吸収しきれなかった分だけ時間にズレが発生します。
このズレは何処にも吸収されずに蓄積されていくので、長い時間を計測しようとするほど最終的にはとても大きな差になってしまいます。
時間計測にはd3timer命令など、別途タイマー機能を持った命令をご利用ください。

#include "d3m.hsp" t0 = d3timer() time = 0 *main redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0 mes time time = (d3timer() - t0)/1000 goto *main



お助けマン

リンク

2017/3/6(Mon) 16:13:09|NO.78391

GENKIさん
ありがとう御座います。これも参考にします。



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