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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1004
P波特定の条件下だとゲームパッドの認識に時間がかかります(mod_joystick.as)。19解決


P波

リンク

2015/10/4(Sun) 12:24:55|NO.72102

「mod_joystick.as」を使ってPCに接続したゲームパッドを認識させたいのですが
PCにゲームパッドを接続しても、すぐに認識されなくて困っています。

具体的には、以下のプログラムでゲームパッドを認識させています。
ゲームパッドを接続していない状態でプログラムを起動して、プログラム起動後に
ゲームパッドを接続すると、statの値が「165(ゲームパッド未接続状態)」から
「0(ゲームパッド接続状態)」になりますが、「165」から「0」になるまでに
約15秒もかかってしまいます。


#include "mod_joystick.as" repeat redraw 0 color 255,255,255 : boxf : color 0,0,0 joyGetPosEx data, 0 pos 0,0 : mes "stat = " + stat repeat 13 : mes data.cnt : loop redraw 1 : await 30 loop

ただ、毎回時間がかかるわけではなく、以下の2つの条件下だと認識に時間がかかるようです。

 1.PCを起動してから一度もゲームパッドを接続していない

 2.上記のプログラム起動後に初めてゲームパッドをPCに接続する

一度でもPCにゲームパッドを接続すれば、その後はプログラム起動後にゲームパッドを
接続しても、接続した瞬間に認識されるようになります。
PC起動直後でも、プログラム起動前にゲームパッドを接続していれば、すぐに認識されます。

ゲームパッドは既にドライバをインストール済みで、動作確認済みのものを使用しています。
デバイスの優先順位設定などはありません。

上記の2つの条件下でゲームパッドの認識に時間がかかる原因は何でしょうか?
この現象はどのPCでも同じように発生するものなのでしょうか?
また、この条件下でもゲームパッドを接続した瞬間に認識させる方法はないでしょうか?
ご教授お願い致します。



この記事に返信する


KA

リンク

2015/10/4(Sun) 15:17:05|NO.72104

>>ゲームパッドを接続した瞬間に認識させる方法
OSの仕様上無理です。

特定の条件というか、OSに認識されていない状態です。
(対策が分かっているのに「困る」は理解出来ません。)



P波

リンク

2015/10/4(Sun) 16:16:58|NO.72105

KA様、ご回答誠にありがとうございます。

ネット上で「mod_joystick.as」を使用したゲームがあったので、上記の2つの条件下で
ゲームパッドを接続したところ、認識までにかかる時間は約5秒ほどでした。

ゲームパッドを接続した瞬間に認識させることはOSの仕様上無理とのことですが
認識までに約15秒もかかってしまうのは、やはりどこか問題があるのではないかと思います。

また、上記の対策方法は、プログラム起動前にゲームパッドを接続していることが
前提になるので、ゲームパッドを接続し忘れていて、途中で接続した場合
認識までに15秒もかかることを知らないユーザーであれば、ゲームパッドが
対応していないと勘違いしてしまう恐れもあり、対策方法として不十分だと考え
他の方法がないかと思い質問を投稿させていただきました。

プログラムの説明書に「ゲームパッドをご利用の際は、ゲームパッドを接続した状態で
プログラムを起動してください」と注意書きを書くこともできますが、プログラム内で
対処できるものであれば、極力プログラム内で解決したいと思っています。

他の方がどのような方法をとっているかも含めて、ご教授いただければ幸いです。



ZAP

リンク

2015/10/4(Sun) 16:31:24|NO.72106

OSレベルで認識に時間がかかるのだから、プログラム側でそれより早く検知するのは無理でしょう。

自分も同じモジュールを使っていますが、特に周知はしていません。
ジョイパッドを頻繁に使うゲーマーのような人なら、差しっぱなしの人も多いでしょうし。
最悪プログラムを再起動させれば済む話ですしね。



P波

リンク

2015/10/4(Sun) 17:16:51|NO.72110

ZAP様、ご回答誠にありがとうございます。

OSの問題であれば、どのプログラムでも同じ条件下ならば認識にかかる時間は
同じだと思うのですが、プログラムによって認識にかかる時間が違います。
ソースは確認できていませんが、同じ条件下でも約5秒で認識できるプログラムもあります。
こうなると、やはりプログラムの問題となってくると思うのですが。



葡萄色

リンク

2015/10/4(Sun) 20:40:25|NO.72113

>>P波さん
それは全く同じPCで別の(認識に5秒しか掛からない)プログラムを走らせたってことかな?



P波

リンク

2015/10/5(Mon) 07:25:52|NO.72115

葡萄色様、ご回答誠にありがとうございます。

葡萄色様のおっしゃる通り、全く同じPCで別のプログラムを実行したときに、認識にかかる時間が違いました。



KA

リンク

2015/10/5(Mon) 19:41:45|NO.72119

