背景
GWで実家に帰省するにあたり、普段はWindowsの性能が良いノートPCなどを持っていくことにしているのですが、今回はちょうどそういった端末が故障などで手元にありませんでした。
新たに買おうとも考えましたが、持ち運びができる高性能Windows端末は高いです。とにかく高い。
最近はミドルクラスのAndroid端末もかなり安くなってきているので、自宅の仮想マシン内のVM(Windows)へリモートアクセスすることで、代用できないかと思いつき実施した内容になります。
モチベーション
- 自宅の外でもゲームと開発がしたい
- 高性能なWindows端末は高いので、安価なAndroid端末で済ませたい
- ゲーミングノートとかまともなもの買おうとすると2,30万〜とか当たり前……
- 技術的興味
利用端末
- Xiaomi Pad 7
- クライアント用
- ミドルクラスとしてコスパ◎
- 公式でカバーになるキーボードが売ってる
- Persecでリモート接続
- Proxmoxサーバー
- ホスト用
- VMでWindowsを稼働
- CPU: Intel Core i9-9900k
- GPU: RTX2080
- Windows VM へパススルー
- 回線
- Softbank光
- たまにパケロスがある
- UP/DOWNともに600Mbpsくらい(たぶん)
- Softbank光
課題
Persecを通常通りクライアント端末とホスト端末両方にインストールすればリモート接続するには問題ないのですが、ここでいくつか課題が上がります。
- Xiaomi pad 7の公式キーボード(Focus Keyboard)では、ESCキーと GRAVEキーが同じ箇所に割当られている
- AndroidはESCキーに戻る動作が割り当てられている
- Persecでリモート接続中にESCキーを入力すると、アプリが戻ってしまう
- Xiaomi Pad 7ではMETAキー(Windowsキー)で端末独自のショートカット動作をする
- Persec側でMETAキーとして認識してくれない
さらに、今回の課題解決に当たっては以下のような思いがあります。
- root化することは避けたい
- Xiaomi端末はroot化が面倒くさい&時間がかかる
- バックグラウンドアプリを常駐させることは避けたい
- Android端末を利用していると、バックグラウンドアプリをすべて閉じる動作を頻繁に行うため
User-installable keymapsの利用
Xiaomi Pad 7 focus keyboardは英字配列です。GRAVEキーが押せないのは話しになりません。
また、ESCキーが戻る動作をする以上、それも解決する必要があります。
そこで、Android4.1以降に実装されているらしいUser-installable keymapsという機能を使います。
これにより、ハードウェアキーボードのキーマップを任意に変更することが可能で、かつバックグラウンドアプリとして常駐するようなことが起こりません。
詳細
- アプリの作り方は先人たちの記事を参考
- 今回利用したkeymapのファイルは以下に記載しておきます
# OVERLAYなんてタイプはドキュメントに載っていませんが、既存設定の上書きとして存在するので利用
type OVERLAY
# ESCキーをGRAVEキーで上書きします。
map key 1 GRAVE
Auto Hotkeyの利用
GRAVEキーは利用できるようになりましたが、ESCキーとMETAキーは未だキーボード上に存在しません。
PersecはどうやらUnicod変換された入力を送信しているわけではなく、それより低レイヤーでキーボードの入力をフックしているようです。そのため、User-installable keymapsではこの問題が解決しません。
色々調べてみましたが、root化せずにこの問題を解決するのは困難みたいです。
そこで、ホスト側のVM内でAuto Hotkeyを使い、利用しないキーにESCキーとMETAキーを割り当てることで対処します。
詳細
- 以下のスクリプトを作成、Autohotkeyでコンパイル
- 実行ファイルになったものをスタートアップフォルダへ格納
- これにより、起動するたびにAutohotkeyが適用される
#NoTrayIcon
RAlt::Esc
RCtrl::LWin
所感
今回構築した環境で、リモート越しでも開発作業に支障がない程度の操作感で利用することができています。
ゲームに関してはネットワーク速度の関係で、リアルタイム性が重要なゲームは厳しい印象です。(おそらくネットワーク速度による)
手前味噌ですが、この記事が誰かの参考になれば幸いです。
おまけ
この環境を利用していて発見したメリットとして、バッテリーの持ちがかなり良いというものがあります。(Android側はゲーム処理を一切せず映像通信してるだけなので、当然といえば当然ですが)
Xiaomi Pad 7のバッテリー容量がそもそも多めなのもありますが、実家ではほとんどバッテリーを意識せず使えています。