続・リモートデスクトップでゲームパッドを使う方法

※2020/06/13 Dual Shock4 Emulationモードの入力不具合を修正しました。
https://github.com/ProjectAsura/RdpGamepad/releases/tag/DS4_7

※2020/11/20 Dual Senseからの入力を試験的にサポートすることにしました。
https://github.com/ProjectAsura/RdpGamepad/releases/tag/DS5_1


こんにちわ,Pocolです。

今回はテレワークお役立ち情報の続編です。
前回はWindows 10 HomeがRemote Fx USBリダイレクト使えなくて,リモートデスクトップでパッドが使えなくて困って,リモートデスクトップでゲームパッドが扱えない場合にゲームパッドを使えるようにするプラグインを紹介したのですが…
今回はそのプラグインを改造して,少し扱いやすくしました!というお話です。

前回紹介した、https://github.com/microsoft/RdpGamepadはXInput対応のゲームを開発する際にはとても役に立つのですが,残念ながらDual Shock 4にしか対応していないゲームを開発する際にはリモート越しで操作出来なくてこまってしまうという場面に出くわします(※まぁ開発者の人ならわかりますよね)。

「無いなら作ろう!」というわけで,作ってみました。
https://github.com/ProjectAsura/RdpGamepad/releases/tag/DS4_6

基本的には

  • XInput —> Dual Shock 4
  • Dual Shock 4 —> Dual Shock 4
  • Dual Shock 4 —> XInput

という処理を付け足しました。

使い方は簡単で,本家の代わりにこちらで改造した版のインストーラーを使ってインストールしてください。
転送先のPCで右下に常駐する「Microsoft Remote Desktop Gamepad Receiver」を右クリックして,転送先で振る舞うコントローラータイプを選択してください。

Xbox 360を選択すると,
[ローカルPC:XInput] → [リモートPC:XInput]として動作します。

Xbox 360 Emulationを選択すると,
[ローカルPC:Dual Shock 4] → [リモートPC:XInput]として動作します。

Dual Shock 4を選択すると,
[ローカルPC:Dual Shock 4] → [リモートPC:Dual Shock 4]として動作します。

Dual Shock 4 Emulationを選択すると,
[ローカルPC : XInput] → [リモートPC: Dual Shock 4]として動作します。

XInputでDual Shock 4をエミュレーションする場合にはボタン数が足らないため,PSボタンとタッチパッドボタンが効かない仕様です。
また,サブモジュールとして使用しているViGEmClientがジャイロなどに対応していない関係で,Dual Shock 4のジャイロは非サポートです。
また,Bluetoothを使った接続に関しても非サポートです。

ちなみに分かっている情報として,Xbox OneゲームパッドをRemote FX USBリダイレクトでつなぐとリモート先のPCがブルースクリーンになるなどの問題が報告されています。
現在所属会社の方では,Remote FX USBリダイレクトでブルースクリーンが発生する問題を避ける方法としてRdpGamepadの使用が推奨されています。

そんなわけで,転送先PCでDual Shock 4として認識してくれないと開発に困る!という方たちにはもしかしたら有益な情報かもしれませんし,ブルースクリーンで悩んでいる方に有益な情報かもしれません。
テレワークでの開発にお役に立てば幸いです。

※追記ですが,ViGEmBusのドライバー側にバグがあるようで,入力を受け付けなくなってBSODになったりするみたいです。DirectInputやXInputの初期化処理で関数から帰ってこなくなったら,このバグが発生している可能性あります。この状態でリモート接続を切断してしまうと,再接続できなくなるようなので,バグが発生したらリモート側のPCをいったん再起動して対処するほかないようです(再起動にも20分とか時間がかかるようです)。現在,Issueが発行されています。1日以上PCを起動しっぱなしにするとバグを踏む確率が高くなるので,対処として1日に1回PCの再起動かけると良いかと思います。