質問のスクリプトに「こういう目的でこうしているんだ」と
コメントを付けてみて下さい。

「5秒も15秒も似たようなもんだ」と、ゆとりをもった考
え方をすれば解決するかもしれません。



P波

リンク

2015/10/5(Mon) 21:08:13|NO.72121

>>KA様
上記のスクリプトはHSP Document LibraryのjoyGetPosExのサンプルを
そのまま記載したものです。
このスクリプトそのものを実際のプログラム中で使用しているわけではなく
あくまで認識するまでにかかる時間を確認するためのものです。
元々はゲームパッドで操作ができるプログラムを作成中に、上記の条件下のときだけ
認識にかかる時間が遅いと感じ、上記のスクリプトを使って確認したところ
認識までに約15秒かかっていることが判明したので質問させていただきました。

>>「5秒も15秒も似たようなもんだ」と、ゆとりをもった考え方
ゲームパッドを接続してから認識までに時間がかかるという点では
5秒も15秒も似たようなものだと捉えて納得することもできますが
認識にかかる時間が違う原因が分からないままなのは不安です。



葡萄色

リンク

2015/10/5(Mon) 21:57:30|NO.72125

>>P波さん
しかしmod_joystick.asは単にWin32APIのjoyGetPosEx関数を呼び出して少し使いやすくした程度のものなので、正直それがWindowsのAPIの限界な気がします。
もしよろしければ、その5秒で認識できるというプログラムを示して欲しいのですが。



ひろ

リンク

2015/10/6(Tue) 15:59:15|NO.72140

>1.PCを起動してから一度もゲームパッドを接続していない
>2.上記のプログラム起動後に初めてゲームパッドをPCに接続する

OSは起動時にすべてのドライバを読み込んでるわけではないので
接続した時点でOSが認識して準備します
2回目以降は一度OS上で読み込まれたドライバがそのまま残っていますので
接続を認識でき次第ドライバが有効になります

ドライバはOSから呼び出されると接続されている機器をチェックし
設定ファイルを読み込んでと準備を行います
が、それ以前にもドライバ自身の初期化動作も行われます
ドライバにより処理の内容は変わってきますが初回接続で速やかな認識を求めるのは
OS側の動作の制約で無理と言わざるを得ません


さて、認識途中に割り込まれると時間が余計にかかる…という可能性についてですが
サンプルソース中のwaitをもっと増やしてみてはどうでしょうか?
上記の2つの条件でもそれで変わる可能性は否定できないと考えます
もしwaitを大きくして認識時間が短縮するのであれば認識の邪魔をしているということで…



P波

リンク

2015/10/6(Tue) 23:00:11|NO.72148

>>葡萄色様
その後何回もテストを繰り返したところ、5秒で認識できると思っていたプログラムでも
稀に10秒〜15秒くらい時間がかかることが分かりました。
こちらのテスト不足で早合点してしまっていました、申し訳ございません。

>>ひろ様
OSの認識の仕組みについての丁寧なご説明誠にありがとうございます。
初回接続で認識に時間がかかることは仕方のないことなんですね。
また、上記のサンプルのwaitを100に増やしてみて再確認してみましたが
やはり認識にかかる時間は15秒くらいで変わりませんでした。
認識途中の割り込みなどはあまり関係ないかもしれません。

多くの方にご回答いただき重ね重ね感謝申し上げます。
結果的に今回はOSの問題として解決させていただきたいと思います。
ありがとうございました。



暇人

リンク

2015/10/7(Wed) 00:18:42|NO.72149

USB機器を接続したら認識成功したときに音が鳴ると思うけど
それ以上早くゲーム側で認識させる事は不可能

その15秒はOS側の仕様もあるがパッド側の仕様も関係してくる

後、ゲームスタートしたらパッド挿してるかどうかを
確かめるためにjoyGetPosExを毎フレーム使うのはやめた方が良い
パッドが無い時のjoyGetPosExは戻って来るのに時間がかかる事がある



P波

リンク

2015/10/7(Wed) 13:40:52|NO.72151

暇人様、ご回答誠にありがとうございます。

>>ゲームスタートしたらパッド挿してるかどうかを
>>確かめるためにjoyGetPosExを毎フレーム使うのはやめた方が良い
>>パッドが無い時のjoyGetPosExは戻って来るのに時間がかかる事がある

解決チェック済みの後で恐縮ですが、ゲームパッドが接続されているかどうかを
毎フレーム確認するためにはどうすれば良いのでしょうか?

joyGetPosExよりもjstickの方が使いやすいと感じたので、これからjstickを
使っていこうと考えているのですが、jstickも同様にゲームパッドの接続確認には
使わない方が良いのでしょうか?
具体的には、jstickで毎フレーム接続確認をして、ゲームパッドが接続されていなければ
getkeyによるキーボードのキー入力を取得するようにして、ゲームパッドが接続されていれば
jstickによるゲームパッドのボタン入力を取得するように区別したいと考えています。

