時には立ち止まってみるのもいいよ

仕事の合間の息抜き。やってることは仕事と同じ。

Raspberry PI2 でPCゲームをリモートプレイするのだ

ここに記事を書くのは久しぶりだ。。

忙しくて書いてる暇がなかったからなんだけど、時間ができて速攻GTX960を買ってFF14がPS4からPC版に移行したのは我ながらアホだと思う。

ついでに言うとサーバもAlexからShinryuに移動しますた。

 

というわけで、最近のGeForceでしかできないGameStreamという機能を使ってみようというのが今回の試みである。

 

GameStreamってのは、要するにPS4 → PSVitaで言うところのリモートプレイのことですな。

GeForceドライバと一緒にインストールできる、GeForce Experience(GFE)っていうのを使って、PCのゲームを実行してレンダリングした画面をGeForce内蔵のH.264エンコーダでよその端末にストリーミング配信する、っていう機能である。もちろん、リモート端末からゲームコントローラやマウス・キーボードで操作できる。

 

もともとはnVidia謹製のSHIELDってゲーム端末向けの機能のはずなんだが、通信プロトコル自体はとても単純でリモート端末用にmoonlightっていうアプリが公開されている。AndroidiOSでも動くようだが、ここはあえてRaspberryPIで動かそうと!いうわけだ。いや、動かしてる人がいるのでオレもオレも!というわけだ。

かなり前からあったものなので知ってる人には何をいまさらってな感じだろうが、そんなことはどうでもよろしい。

 

moonlightをraspberrypiで動かしてる動画はこちら→

www.youtube.com

この当時はmoonlightじゃなくてlimelightって呼んでたらしい。

 

PC側の準備

GameStream + Moonlightを使用するには、まずPC側に

  • GeForce 650以上
  • GeForce Experience 2.2.1以降と対応ドライバ

が必要だ。

GFEを起動して「ゲーム一覧を更新」すると、PCにインストールされている&GFEが対応しているゲームを探し出してくる。GameStreamを使うには、単にインストールされているゲームをそのまま実行するのではなくて、GFEから起動する必要がある。

想像だが、GFEがゲームプロセスに介入してDirect3Dレンダリングパイプラインをフックしているのではないかと思われる。そんなことをすると普通はゲーム側のプロテクトに引っかかるので、ゲーム側にもGFEに対応させる何かの処理が入っているのかもしれない。

 

さて、めでたく目的のゲームが見つかった場合は、「ゲーム」タブに表示されて、PC側の準備は完了だ。

f:id:poiuy56:20150604004659p:plain

 

RaspberryPIの準備

moonlightはgithubからソースを入手して自分でコンパイルする。

のだが、どうも本家サイトのソースはStableなWheezyベースのRaspbianではなくてJessyベースの何かを使っているらしく、バージョン違いやら何やらでコンパイルができない。

んで、ここらへんを参考に、必要なパッケージたちをインストール。

$ sudo apt-get install cmake libopus-dev libexpat1-dev libjs-jquery libssl-dev libasound2-dev libudev-dev libavahi-client-dev libcurl4-openssl-dev

wget http://archive.raspbian.org/raspbian/pool/main/libe/libevdev/libevdev-dev_1.4.2%2bdfsg-1_armhf.deb
$ wget http://archive.raspbian.org/raspbian/pool/main/libe/libevdev/libevdev-tools_1.4.2%2bdfsg-1_armhf.deb
$ wget http://archive.raspbian.org/raspbian/pool/main/libe/libevdev/libevdev2_1.4.2%2bdfsg-1_armhf.deb
$ sudo dpkg -i libevdev*

次に、 ソースを取得。本家のirtimmerじゃなくて7hunderbugからmoonlight-raspbianブランチを持ってくる。。

$ git clone --depth=1 https://github.com/7hunderbug/moonlight-embedded/ -b moonlight-raspbian

$ cd moonlight-embedded

$ git submodule update --init

あとは、ビルドだ!

$ mkdir build

$ cd build

$ cmake ../

$ make

$ sudo make install

これでめでたく、/usr/local/bin/moonlightが生成される。

さぁ、使ってみるのだ!

GFEを使用しているPCのアドレスを192.168.0.5として、まずはペアリングを行う。

$ moonlight pair 192.168.0.5

Generating certificate...done

Please enter the following PIN on the target PC: 1234

みたいなのが出る。最初に証明書だか鍵だかを作成している様子で、カレントディレクトリにclient.p12とclient.pemというファイルが出来上がっている。以降、moonlightコマンドを実行する際にはこのファイルをカレントにおいて実行する必要があるようだ。

 

んで、ターゲットPCでPINコードを入れろと言われてるのでPCを見てみると、

f:id:poiuy56:20150604013432p:plain

おー。なんか出てるー。

ここにPINコードを入れればコンソールに"Paired"と出て、認証はOKだ。

あとは、ゲーム実行コマンド…

$ moonlight stream -app "Final Fantasy XIV: A Realm Reborn" 192.168.0.5

おおおおおお。でたー

ってスマホ会社に忘れてきたから写真とれねーーーww

 

デフォルトでは720pで、速度的には何の問題もないのだが、解像度を720にしてしまうとFF14のUI配置が崩れてしまうので1080に変更。

1080ではさすがに60fpsでは間に合わないらしく、2秒くらい遅延が発生して却下。30fpsだとなんとか使える感じ。

(※) READMEにはデフォルトが30fpsと書いてあるけど、明示的に30fpsを指定すると遅延が減った。そして720のときより明らかにフレームレートが落ちてる。ので、デフォルトは60fpsなんじゃないかなと。。まぁ、720でも1080でも30fpsなら使い物になります。

 

これ用にUSBのゲームコントローラもう一個買ってこようかな。。

 

ということで、GTX650以上&RasPI持ってる人はおためしあれ~