korechi’s diary

とあるVR/ARエンジニアのブログ

Photonを使ってUnityで簡単なMMOアプリを作ってみる(下準備編)

サーバーとかほとんど触ったことない自分ですが、Unityで軽いMMO的なアプリを作りたくなったので挑戦したいと思います!
自分が自由に使えるサーバーは研究室にある1台のPC(CentOS)のみなので、流行りのクラウドサーバーを使ってみます

Photonに登録

まず、Photonとはさまざまなゲーム開発環境で使えるネットワークエンジンです
何より驚くべきは、基本料金が無料のところ
Photon realtimeなら同時接続可能なユーザー数が20人までならずっと無料で使えちゃう!!いったいどうなってるんだ。。

それではここからPhotonの公式サイトにとんで、メールアドレスを登録し届いたメールからパスワードを設定しましょう

Unityの設定

Photon Unity Networking Free のインポート

[AssetStore]→[Photonと検索]→[Photon Unity Networking Freeをインポート]
f:id:korechi:20161101173532j:plain
有料版ではなく無償版を選択しましょう

設定

[Window]→[Photon Unity Networking]→[PUN Wizard] を選択 f:id:korechi:20161101174235j:plain
そして[Setup Project]を選択し、AppIDに、photonのサイトのダッシュボードにあるアプリケーションIDを登録します
続いて[Setting]でregionを"jp"に変更

検証

[Photon Unity Networking]→[Demos]→[DemoBoxes]→[DemoBoxes-Scene]をダブルクリック
f:id:korechi:20161101175432j:plain
するとデモシーンが開くのでUnity上で実行します
f:id:korechi:20161101175644j:plain
上のようなゲーム画面が出力され、クリックしたらボックスが落ちてくればPhotonへの接続ができています!
非常に簡単!すげー!
実行環境のPCにアプリをビルドして複数同時接続が可能なことを確認するのだけでも楽しい。笑

これで設定完了です
次回は、実際にゲームを作っていきましょう!


参考記事はこちら

忘れがちで便利なコマンド(grepやlogの出力)

grep

ファイル名を指定して指定したフォルダ以下すべてを検索する

$ grep -e ファイル名 ./

make

makeでerrorになってしまう時にlogへ出力する

$ make 2>&1 | tee make.log

makeしたときにどんなコマンドが叩かれているか出す

$ make -n

install オプションをつけるとどこにinstallされるかもわかる

$ make -n install

Macで5ボタンマウスを使って”進む””戻る”をかんたんにやる

Windowsだとすんなり”進む戻る”ボタンが適応されるんだけど、なぜかMacだとすんなりいかない。。
そこで調べたらKarabinerを使えば解決しました!
Karabinerほんと使えるなー。これでますますOS Sierraにできなくなっちゃった 笑
1. Karabinerをインストール
2. Preferences -> Misc & Uninstall -> Open private.xml を選択
f:id:korechi:20161020133207p:plain 3. private.xml をなんかのエディタで開いて下のコードを上書き

<?xml version="1.0"?>
<root>
    <list>
        <item>
            <name>MouseButton 4 and 5</name>
            <identifier>remap.mouse_button4_5</identifier>
            <autogen>
                --PointingButtonToKey-- PointingButton::BUTTON4,
                KeyCode::JIS_BRACKET_LEFT, ModifierFlag::COMMAND_L
            </autogen>
                <autogen>
                    --PointingButtonToKey-- PointingButton::BUTTON5,
                    KeyCode::JIS_BRACKET_RIGHT, ModifierFlag::COMMAND_L
                </autogen>
        </item>
    </list>
</root>

もとに書いてある3行程度のコードを消して挿入するように
4. Change Key -> Reload XML を選択
5. Change Key -> MouseButton 4 and 5 にチェックを入れる
f:id:korechi:20161020133359p:plain

Daydreamまとめ(新規VR開発者向けに他VRと比較)

日本時間で2016年10月5日の朝1時頃にGoogle I/O 2016がありました
僕はDaydreamが目玉かと思ってたんですが、意外にもGoogleHomeやら別の製品の発表が多くてびっくり!
でも僕はやっぱりDaydreamが一番興味があるので僕なりにまとめていきます。今後の開発も見据えて

