2019年03月一覧

RDPでGraphicsAPIは実行出来るか実験

前回、RDP で OpenGL アプリを起動させる方法を考えましたが、そもそも他のグラフィックスAPIではどうなのか、気になってきたので調べてみました。

RDP で動作するか?

  • OpenGL : 動作しない
  • DirectX11 : 動作する
  • DirectX12 : 動作する
  • Vulkan : 動作する

まさかの OpenGL だけが動作しないという状況だったようです。確認したのは、2台とも Windows10 1809 の環境で、デスクトップPCとノートPCという構成でした。
低レイヤーグラフィックスAPIのDirectX12/Vulkan らが RDP 経由でも使えたという点で驚きました。画面を単なる画像として送るなら、これらの動作に納得もあるのですが、かつては DirectX9 や OpenGL がリモートデスクトップ環境下で動かなかった時代を味わったために動作しないという思い込みがあったようです。

プログラムコードで考えてみると、デバイスコンテキストが不要な API だと動作しているようですね。あとは、画面ロック・UACの暗転でいわゆるデバイスロストが発生しない時代になってきたから、というのもありそうです。


リモートデスクトップで OpenGL アプリを操作したい

Windows のリモートデスクトップで OpenGL を使用したアプリケーションの起動は出来ないことは、経験上知っていたのですが、OpenGL アプリを起動した状態で、リモートデスクトップ接続すると問題なくアプリが使用できる、という話を聞きました。

RDP接続後にOpenGLアプリを起動したい

事前にOpenGLアプリを起動した状態で、他の端末から RDP で接続すれば問題なくアプリは操作できますが、事前に起動しておくことが不可能な時もあります。
また、アプリケーションを終了してしまって、再度起動したいということもあると思います。

このようなときには、 tscon コマンドを使うとよいようです。
このコマンドを用いるとセッションを切り替えることができるようなので、一度物理的なコンソールを持つセッションに切り替えてアプリケーションの起動をする、という方法が使えます。このときに、一度リモートデスクトップは切断されてしまいますが、再接続すればアプリケーションが起動した状態から再開できます。

アプリケーションの起動をするまでを次のような内容でバッチファイルにして、起動する際にはこのバッチファイルを実行するようにします。

実行する際には、管理者権限ありのコマンドプロンプトで実行してうまくいきました。一般権限のコマンドプロンプトだと、このままのバッチではうまく動作しない可能性があります。

他にもセッションのIDが必要な場面では、 “query session” を実行してみて、どのようなセッションが生きているかを見てみるのもよさそうに思います。