トップページ > 記事閲覧
ゲームパッドの振動の強さが変わる
名前:sereparu 日時: 2019/04/14 23:14

いつもお世話になっております。 StartJoypadVibration(または ReSetupJoypad)の不具合らしき現象を確認しましたので報告いたします。 現象は、ReSetupJoypad を実行すると StartJoypadVibration の振動の強さが変わるというものです。 ReSetupJoypad を実行した後の方が、実行する前よりも振動の強さが弱くなっているように感じます。 現象は以下の方法で確認しました。 ・確認方法 [1] PCにゲームパッド(DirectInput形式)を1つだけ接続した状態で起動 [2] 「StartJoypadVibration(DX_INPUT_PAD1, 1000, -1);」を実行する [3] 一定時間経過したら「ReSetupJoypad();」を実行する 上記を実行すると、[3] の直前まで最大(1000)の強さで振動していたゲームパッドが [3] の直後から、振動の強さが体感的に半分くらいに弱まったように感じました。 [3] を実行する前も後も、PCに接続しているゲームパッドは変えていません。 また、この現象は DirectInput 形式のゲームパッドにのみ発生しており XInput 形式のゲームパッドでは発生しませんでした。 確認時のDXライブラリのバージョンは「3.20e」です。 また、確認に使用したゲームパッドは「ELECOM JC-U4113SWH」です。 現在、手元にあるゲームパッドのうち、DirectInput 形式で振動機能があるものが 1つしかないので、製品側の不具合の可能性もあるかもしれません。 お忙しいところ大変恐れ入りますが、ご確認をお願いいたします。 以上です。よろしくお願いいたします。
メンテ

Page: 1 |

Re: ゲームパッドの振動の強さが変わる ( No.1 )
名前:管理人 日時:2019/04/14 23:51

ご報告ありがとうございます すみません、手元にある Xbox360, XboxOne コントローラ以外の振動機能付きコントローラが 悉く Windows7 くらいまでしか対応していない製品だったため確認できませんでした Windows10 に対応しているゲームパッドを私も購入して確認してみますので、数日程お待ちください m(_ _;m
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.2 )
名前:sereparu(解決) 日時:2019/04/15 22:09

管理人さん 迅速なご回答、誠にありがとうございます。 こちらでも DirectInput 形式で振動機能があるゲームパッドを もう一つ購入して確認したところ、今度は上記の現象が発生しませんでした。 なので、やっぱり製品側の不具合の可能性が高いです。 今回の確認で使用した製品は「iBUFFALO BSGP1601BK」という DirectInput のみ対応の有線のゲームパッドです。 先述の現象が発生したゲームパッド「ELECOM JC-U4113SWH」は XInput、DirectInput の切替ができる無線のゲームパッドでした。 なので、現象が発生する可能性としては ・XInput、DirectInput の切替ができるゲームパッドで発生する? ・無線のゲームパッドで発生する? ・特定のメーカーの製品で発生する? というような可能性が残っていますが これらのことを管理人さんにご確認いただくとなると 大変なご負担をお掛けすることになってしまうので 今回の件は一旦解決とさせてください。 こちらの確認不足で、早まった報告をしてしまい申し訳ありません。 また何か気付いた点があった場合は、改めて報告いたします。 以上です。ありがとうございました。
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.3 )
名前:管理人(解決) 日時:2019/04/16 00:46

なるほど、単純な現象ではないかもしれないのですね… ご確認ありがとうございます 何かありましたらご連絡ください m(_ _)m
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.4 )
名前:通貨 日時:2019/04/16 20:30

dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4511&p=1 のスレッドで使用したゲームパッドが似たようなものなので試してみました。 エレコム 有線 JC-U4013S DInputとXInputが手動で切り替えられる ⇒このパッドはOS標準ドライバでも動きますが、メーカーのドライバを入れないと  DInputでは振動しませんんのでご注意ください。また、時々ドライバを入れ直さないと振動しないことがあります。 XInputですが、sereparuさんが書かれているように変化(問題)はありませんでした。 DInputはやはり変化があります。ただ、振幅が弱くなるというより、振動の周期が長くなるので そう感じる、といったところでしょうか? ぶぶぶぶぶぶぶ… という連続振動から、おぎゃーおぎゃー…という感じ(伝わりますでしょうか? 汗) DxLibのソースで NS_StartJoypadVibration( InputType, SetPower, Time, DINPUTPAD_MOTOR_LEFT ) ; NS_StartJoypadVibration( InputType, SetPower, Time, DINPUTPAD_MOTOR_RIGHT ) ; の片方ずつをコメントアウトしてやってみましたがLもRも変化しているようです。(どっちかだけおかしい、ではない) WinMain側で StartJoypadVibration(DX_INPUT_PAD1, 1000, -1); WaitTimer(5000); ReSetupJoypad(); StartJoypadVibration(DX_INPUT_PAD1, 1000, -1); WaitTimer(5000); ReSetupJoypad(); StartJoypadVibration(DX_INPUT_PAD1, 1000, -1); とか ChangeWindowMode(TRUE); DxLib_Init(); StartJoypadVibration(DX_INPUT_PAD1, 1000, -1); WaitTimer(5000); DxLib_End(); ChangeWindowMode(TRUE); DxLib_Init(); StartJoypadVibration(DX_INPUT_PAD1, 1000, -1); でも同じでした。後者は完全リセットを期待したのですが、やはり変化がありました。 ※前者とは周期は違うようですが、よくわかりません。
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.5 )
名前:管理人 日時:2019/04/17 23:01

> 通貨さん ご情報ありがとうございます Windows10でも DirectInput の振動機能が使えるゲームパッドを一つは 無いとまずいと思い JC-U4013 を私も購入して確認してみましたところ、 通貨さんの遭遇された現象と同じ現象が発生しました 少し調べてみた結果ですが… Sereparuさんが疑われているように 製品側の不具合、恐らく ELECOM の製品のドライバの不具合だと思います というのも、DirectInput の最低限の初期化・終了処理を繰り返すだけでも 現象が発生してしまい、5回目の初期化以降は一切振動しなくなってしまうからです DirectInputDevice 取得 振動処理初期化 振動処理後始末 DirectInputDevice 削除 DirectInputDevice 取得 振動処理初期化 振動処理後始末 DirectInputDevice 削除 DirectInputDevice 取得 振動処理初期化 振動処理後始末 DirectInputDevice 削除 DirectInputDevice 取得 振動処理初期化 振動処理後始末 DirectInputDevice 削除 DirectInputDevice 取得 振動処理初期化 ↓ 振動しなくなる そして、『振動処理初期化』『振動処理後始末』の部分を最後の回まで行わない 以下の処理の場合は5回目の初期化でも正常に振動します DirectInputDevice 取得 DirectInputDevice 削除 DirectInputDevice 取得 DirectInputDevice 削除 DirectInputDevice 取得 DirectInputDevice 削除 DirectInputDevice 取得 DirectInputDevice 削除 DirectInputDevice 取得 振動処理初期化 ↓ 正常に振動する なので、振動処理の初期化・後始末を行った上での DirectInputDevice の削除処理に ついてドライバになんらかのバグがあるのだと思います ・ELECOM のゲームパッドでは無線でも有線でも発生する ・BUFFALO のゲームパッドでは発生しない と、情報が二つになったので、これで更に他のメーカー製のゲームパッドでも 正常に動作した場合はほぼ『ELECOM のゲームパッドのドライバにバグがある』という 結論で良いような気がします
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.6 )
名前:通貨 日時:2019/04/17 23:28

このゲームパッドはコメント4に書いたスレッドの時に買ったものですが、それ以降使っていませんでした。 で、今回の検証で使おうとしたら、最初まず振動しなくて焦りました。(CreateEffectsで未実装?か なんかが返ってきて失敗している) コンパネで振動テストをすると普通に振動するのですが、アプリだと振動しない。 仕方ないのでもう一度インストールすると、アプリでも振動するようになりました。 それで、ようやくコメント4のテストを実施した、という経緯です。 このように、インストール後もイマイチ挙動が怪しい気がしますが、 1つ気になるのは「アプリを起動し直すと普通に振動するようになる」点くらいでしょうか。 ともあれ、DInput/XInput両対応なので、「両対応の場合、XInputを使ってください」とアプリ側で 明示した方がいいかもしれませんね。
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.7 )
名前:sereparu 日時:2019/04/18 00:10

> 管理人さん、通貨さん 色々とご確認いただき、誠にありがとうございます。 通貨さんのおっしゃる通り、言われてみれば振動の強さというよりは 振動の周期が長くなったようにも思えます。 「ELECOM JC-U4113SWH」のドライバを入れ直してみましたが 結果は変わらず、振動が変化しました。 こちらでも ReSetupJoypad を何度も繰り返すテストをしてみましたが ReSetupJoypad を呼び出すたびに振動が弱くなり 5回目の呼び出しで、ほぼ振動を感じられなくなりました。 振動機能以外の、ボタンやジョイスティックなどの入力機能は ReSetupJoypad を何度呼び出しても特に問題ありませんでした。 現象が発生しない「iBUFFALO BSGP1601BK」については 10回以上 ReSetupJoypad を呼び出しても、振動の強さは変わりませんでした。 ただ、「iBUFFALO BSGP1601BK」は「ELECOM JC-U4113SWH」に比べて 全体的に振動が強め(強さが「10」でも「1000」でもかなり強く振動する)なので 比較対象としてはあまり適切ではなかったかもしれません。 メーカーによって振動の強さの定義も異なるみたいですね。 以上のことから、やっぱり特定のメーカー(今のところELECOM)の製品特有の 不具合の可能性が濃厚になってきました。 製品の不具合だとプログラム側で回避するのは難しいと思いますが 何か方法がないか、時間があるときに色々試してみたいと思います。
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.8 )
名前:sereparu 日時:2019/04/29 01:41

今回のゲームパッドの振動の強さが変わる現象について、まだ回避策は見つかっていませんが 新たな発見がありましたので報告いたします。 前回、振動の強さが変わる現象が ELECOM 製品特有の不具合の可能性が高いとお伝えしましたが どうやら ELECOM 以外の製品でも同様の不具合が発生するようです。 今回の確認に使用した製品は「Logicool Rumble Gamepad F510」です。 この製品は XInput、DirectInput の切替ができる有線のゲームパッドですが DirectInput モードで ReSetupJoypad を何度も実行するテストをしたところ、徐々に振動が弱まる現象が発生しました。 ただ、前回現象を確認した「ELECOM JC-U4113SWH」が5回の ReSetupJoypad の実行で振動が止まったのに対して 「Logicool Rumble Gamepad F510」は、振動の弱まり方が緩やか(ほんの少しずつ弱まる感じ)で 振動の強さを最大(1000)の強さから始めた場合、30回目の ReSetupJoypad の実行で ようやく振動がほぼ感じられなくなるぐらいになりました。 また、この製品もやっぱり XInput モードでは現象は発生しませんでした。 前回、ReSetupJoypad を20回実行しても振動が弱まらなかった「iBUFFALO BSGP1601BK」も もしかしたら振動の弱まり方が小さかっただけなのではないかと思い 念を入れて ReSetupJoypad を100回実行するテストをしてみましたが やっぱり振動は弱まりませんでした。 以上のことから、今回の現象は、ELECOM 製品特有の問題ではなく DirectInput 全体の問題である可能性が出てきました。 さらに言えば、DirectInput しか使えないゲームパッドでは現象が発生しなかったので XInput、DirectInput の切替ができるゲームパッドでのみ発生する不具合の可能性が高いです。 また、ReSetupJoypad 実行時のログを確認したところ 現象が発生しない「iBUFFALO BSGP1601BK」では、「ジョイパッドの初期化... 」というログと 「ジョイパッドの追加は正常に終了しました」というログの直前に 「スレッド 0x1b68 はコード 0 (0x0) で終了しました。」というようなログが必ず出るのに対して 現象が発生するゲームパッドでは、そのようなログが出ていないようです。 このスレッドのログがどういうものか、あまり詳しくありませんが、何か関係するものでしょうか? ■「ELECOM JC-U4113SWH」のログ 5687:ジョイパッドの初期化... 5723:入力装置を見つけました 5723: Device Instance Name : JC-U4113S DirectInput Mode 5724: Device Product Name : JC-U4113S DirectInput Mode 5740:ジョイパッドの追加は正常に終了しました 5753:ジョイパッドの初期化は正常に終了しました ■「Logicool Rumble Gamepad F510」のログ 4826:ジョイパッドの初期化... 4851:入力装置を見つけました 4852: Device Instance Name : Logicool Rumblepad 2 USB 4853: Device Product Name : Logicool Rumblepad 2 USB 4868:ジョイパッドの追加は正常に終了しました 4868:ジョイパッドの初期化は正常に終了しました ■「iBUFFALO BSGP1601BK」のログ 15755:ジョイパッドの初期化... スレッド 0x1b68 はコード 0 (0x0) で終了しました。 15782:入力装置を見つけました 15783: Device Instance Name : BUFFALO BSGP1601 Series 15783: Device Product Name : BUFFALO BSGP1601 Series スレッド 0x2f44 はコード 0 (0x0) で終了しました。 スレッド 0x3350 はコード 0 (0x0) で終了しました。 16003:ジョイパッドの追加は正常に終了しました 16004:ジョイパッドの初期化は正常に終了しました 現象発生ケースの列挙ばかりで申し訳ありませんが 何かお気づきの点がございましたら、ご教授願います。
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.9 )
名前:通貨 日時:2019/04/29 20:57

