終焉
ついに長い歴史に終わりの時が。カテゴリに「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とか。尚、皆様にもテストを御願いしたい所存で御座いますので、もうちょっとしたらプロトタイプをリリースしようかと思っておりますので御楽しみにー。
んなとこですー。