Brynhildr

KeroRemote

リモートデスクトップエンジニアのブログ。

終焉

ついに長い歴史に終わりの時が。カテゴリに「Windows」「技術」とあるんでピンと来た方もいらっしゃると思います。

さて、何が終焉かと申しますと、リモートデスクトップの絡みです。

これまでBrynhildrを始めとしたリモートデスクトップを数々リリースしておりますが、サーバー側はWindowsに一貫していました。つまり、Windowsの画面を送信するといった機能は必ず存在していました。

もうかれこれ10年程前からリモートデスクトップのアプリを開発していますが、怖い事が1つありまして、それはWindows側の画面の送信ができなくなる事でした。具体的には、Windowsのバージョンアップが進み、何らかの形で画面キャプチャーができなくなるとリモートデスクトップが成立しなくなる事です。

これまでのBrynhildrに至るまでの全てのリモートデスクトップアプリでWindowsの画面を送信する仕組みには「BitBlt」という関数を利用していました。一時はDirectXを用いてキャプチャも行っていましたが、恐らくそれもGDIであるBitBltを利用したものと思われますので、それはそれはBitBltが使えなくなる事を恐れていた訳です。

つまり、BitBltで画面キャプチャーができなくなった時点でBrynhildrは終焉を迎えるのです。

大きな転換期はWindowsVistaに訪れました。OSにAeroが実装され、DWM(Desktop Window Manager)が姿を現しました。DWMにより、ウィンドウの半透明やアニメーションエフェクトなど美しさと引き換えに、BitBltによる画面キャプチャーの速度は制限されてしまいパフォーマンスを出す事が難しくなりました。

Windows7まではこのDWMを停止する事ができた為、利用シーンによっては速度制限を解除する事もできましたが、Windows8ではDWMの停止ができなくなり、いよいよBitBltによる画面キャプチャーが厳しくなって来たので御座います。

この頃既にBitBltに変わる別の画面キャプチャー方法を模索するようになります。そこで発見したのが「DwmGetDxSharedSurface」です。DwmGetDxSharedSurfaceはWindows7で利用可能です(未確認ですがWindowsVistaでもGetSharedSurfaceで同様の動作が可能の模様)

DwmGetDxSharedSurfaceは画面情報をDirectXのテクスチャに変換し、さらにそれをRGBの画像データに変換する事が可能です。ただ、DwmGetDxSharedSurfaceはリモートデスクトップのキャプチャとして不完全でして、DirectXのフルスクリーンゲーム画面に対応していない事やデスクトップ画面を1枚にする為にウィンドウ単位で画像を組み合わせる必要があり、求めていた性能よりも低く、とても実用レベルまでとは行かず実装を断念しました。

さて、Windows8では画面キャプチャーにもう1つ手段が加わる事になります。それが「Desktop Duplication API」です。DesktopDuplicationAPIもDwmGetDxSharedSurfaceと同じく画面情報をDirectXのテクスチャに変換するような仕組みです。こちらはちょっと仕事の多忙時期と重なりなかなか試す事ができず、暫く様子見で御座いました。

僅かな時間を見つけてはDesktopDuplicationAPIと格闘を繰り返し、安定稼動できるまで何度も失敗と成功の連続を繰り返しました。

そして長い年月をかけて遂にBrynhildrにDesktopDuplicationAPIを実装するまでこぎつける事ができました。こうしてBitBltに変わる新たな画面キャプチャー方式が誕生したのです。もうこれでBitBltで画面キャプチャーができなくなる事に怯えなくて済むんです。良かった本当に良かった。めでたしめでたし。

---

さて、長々と大長編で御送りしてみましたけど、よーわBrynhildrでDesktopDuplicationAPIが使えるよーなプラグイン?が完成したワケです。対応OSはWindows8以降にはなりますが、DWMをスルーできるので、DWMの30fpsの制限も取っ払われて、60fpsくらいまで出ますし、何よりDirectXのフルスクリーンゲーム画面が転送できる事がヒジョーに嬉しいですね。FF14とか。尚、皆様にもテストを御願いしたい所存で御座いますので、もうちょっとしたらプロトタイプをリリースしようかと思っておりますので御楽しみにー。

んなとこですー。


4件のコメント ... ( 管理人承認制 )



タイトルと記事の前半だけを読んで「公開停止という方向に向かうのかな」と少し勘ぐってしまいました。


60fpsいいですね。DirectXのフルスクリーン対応も待ち望んでいる人がいるでしょうし(^_^;
クライアントとして60fps出せるかはまた別問題でしょうけど。


ふんふん  2016/06/14


60fpsは解像度やコーデックによって出せたり出せなかったりするので、まだまだ要調整かと思ってます。詳しくは書きませんでしたけど、DWM環境ではBitBlt自体に速度制限がかかっているのではなく、デスクトップのデバイスコンテキストに速度制限がかかっているようですので、クライアント側ではDWM環境でも30fpsの制限はかからないはずなんです。ですのでクライアント側で60fpsで描画できるかどうかはCPUかGPUかコーデックか描画方式か解像度など次第ですかねw


IchiGeki  2016/06/15


言葉が足りませんでした…
ここで書いたクライアント=”Qt Brynhildr”を想定してまして、Qt自体がやや重いのでNativeなBrynhildrの性能には及ばないかもしれませんねぇ、という感じの意味合いでした。


> クライアント側で60fpsで描画できるかどうかはCPUかGPUかコーデックか描画方式か解像度など次第ですかねw


なるほど。いろいろと調整する必要がありそうですね。


いずれにしても、60fpsのBrynhildrリリース、楽しみにしております(^_^)


ふんふん  2016/06/15


タイトルで釣られた・゚・(ノД`)


とうふ  2016/06/18




... 不具合報告の際は、アプリのバージョンやOS等の動作環境の記載を御願い致します。

表記されている会社名・製品名・システム名などは、各社の商標、または登録商標です。
当サイトはAmazon.co.jpアソシエイトプログラムに参加しています。
© 2010-2023 KANEKO