LoginSignup
3
4

More than 3 years have passed since last update.

Windows で OpenGL/Vulkan アプリを動かして画面をイントラネットで VNC などで転送したいメモ

Last updated at Posted at 2020-05-10

背景

  • OpenGL/Vulkan を使う Windows 10 グラフィックスアプリの画面を Linux PC などに転送したい
  • 同じ部屋や, 異なる部屋にある PC 間で, イントラネットで使う(インターネットで外から繋ぐなどはしない)
  • RDP だと OpenGL 2.x(?) までなので使えない.
    • 追記: OpenGL/Vulkan 機能使えました. おまけ参照.
  • Chrome Remote Desktop だと, 拡張入れるのが気になるし, 認証で一度 Google サーバに繋がないといけないのでめんどい.

VNC を試します.

VNC は, free(OSS) は 3 種類ほどあります(TightVNC, UltraVNC, TigerVNC)

まず, TigerVNC は今回の用途では使ってはいけません. とっても遅いです. これは実装上しょうがないようです(Java だから?).
私も試しましたが, 使い物になりませんでした.

TigerVNC 1.6.0 on Windows 10 running as a Service is unbearably slow and does not work in user mode. [$200]
https://github.com/TigerVNC/tigervnc/issues/277

$200 のバウンティがついていますが, 誰もやりそうにないですね...
(issue が上がったのが 2016 年なので, 1 BTC にしておけばワンチャンあったかも?)

Ultra VNC

UltraVNC を使います(ダウンロード URL が, 何やら amazon へのリンクが入っていてややあやしい. 気になるひとはソースコードからビルドするのがいいかもです).

最近だと mirror driver がデフォで有効になっていました.

UltraVNCにmirror driverはもういらない
https://kulog.org/pc/software/k9067/

Windows 10 側で, 5900, 5901 あたりのポートを開放しておく必要があると思います.

VNC client

VNC client は jpeg 圧縮しないのを選べるものを使いましょう. jpeg 圧縮すると画面の彩度が落ちてしまいます.

tighervnc の viewer(Ubuntu で apt で入る)は jpeg off にできました.

Ubuntu Desktop 標準(?) の Remmina では設定できないようでした.

10 GbE/IB ?

1 GbE だと, 2.5K で 3~4 fps(全描画)という感じです. ネットワーク転送量は 500kb/s くらいで, viewer 側の圧縮率を下げてもあまり変わりはありませんでしたので, どこか CPU あたりでボトルネックがあるのかもしれません..

10 GbE など高速ネットワーク + 完全非圧縮転送だと, より fps が稼げるかもしれません.

WebRTC, zoom や VDI?

昨今では, 仮想で動かして PCI-ex の画面データ(?)を転送する方法があるようですね(VDI?). ただ, 基本サーバーとか向けのようです.

zoom(これも WebRTC?) やらゲーム配信で, 画面のストリーミング方法も出てきているので, 画面転送はこれらで, マウスやキーボードなどは VNC や Synergy など経由などでやるという手がありそうです.
(nomachine とか?)

自宅サーバのデスクトップへブラウザからアクセスできるように「noVNC」を設える
https://qiita.com/knaka/items/b61e0cb0b5d07d2527b2

Stream a remote screen with WebRTC
https://viscarra.dev/post/webrtc-remote-screen/

noVNC あたりで画面は websocket で非圧縮転送, というのがイントラネット向けではいいかも?

(伝統的な) RDP, VNC を使って画面転送, リモートデスクトップというというのは廃れていくのかもしれません.

Parsec

優秀な仮想化若人さまから, Parsec(Haskell PEG parser library ではない)を教えていただきました.

アカウントなどでの認証でインターネットアクセス(Parsec ログイン)必要になります.
一応, LAN のみで画面転送できるようですが,

設定パラメータがなくなっていたりするので, 最近はどうなのか不明です.

ただ, Linux クライアントは, 対応する GPU を搭載していても nvenc(h264/h265)未対応のようで, SW デコード(?)で jpeg 系圧縮オンリーでした.

jpeg 系だとやはり彩度がいくらか落ちてしまいます. LAN モードでは非圧縮転送オプションとかほしいですね.

自前でつくりたい...!?

画面キャプチャ自体は, Windows の標準機能(or Chrome/Electron) などで取得できるようなので,
LAN 用途であれば仕組み的にはそれほど難しくないと想像できます.

リアルタイム画面取得 + 非圧縮(zstd でリアルタイム圧縮/展開)で Websocket or IB RDMA 転送するツールを作りたくなってきますね!

RDP

RDP でも, OpenGL/Vulkan 有効にできました(NVIDIA だけ, 制限がかかていた(が, 最近開放するパッチ(?)が出た. しばらくは使えそう?))

OpenGLを使えるリモートデスクトップを構成する
https://blog.techlab-xe.net/enable-opengl-rdp-nvidia/

OpenGLを使えるリモートデスクトップ その2
https://blog.techlab-xe.net/check-opengl-rdp-intel-amd/

ありがとうございます.

VK_NV_ray_tracing も使えましたのでレイトレ開発がバリバリできますね!

Alacritty Terminal を使う

GPU が使えるので, 爆速ターミナル Alacritty も動きます.

Windows の Terminal を変えた
https://qiita.com/kikuchi_kentaro/items/040aa16979eab9ae0af6

RDP で非圧縮相当(ロスレス or YUV444?)であれば, テキストくっきりでかなりいい感じに動きます.
(レイテンシは macOS Terminal くらいあります) Linear スイッチキーボードなど, 反応はやいキーボードと組み合わせするとよりベター.

10 GbE で非圧縮転送.

TP Link の激安 8 port 4 万円スイッチ + 10 GbE カードで 10 GbE 接続ためしました.

iperf での実測は 6 Gbps でしたので実質 5 GbE くらいでしょうか.
(スイッチ的にはノンブロッキングっぽいのですが, ジャンボフレーム使わないとフルスピード出ないとかですかね)

上記 https://blog.techlab-xe.net/enable-opengl-rdp-nvidia/ を参考に RemoteFX(32bit) + 非圧縮設定にしました.

タイルで画像転送しているためか, タイル状アーティファクトありますがまあ慣れれば問題ないでしょうか.
2.5K 解像度でも 24 fps くらいで転送できており, 圧縮によるノイズや彩度低下がなくて非常に快適です.

TODO

  • TightVNC を試す(ひとまず UltraVNC の速度で満足してしまったので試していません)
  • UltraVNC の zstd 圧縮を試す.
  • 少なくとも, 10 fps くらいは出せるようにして, Blender などをそこそこいい感じに動くようにしたい
    • 10 GbE でいい感じに動きました.
    • RDP で非圧縮モード(?) RemoteFX or True Color(32bit) でいけました
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4