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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1119
留締高速な時間待ち処理3解決


留締

リンク

2006/11/19(Sun) 18:15:03|NO.3627

格闘ゲームを作ろうと思っているのですが、await 16で指定すると、1/60秒より少し遅いです。
実際に10秒を計ってみたら、ゲーム内では519ミリ秒しか経っていませんでした
(誤差を考え、少し早めに計り始めました)。

また、徐々に待ち時間を増やしていき一定時間毎に音を鳴らすプログラムを作り確認しました。
await 10から始めてawait 30までいくプログラムなのですが、何度聞いても、await 12~21の部分の
間隔が同じでした。
上記2つはCPU Pentium III 1GHz Win2000のパソコンで行いました。

別のパソコン(CPU Pentium 2.5GHz WinXP)ではawait 12~21の部分でも、間隔は問題ありませんでした。

await命令では、CPU Pentium III 1GHzのパソコンでは快適にプログラムを動かすのは厳しいのでしょうか?
また、どうすれば、正確に1/60秒がカウントされるのでしょうか?



この記事に返信する


mk-Ⅱ

リンク

2006/11/19(Sun) 20:40:59|NO.3632

プラグインとか使ってますか?



Shinya

リンク

2006/11/19(Sun) 21:51:41|NO.3638

>await 16で指定すると、1/60秒より少し遅いです
メモリ上のプログラムが実行される際、多少のタイムロスが生じるからです。
1GHzのCPUでは、1クロックで実行できる命令を1秒間に1Gぶん実行することができます。
HSPでは、見た目上は1つの命令でも、機械語では何クロック分も必要となる、
「プログラムの塊」になります。だから、await X と指定した場合、X ミリ秒の
ウェイトに加え、プログラムの実行時間が追加され、実際よりも遅くなります。

>どうすれば、正確に1/60秒がカウントされるのでしょうか?
具体的に説明することは難しいので、以下のようなサンプルを作成しました。
あと、1/60秒は長すぎるので, 1/5秒にしてあります。

#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime" ; この時間(s)で、目的地に到着する #define ACT 5.0 ; 移動する目的地の座標 #define MVX 100.0 #define MVY 100.0 ; タイムオフセット TimeOffset = timeGetTime() repeat time = timeGetTime() - TimeOffset ; 現在のタイム(s) t = double(time) / 1000 ; ACT 秒で 1 になる値 u = t / ACT title "" + t + " " + u x = MVX * u y = MVY * u redraw 0 color 255, 255, 255 : boxf color boxf x - 5, y - 5, x + 5, y + 5 redraw 1 if u : break await loop



留締

リンク

2006/11/20(Mon) 21:19:59|NO.3672

mk-IIさん
プラグインは、HGIMGを使用しました。
その中のsync命令を使用しましたが、結果は同じでした。

Shinyaさん
Shinyaさんの解説のおかげで、await命令についてよく知れました。
await命令の処理に少し時間がかかるんですね。
ということは、await命令は精確な時間を計るのには向いていないってことですね。

ありがとうございます。このプログラム参考にさせていただきます。



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