Daydreamとは

そもそもDaydreamってなんだろう?
意外と答えづらいですよね。多少語弊があるかもしれませんが簡単に説明します
DaydreamはGoogleが提供するVR向けのプラットフォームです
ここで言うプラットフォームとは → ヘッドセット、コントローラ、開発環境、VRホーム画面など(コンテンツは他の会社も作る)
つまり、「Daydreamを試したい!」って人は、
1. Daydreamが要求する水準を満たす高性能Android端末(現在はPixelのみ。あとはまだ未発売のPHAB2 ProとかGalaxy Note 7あたりも要求を満たすと思われる)
2. Daydream View(ヘッドセット)
3. Daydream用コントローラ
の3つを揃える必要があります

ハードウェア

まずはヘッドセットとコントローラ
こんな見た目らしい
f:id:korechi:20161005103346j:plain
使うときはスマートフォンを挟んで使う(画像ではPixel)
f:id:korechi:20161005103913j:plain
そしてコントローラ
f:id:korechi:20161005110044j:plain
このコントローラが割と優れもので、いろいろ値がとれるっぽい(多分ジャイロかな?さすがにヘッドセットからの相対座標は出せないかと) それにちゃんとボタンとタッチパッドもついてるし、収納できるの割と便利
f:id:korechi:20161005110501j:plain
ヘッドセットの値段は79ドル(8,000円ちょっと)。11月発売らしい

ソフトウェア

これはまだ謎が多い。僕の想像によりますが、おそらく新しいAndroidOSにVRモード(アプリかもしれない)が追加されるて、それを使うとVR用のホーム画面がスマートフォーンに表示されるんじゃないかな
そしてアプリはGooglePlayでダウンロードして遊ぶ
多分こんな感じになると予想。GearVRと同じ感じかね

他VRと比較(新規開発者向け)

とりあえずVR系のアプリを作ってみたいけど、どれ向けに作れば良いか分からない!
という方多いんじゃないでしょうか?かくいう僕もその一人です
なんたって今は、GearVRDaydreamCardboard向けPC向け(Oculus、Viveなど)と選択肢は様々です
なのでまずはこれらを比較するために、それぞれの特徴を簡単に表にまとめてみました!
(注)僕の予想がかなり入ってます

機種 体験しやすさ VRの品質 コントローラ アプリ数 価格 これからの普及
(予想)
GearVR
Daydream
(予想)
◯ー
Cardboard向け
PC向け

ここでどれを選ぶか考えるためにいままでの技術を振り返ってみます
ガラケーの時代から日常生活では、多機能で仕事ができる端末+携帯できる端末、この2つが広く利用されています。VRが出てきたからといってこの形はしばらく変わらないと思います
もちろんタブレットやスマートウォッチなども最近見ますが、PC→タブレット、携帯端末→スマートウォッチと姿を変えようとしているだけで必要とされるのは本質的には上の2つです
これをVRに当てはめれば、多機能なPC向けVR携帯しやすく普及が見込めるVR、この2つが今後のVR界で重要な役割を担っていくのではないかと思います
じゃあ、携帯しやすく普及が見込めるVRって何?
これはDaydreamかGearVRが今のところ濃厚です。ただ、GearVRはGalaxyにしか対応していないです。特化している分性能は高いのですが、普及という意味では×
それに対して、メーカーを選ばないDaydreamはより普及しやすいです
VR品質に関しても時間の問題で、スマートフォンのトラッキング技術の向上や、アプリの最適化が進められれば進められるほどGearVRとDaydreamの性能差は埋まっていくでしょう
また、Daydreamにはコントローラがあるという点も非常に大きいです。ゲームをする上でコントローラはかかせません
(僕は足用コントローラも欲しいですが、それはしばらく待ちましょう)

結論

なので、今からVR用アプリを作りたい方には、
1. Daydream向け
2. PC向け (OculusやVive) このどちらかで開発することをおすすめします!!
今後の記事ではDaydream用アプリの作成方法を紹介していくつもりです

参考

gigazine.net

Mellanox純正ドライバをリビルドしてinsmodする手順

