環境はVB6です。
winXPで作成したプログラムはtimeGetTimeによっておよそ20msec周期で動きます。
そのプログラムをwin2000に移して動かすと凄ーく遅くなります。
OSによってtimeGetTimeに設定可能なintervalって異なるのでしょうか?
win2000に移して、有り得ないほど低速になってしまいました。
timeGetTimeはマシンを起動してからの経過時間を
msec単位で返すだけの関数です。
SetTimerやtimeSetEventのように、
タイムアウトしたらコールバックするというわけではありません。
したがって、timeGetTimeにはintervalなどという概念は存在しません。
Sayさん
>timeGetTimeにはintervalなどという概念は存在しません。
おっしゃるとおりです。
言葉不足(?)でした。
以下のようなソースで、タイマとして動かしています。
/////////////////////////////////////////////////////
Private Sub highTimer()
Dim looptime As Long
Dim starttime As Long
looptime = 1
Do
starttime = timeGetTime()
Call Something '処理を記述
Do
DoEvents
Loop Until timeGetTime() - starttime >= looptime
Loop
End Sub
/////////////////////////////////////////////////////
これでDLLを呼び出して、OpenGLをPictureBox内に表示しているのですが、
8FPS、即ち秒間8回しかhightimerがコールされていないようなのです。
おそらくlooptime=1で回っていないと思われるのですが…。
ちなみにXPの環境だと40FPS程度になります。
グラボとの相性なのかなんだかわからず、途方にくれています。
>Call Something '処理を記述
ここが遅くなっていないのは確実なんですか?
Call Something
の前と後ろにGetTickCount等の関数をいれて処理時間を計って
みたらどうでしょう。
なんとなく Call Somethingが遅いだけ軒がしますが。
あと、蛇足かもしれませんが、長い日数起動したままのアプリケーションの場合は、timeGettimeの値がオーバーフローしてしまった時のことも考慮する必要がありますね。
(49.7日で符号無し32bit整数の上限値を超えます)
私の場合、OpenGLを使っていて
グラボとの相性の悪いコマンドなんかがあったのを記憶しています。
wglCreateContext()とwglDeleteContext()だったかなぁ…。
Radeon9100と相性悪かったような…。
曖昧な意見で申し訳ない。
timeGetTimeの精度設定はされていますでしょうか?
ご参考までに
http://www1.odn.ne.jp/psx-alternative/document_tech01.html
http://www.microsoft.com/japan/msdn/library/ja/jpmltimd/html/_win32_timegettime.asp
http://www.microsoft.com/japan/msdn/library/ja/jpmltimd/html/_win32_timebeginperiod.asp
VBで精度設定の効果ってあります??
自分がやったときは、全くといってよいほど効果なしでしたよ。
>ののさん
私の環境(Win2000,VB6 sp5,6)では、timeBeginPeriod などを実行しないと
timeGetTimeは約10msec程度の精度というか、その間同じ値を返してきていました。(値自体はmsec単位で返します)
よって、
Loop Until timeGetTime() - starttime >= looptime
では最大10msecウエイトが掛かると思ったのですが・・・
すいません
Call Something で 10msec以上掛かっているようなので
関係なかったですね (^^;)
ツイート | ![]() |