管理人様 「プログラム中で初期化・後始末を繰り返すと振動しなくなる」が 「アプリを起動し直すと復活する」ということから、DxLibの後始末に問題があるのでは? と考えトレースしてやってみました。 DxInputWin.cpp の int TerminateJoypad_PF( void ) にある for( j = 0 ; j < DINPUTPAD_MOTOR_NUM ; j ++ ) { if( pad->Effect[ j ].PF.DIEffect != NULL ) { pad->Effect[ j ].PF.DIEffect->Stop() ; pad->Effect[ j ].PF.DIEffect->Unload() ; pad->Effect[ j ].PF.DIEffect = NULL ; } } の部分ですが、 for( j = 0 ; j < DINPUTPAD_MOTOR_NUM ; j ++ ) { if( pad->Effect[ j ].PF.DIEffect != NULL ) { pad->Effect[ j ].PF.DIEffect->Stop() ; pad->Effect[ j ].PF.DIEffect->Unload() ; pad->Effect[ j ].PF.DIEffect->Release(); // <--- ここ pad->Effect[ j ].PF.DIEffect = NULL ; } } のように、一行追加したらうまくいったように思うのですが…
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.10 )
名前:管理人 日時:2019/05/01 02:14

> sereparuさん 詳しく調査していただきありがとうございます そして、すみません、通貨さんのご指摘の通り原因はDXライブラリのバグでした orz 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ご迷惑をお掛けしてしまい申し訳ありません m(_ _;m > 通貨さん ご指摘ありがとうございます 仰る通り Release をすることで何回 ReSetupJoypad を呼んでも問題なく挙動するようになりました m(_ _;m 以下は蛇足です 今確認したところ DirectX 7 時代の公式のサンプルでも後始末として Release が呼ばれていました それなのに何故DXライブラリでは Unload だけして Release を呼んでいなかったのかと申しますと、 はっきりとは覚えていませんが、『実装時に参考にしたプログラムがそのようになっていたから』だと思います COM で実装されていながら、その機能の後始末用の API を呼ぶと内部で Release が呼ばれていて、自前でも Release を呼ぶと参照カウンタが不正になる例などもあるため、DirectInputEffect の Unload もその例だと 思い込んでいました orz 試しに DirectInputEffect の情報を求めてネットを検索してみましたが、現在見つかる情報の殆どは 後始末として Release を呼んでいました… ただ、自分の記憶する限りでは『Unload だけすれば良い』という情報が強く残っているので、参考にした資料は 当時それなりの人数が参考にしていたような気がします ( 実際に、見つけたネット上の情報の内、一つのサイトだけですがDXライブラリと同じように Unload だけをしていました )
メンテ
Re: ゲームパッドの振動の強さが変わる ( No.11 )
名前:sereparu(解決) 日時:2019/05/01 20:43

管理人さん、通貨さん ご対応ありがとうございます。 修正版でテストしてみたところ、ReSetupJoypad を実行しても DirectInput のゲームパッドの振動の強さが変わらないことを確認しました。 本当にありがとうございました。 今後もよろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存