|
|
2013/9/8(Sun) 02:16:13|NO.56991
僕のパソコンのスペックが低いからか分かりませんが、
連打ツールでawait 1にしてもFPS4~500程度にしかならないんです。
FPS取得のみのプログラムを実行してみるとFPS1000ピッタリなるんで
処理落ち・・・というのがFPS500の正体なんでしょうか。
マイパソコン
windows 7 64bit
4GBメモリ
pentium p6200(2.13GHz
このパソコンが低スペなのか中スペなのか分かりませんが、
高性能なやつでFPS1000をたたき出せれば問題なし。
FPS500詰まりなら何かある。ということでよろしくお願いします。
(FPSはパソコンの時計の秒針を使って測ってます。)
http://www.geocities.jp/kamui_stst/
>mousecursormove+
連打モード作動時は目標FPSが1000に、
それ以外の時はwait 1なのでFPS64くらいでしょうか。
パソコン無知無智な僕がこんな堂々と
「テストユーザーもry」なんて言っていいのか凄く心配なんですね。(汗)
|
|
2013/9/8(Sun) 02:18:44|NO.56992
|
|
2013/9/8(Sun) 14:43:22|NO.57001
await 1は平均2msぐらい待つ(意図された動作かは知らない、スペック関係なく環境依存かもしれない)
await 1の時に他の処理が1msぐらいだとウェイト無しになりFPS1000ぐらいになる(CPUコア一つ使い切るが)
処理が間に合えば秒間1000フレームにする事は出来るが(時間を計り待ったり待たなかったりして調整)
await待機を使って毎フレーム1ms間隔のFPS1000は無理
msより精度の高いタイマーを使ってawait 1の待機時間を計ってみる
#module
#uselib "kernel32.dll"
#func QueryPerformanceFrequency "QueryPerformanceFrequency" sptr
#func QueryPerformanceCounter "QueryPerformanceCounter" sptr
//モジュール初期化
#deffunc QueryPerformance_init
dim qpf,2
dim qpc,2
ddim qpt,1
QueryPerformanceFrequency varptr(qpf)
if stat=0 {return -1}
pf2=((4294967296.0+qpf)\4294967296.0)//符号付きintを正の数のdoubleにする
pf2=(pf2+4294967296.0*qpf(1))//64ビットintをdoubleにする
QueryPerformanceCounter varptr(qpc)
if stat=0 {return -1}
stqpc=((4294967296.0+qpc)\4294967296.0)
stqpc=(stqpc+4294967296.0*qpc(1))
return 0
//---------QueryPerformance_init実行からの時間を単位を指定して取得--------
//GetQPtime(p1)
// p1 = 何分の1秒かを指定(省略時1000)[ミリ秒なら1000]
//整数部が指定単位になる
#define global ctype GetQPtime(%1=1000) _GetQPtime(%1)
#defcfunc _GetQPtime int q
QueryPerformanceCounter varptr(qpc)
qpt=((4294967296.0+qpc)\4294967296.0)
return ((qpt+4294967296.0*qpc(1))-stqpc)/pf2*q
#global
QueryPerformance_init
if stat<0 {dialog "高分解能パフォーマンスカウンタが使用できません":end}
repeat
//適当に処理時間を作る
repeat 10000 //この処理が1ms以内ならawait 1の待ち時間が2msから引かれる 1msを超えると1msも待機しなくなる
loop
tima=GetQPtime(1000)
await 1
timb=(GetQPtime(1000)-tima)//awaitの待機時間を正確に取得
color 255,255,255
px=((cnt/25)\6)*100
py=(cnt\25)*16
boxf px,py,px+100,py+16
color
pos px,py
mes timb
loop
stop

| |
|
2013/9/9(Mon) 01:54:07|NO.57029
試しに埋め込んでみたところ、
連打無し状態のawaitでも0.1ミリ秒くらいしかありませんでした。
これは処理を軽くするしかないですね。
あと今発見したよく分からないバグなんですが、
HSP3.4bからテスト実行で起動したMCM+がいるときのみ
キーボードの「w」が確定された状態で出てきて
「を」「わ」と入力しようとすると「wお」「wあ」となる。
たぶんwinAPI引っ張ってるから何かで誤動作起こしてるんだと
思いますが・・・
タイマーありがとうございます!
これからいろいろなところで使わせてもらうかもです。
|
|
2013/9/9(Mon) 01:57:13|NO.57030
(連投ごめんなさい)
100ミリ秒連打設定で、7秒間連打ゲームを実行すると
15回ぐらい。
100=0.1秒で6~70回は行ってほしかった。
みなさんのパソコンだとどうなるんだろうか
|
|
2013/9/9(Mon) 22:16:29|NO.57053
100ミリ秒に設定して60回だった
|
|
2013/9/9(Mon) 23:08:51|NO.57054
???暇人さんどうやったらそうなるんですかwww
スペック晒してもらえませんか?
あと、MCM+ ver 1.01を公開しました。
僕のところのスペックでもFPS900程を記録できるようになりました。
http://www.geocities.jp/kamui_stst/
windows 7 64bit
pentium p6200
4GBメモリ
因みにプロセス数90個越え
|
|
2013/9/9(Mon) 23:30:15|NO.57055
100ミリで
v1.00だと7秒間で46回。
平均660fpsくらいでした。
v1.01だと7秒間で72回
fpsは1000でした。
(Core i7 3630QM)
|
|
2013/9/9(Mon) 23:39:21|NO.57056
core i7 3770kです(8core 4.3GHz)
Ver 1.0.1です
100msで970〜994fps、7秒の連打テストで69回でした
|
|
2013/9/10(Tue) 02:03:35|NO.57057
1.01だと
100ms設定で40回弱
FPS500ぐらい
前のバージョンだとFPS750ぐらいだから
ウェイトかからないフレームが5割ぐらいあったんだろう
XPのDualCore3.2GHz
ブラウザ側のアプリが処理落ちしなければ100ms指定すれば70回
10msなら700回になるサンプル(CPUがシングルコアだとブラウザが処理落ちしたらHSP側も処理落ちするだろうけど)
ALT押してる間だけ左クリック連打になる
#include "user32.as"
#module
#uselib "winmm.dll"
#cfunc _timeGetTime "timeGetTime"
#func _timeGetDevCaps "timeGetDevCaps" var,int
#func _timeBeginPeriod "timeBeginPeriod" sptr
#func _timeEndPeriod "timeEndPeriod" sptr
#defcfunc timeGetTime
return _timeGetTime()
#deffunc timeEndPeriod onexit //タイマー精度を戻す(終了時に自動で呼びだされる)
if tbp {_timeEndPeriod tbp :tbp=0}
return
//SetFps fps
// fps = 設定するフレームレート
#deffunc SetFps double fps
if tbp=0{ //タイマー精度変更
dim timcap,2
_timeGetDevCaps timcap,8 //タイマー精度の性能を取得
tbp=timcap //最小設定を代入
_timeBeginPeriod tbp //タイマー精度設定
}
f_tim=1000.0/fps //1フレームの時間
ms_tim=_timeGetTime() //スタート時間(d3timer()-ms_timでスタートからの時間にする)
fs_tim=0.0 //フレームスタート時間
return f_tim
//GetFps fps
// fps = フレームレート取得
//statにGetFps間の時間が返る
#deffunc GetFps var fps
to=t
fps_cnt+
fs_tim+f_tim //1フレームの時間を足して次フレームスタート時間にする
sms=fs_tim-(_timeGetTime()-ms_tim) //次フレームスタート時間からスタートからの時間を引いてスリープ時間にする(結果が負数なら1フレームの時間を越えた)
if sms < 0 {fs_tim-sms} //1フレームの時間以上使用したからオーバー分をフレームスタート時間に加算
await 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
buffer 1,150,40
screen 0,150,100,0,200,200
gsel 0,2
cls 1
pos 10,10
set_ms=100
input set_ms,50
pos 65,10
mes "ms"
SetFps 1000
repeat
if set_ms ! set_ms_bak {//連打タイミングの変更があった
set_ms_bak=limit(set_ms,1,1000)//1〜1000に限定
if set_ms_bak ! set_ms {//指定された数値が範囲外だったのでinputの方も修正された値を設定
objprm objid,set_ms_bak
}
tms=timeGetTime()-set_ms
}
getkey alt,18
repeat //経過時間分連打
if (timeGetTime()-tms)>=set_ms {
tms+set_ms
if alt {
mouse_event $2,0,0,0,0
mouse_event $4,0,0,0,0
}
}else{
break
}
loop
GetFps fps
gsel 1
color
boxf 0,0,150,40
color 255
pos 20,10
mes strf("fps=%d ALT=%d",fps,alt)
gsel 0
gmode 3,150,40,100
pos 0,50
gcopy 1
loop
stop
経過時間分連打するのでSetFps 60にしても秒間の連打は変らない
1フレームで複数回連打する事になる

| |
|
2013/9/10(Tue) 20:20:06|NO.57069
redraw 1の処理時間嫌って半透明コピー使ったけど
半透明コピーのが重かった・・・
FPS固定モジュールはNO.57057のを使用
screen 0,150,100,8,200,200
cls 1
pos 10,30
set_ms=100
input set_ms,50
pos 65,30
mes "ms"
objsize 75,20
pos 0,0
button gosub "連打モードON",*on_label
pos 75,0
button gosub "連打モードOFF",*off_label
gsel 0,2
*start
SetFps 1000
title "連打モードON"
tms=timeGetTime()-set_ms
repeat
if set_ms ! set_ms_bak {//連打タイミングの変更があった
set_ms_bak=limit(set_ms,1,1000)//1〜1000に限定
if set_ms_bak ! set_ms {//指定された数値が範囲外だったのでinputの方も修正された値を設定
objprm objid,set_ms_bak
}
tms=timeGetTime()-set_ms
}
getkey alt,18
repeat //経過時間分連打
if (timeGetTime()-tms)>=set_ms {
tms+set_ms
if alt {
mouse_event $2,0,0,0,0
mouse_event $4,0,0,0,0
}
}else{
break
}
loop
GetFps fps
if off=1 {break}
gosub *draw
loop
SetFps 60
title "連打モードOFF"
repeat
getkey alt,18
gosub *draw
GetFps fps
if off=0 {break}
loop
goto *start
stop
*draw
redraw 0
color
boxf 0,60,150,100
color 255
pos 20,70
mes strf("fps=%d ALT=%d",fps,alt)
redraw 1,0,60,150,40
return
*on_label
off=0
return
*off_label
off=1
return

| |
|