また、ゲームパッドが接続されていない時は戻ってくるのに時間がかかるというのは
接続されているかどうかを確認する場合のみでしょうか?
statの値は参照せずに、joyGetPosExやjstickをゲームパッドのボタン入力の取得のために
毎フレーム使う場合は問題ないでしょうか?



暇人

リンク

2015/10/7(Wed) 19:48:25|NO.72159

>接続されているかどうかを確認する場合のみでしょうか?
接続されてない時って書いてるでしょ?
確認するとか関係無しに接続されて無い場合joyGetPosExは10ms前後処理時間が掛かる
但し、一度接続が成功した後ならパッドが外されても通常の処理時間(0.02ms前後)の数倍で済む
(PC環境の差で違う可能性はある)
jstickも中身はjoyGetPosExなので同じ

joyGetPosExの処理時間計測表示テスト
左側に接続無し右に接続されてからの処理時間を表示

#include "mod_joystick.as" ;高分解能パフォーマンスカウンタモジュール #module "mod_qpc" #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 font "MS ゴシック",18,1 repeat redraw 0 sb=s t=GetQPtime() joyGetPosEx a,0 s=stat tt=GetQPtime()-t color 255,255,255 if sb=s {line ginfo_cx,ginfo_cy,ginfo_cx+100,ginfo_cy} addx=(s=0)*320 pos ((cnt/20)\3)*100+addx,(cnt\20)*20 boxf (ginfo_cx\(300+addx)),(ginfo_cy\400)-1,(ginfo_cx\(300+addx))+99,(ginfo_cy\400)+20 color (s=0)*255 mes tt line ginfo_cx,ginfo_cy+1,ginfo_cx+99,ginfo_cy+1 redraw 1 await 100 loop
これを実行してパッドを抜き挿しして確認してみて下さい

市販のゲームでもゲーム起動時にパッドが無いなら後からパッドを挿しても無視してたり
オプションでパッド接続を手動で認識させたりしてる所もあったと思う



P波

リンク

2015/10/7(Wed) 22:46:13|NO.72162

>>暇人様
処理時間計測表示テストまで作っていただき誠にありがとうございます。
テストしてみたところ、おっしゃる通りゲームパッドを接続していない状態だと
処理時間は10ミリ秒前後で、一度接続した後だと0.02ミリ秒前後でした。

実際に作っているプログラムで、joyGetPosExを毎フレーム使っている状態でも
ゲームパッドを接続していないからといって、処理が遅く感じるようなことは
今のところないのですが、接続していないと接続している時よりも処理時間が
500倍以上もかかっているということに驚きました。
この差があると、環境によってはゲームパッドを接続していない状態だと
動作が重くなってしまうという問題も起こり得るのでしょうか?



暇人

リンク

2015/10/7(Wed) 23:04:10|NO.72164

>動作が重くなってしまうという問題も起こり得るのでしょうか?
当然起こるでしょう
NO.72159のawait 100を16に変えてみれば
パッドが無いときにCPU負荷が上がるのが分かると思う



P波

リンク

2015/10/8(Thu) 00:28:43|NO.72165

>>パッドが無いときにCPU負荷が上がる
確かに、mod_joystick.asを使用しているゲームでもテストしてみたところ、ゲームパッドを
接続していないとCPU負荷が高く、接続すると負荷が低くなっていました。

ゲームパッドの操作ができるプログラムを作ろうと思うと、joyGetPosExやjstickを
毎フレーム使ってボタン入力情報をリアルタイムで取得することが普通だと思うのですが
その場合、ゲームパッド未接続だとCPU負荷が上がるのは避けられないことなのでしょうか?
joyGetPosExやjstickを毎フレーム使っていて、かつゲームパッド未接続の状態でも
CPU負荷が変わらない方法はあるのでしょうか?



暇人

リンク

2015/10/8(Thu) 23:57:55|NO.72182

>CPU負荷が変わらない方法はあるのでしょうか?
少なくても簡単な方法は無いから市販のゲームでも
開始時に接続されて無ければ以降無視するようにしてるんだろう

ゲーム起動時にパッドが無い時は
タイトルやメーニュー画面なら1秒に一回ぐらいjoyGetPosExを実行して
スタート後ならゲーム側の処理時間に余裕がある時だけjoyGetPosExを実行
ポーズ機能とか付けてるならその時は普通にjoyGetPosExを実行しても良いかも
で、接続が確認できたら毎フレーム実行する



P波

リンク

2015/10/9(Fri) 00:20:51|NO.72183

>>暇人様
具体的な方法を丁寧にご回答くださり誠にありがとうございます。
一定間隔をおいてjstickを使い、認識後は毎フレーム使う方法を実現していきたいと思います。



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