CentOS 6.6の環境でテストしています
Redhat系かDebian, Ubuntu系かでちょっと変わるので注意してください

ドライバのダウンロード

ここから自分の環境にあったものをダウンロード

中身を解凍

ダウンロードしたところにmlnx-en*.tgzがあると思うのでそれを解凍します

$ tar -zxvf mlnx-en-*.tgz

すると同じディレクトリに同じ名前のフォルダができます

RPMSを解凍

$ cd mlnx-en*
$ cd SRPMS
$ rpm -ivh mlnx-en*.src.rpm

これでrpmファイルが解凍されます
解凍されたものはホームディレクトリの下のrpmbuildディレクトリ下にあります
どこに展開されるかは

$ rpm --showrc | grep _topdir

で確認できます

ドライバのリビルド

まずはじめに*.koファイルがどこにできるかを調べます(そこらへんで作業すれば良い)

$ cd BUILD
$ find . * | grep .ko
/mlnx-en-3.3/obj/default/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko

つまりmlx4のドライバをいじりたいなら

$ cd mlnx-en-3.3/obj/default/drivers/net/ethernet/mellanox/mlx4/

でいろいろした後に

$ cd ../../../../../
$ make

makeすれば良い

ドライバのinsmod

これは下のようなinstall.shを自分は作った

#!/bin/sh
MODULE=mlx4_en
DEVICE=mlx4
insmod mlx4_core.ko
insmod -f ./${MODULE}.ko
MAJOR=`cat /proc/devices | awk "\\$2==\"${DEVICE}\" {print \\$1}"`
rm -f /dev/${DEVICE}
mknod /dev/${DEVICE} c ${MAJOR} 0

uninstall.shももちろん用意しておくと便利

#!/bin/sh
MODULE=mlx4_en
DEVICE=mlx4
rmmod ${MODULE}
rm -f /dev/${DEVICE}
rmmod mlx4_core.ko

あとはこれらをまわせば良い

追記

install.shとuninstall.shがいけてなかったので、

$ sudo insmod mlx4_en.ko
$ sudo rammed mlx4_en.ko

を使うことにした

Mellanox NICで"ethtool --set-priv-flags"ができないのはドライバに原因があった

Mellanox connectx-3 pro を使ってパケットのやりとりをしているんですが、なぜかCPU割り込みが特定のCPUに偏る問題に直面しました
こんな感じ
f:id:korechi:20160906204110j:plain
CPU8とCPU11あたりに偏っているのが分かりますよね
そこでRSSハッシュ関数が悪いのかと思い、ここの3.7.1にあるRSS Hash Tuningにあることをやろうと

# ethtool --set-priv-flags p3p1 mlx4_rss_xor_hash_function on

とコマンドを打ったら

No private flags defined

と怒られました。なんだこれ?
そこでいろいろ調査していたらどうも僕の使っているmellanoxのデバイスドライバが悪いということが分かりました
自分はlinuxカーネルソースコードをダウンロードし、その中のmlx4のドライバを再構築してできた*.koファイルをinsmodして使っていました
実はそれがあまり良くなく、mellanoxの公式サイトから純正ドライバを使うべきだったみたい
そこで、mellanoxの公式サイトからドライバをダウンロードしてそれを使ってみたら

ethtool --set-priv-flags <interface> mlx4_rss_xor_hash_function on

が機能しました

pingでSourceIPやらDestIPを変えたらちゃんと複数のCPUに割り込みが分散しました!この通り8つのCPUに分散されています f:id:korechi:20160906205648p:plain なんで16このCPUに分散されないのかと言うのは多分この論文のfigure3にあるようにあるように、NICにつながっているCPUが特定のCPUだけで1つのNICからじゃ届かないCPUがあるのが原因じゃないかな?たぶん
ここについては要調査が必要かも。けれど、とりあえずここまで分散されればオッケーなので今回はここまでにしておきます


結論:linuxカーネルソースコードの中にあるドライバを過信するのはよくないですね。ちゃんと公式のものをダウンロードして使おう

その他学んだもの

大量にpingをうつオプション

# ping -f 

これ地味に便利。こんなオプションがあったなんて知らなかった
ただ、rootでしか使えないのは注意