続・リモートデスクトップでゲームパッドを使う方法」への13件のフィードバック

  1. ゲームパッドのリモート接続を調査しており、こちらのサイトに辿り着きました。
    Pocol様の方で配布されているRdpGamepadを導入したところ
    「Xbox 360 Emulation」「Dual Shock 4」を選択した際に
    接続元PC側でメモリリークと思われる現象が発生しておりました。
    (リモートデスクトップ接続アプリのメモリ使用量が増え続ける)
    お忙しい中とは存じますが、ご確認頂けると幸いです。

    既知の不具合でしたらご容赦下さい。

  2. ご報告ありがとうございます。
    こちらで調査したところ,Dual Shock4の処理に問題があることが判明しました。
    明日テストを行い,修正が確認出来たら対応版をリリース致します。

  3. ご対応頂き有難うございます。
    「Xbox 360 Emulation」「Dual Shock 4」選択時におけるメモリリークは解消されていたのですが
    接続先PC側でゲームパッドの接続、切断が定期的に繰り返される副作用が発生しておりました。

    こちらの環境下における問題かもしれませんが共有させて頂ければと思います。

    1. ちなみ,切断が定期的に繰り返される現象が発生する際は,アプリケーションを実行している最中でしょうか?
      調査するために不具合が発生する詳細情報が欲しいです。自分が開発しているアプリでは30分以上起動している状態ですが,特に問題なく動作しているように見えます。
      欲しい情報としては,
      ・どのぐらいの時間(頻度)で発生するのか?(PCを起動してから30分程度なのか,1日程度なのか?)
      ・接続タイプ(転送元の物理ゲームパッドの種類・転送先のゲームパッドタイプ),どのボタン(あるいはバイブレーションを発生させるタイミング)
      ・どのぐらいの人が同じ不具合が発生しているのか?
      ・100%再現させる方法があるか?
      ・文字通り切断・接続を勝手に繰り返すのか?切断が定期的に来るから手動で立ち上げ直して再接続等を行っているのか?
      ・ゲームパッドで動作しているゲームアプリケーションはPC向けのゲームアプリケーションか(普通に自社・自前開発しているWindowsアプリかどうか),あるいは,そうではないアプリケーションなのかどうか?
      などの情報が欲しいです。

      こちらで体感的に分かっている情報としてドライバーのバグでPCを起動してから,
      大体1日以上立っている場合はドライバーの不具合が発生しやすくなり,DirectInputやXInputの初期化で関数が返ってこなくなる現象が発生しています。
      そのため,ゲームパッドをつかない時間帯はRdpGamepadを終了しておき,ドライバーのバグを発生しづらくするという運営で対策を行っています。
      一応,ソースコードも公開されていますので,もしソースコード上でおかしなところがあればIssueを発行して頂き,修正コードをGithubの方にプルリクエスト頂ければ,こちらでチェックして反映致しますので,よろしくお願い致します。

      1. >・どのぐらいの時間(頻度)で発生するのか?(PCを起動してから30分程度なのか,1日程度なのか?)
        起動直後から発生しておりました。

        >・接続タイプ(転送元の物理ゲームパッドの種類・転送先のゲームパッドタイプ),どのボタン(あるいはバイブレーションを発生させるタイミング)
        DualShock4のUSB有線接続で「Xbox 360 Emulation」「Dual Shock 4」モードを選択時です。

        >・どのぐらいの人が同じ不具合が発生しているのか?
        導入は自分の環境下のみで他のケースは未検証です。

        >・100%再現させる方法があるか?
        こちらでは100%再現しておりました。

        >・文字通り切断・接続を勝手に繰り返すのか?切断が定期的に来るから手動で立ち上げ直して再接続等を行っているのか?
        「Xbox 360 Emulation」「Dual Shock 4」を選択時に接続先のOS側でゲームパッドデバイスの認識、未認識を繰り返す状態です。
        ([コントロールパネル]-[デバイスとプリンター])
        こちらで再接続等の操作はしておりません。

        >・ゲームパッドで動作しているゲームアプリケーションはPC向けのゲームアプリケーションか(普通に自社・自前開発しているWindowsアプリかどうか),あるいは,そうではないアプリケーションなのかどうか?
        接続先のOS側でゲームパッドデバイスの認識、未認識を繰り返す状態でしたので
        開発アプリケーションに依存した挙動というわけではなさそうです。

        現在こちらでは取り急ぎ問題回避の為にMS公式のRdpGamepadと
        別途エミュレーターツールの導入でDualShock4を利用しています。

        これらの挙動はメモリリークの修正をして頂いたバージョンから発生するようになりました。
        修正時に副作用が入ってしまった可能性を考えたのですが
        POCOL様の方では問題無いとのことですので単純な問題では無いのかも知れません。

        原因特定となるような有益な情報が出せず申し訳ないです。

        1. 昨日原因らしきものを発見したので,不具合修正を行いました。
          こちらの環境だとDual Shock 4とXBox 360 Controllerの2つをPCにUSB接続していたため,不具合が発生していなかったと思われます。

          1. 最新版にてこちらでも現象の改善を確認致しました。
            ご対応頂き有難うございました。

          2. あぁ、本当に良かったです。
            最初全然不具合原因分からなかったので,治ったと聞いて一安心です。

  4. POCOLさま

    とても有用なソフト、ありがとうございます。

    不具合の報告です。
    ■Dual Shock 4 Emulationモードで確認
    ・R2押し込みでR3押下
     R2がしきい値以上押し込まれたとき、R2ではなくR3が押されたことになります。
     ViGEmInterface.cppの212行目、DS4_BUTTON_THUMB_RIGHTはDS4_BUTTON_TRIGGER_RIGHTの間違いかと思います。

    ・DPAD、斜め方向の処理
     斜め方向ですが、左上以外は入らないように思えます。
     DPAD_MASK[]での比較で、斜めが比較される前に左、下、右との比較にマッチしてしまうのが原因かと思います。

    HotFix6で確認しました。

    以上です。

    1. ご報告ありがとうございます。
      修正版をリリースしましたので,こちらで問題がないかどうかご確認いただけるとありがたいです。

      1. 修正ありがとうございます。
        動作確認したところ問題ないかと思います。

  5. Pocol さま
    はじめまして。
    とてもステキなプラグインを開発くださり
    本当にありがとうございます!

    AWS EC2 のSteamのモンハンをDS4のコントローラーで遊びたく
    RemoteFX使えないし、どうすればいいんだろう……と途方に暮れていたところ
    こちらのサイトに辿り着きました。

    そして今日無事接続できましたー(*^^*)!
    悩み抜いたこの数ヵ月が報われたようで、感謝してもしきれません。

    Pocol さまのブログこれからまたちょくちょく訪問いたします。
    益々のご活躍心よりお祈り申し上げます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください