Androidスマホってゲームに向いてない？

# 更新履歴
**2019/07/31；当人コンパス引退により続きの記述は無しとします。**
**2019/11/28；ノリで復帰したので続けましょうか...え、続けないほうがいい？**

## はじまりはここから...  
### ようこそ、#コンパスへ
開幕からネタ満載かよ...（ネタはどこだよ）  


## #コンパスとは  
 - `#コンパス 戦闘摂理解析システム`が正式名称です。  
 - 3on3でプレイヤ同士が対戦するオンラインゲームです。(2on2モードが搭載されてますが...★爆殺★)  
 - 勝負は基本3分。陣の取り合いをするのが主な趣旨。（逢瀬大好きなので試合中に二発打ち込む筆者♥）
 - カードを四枚組み合わせ装備して戦うことができる戦略性も充実。（これが課金しないと結構やべぇです）
 - 3Dフィールドで行動の幅が広がる！（そろそろゲームエンジン独自にするのやめん？30FPS固定きついんだが...）

## 本題に移りましょう...
ちょっとわけあってAndroid端末でゲームをしようということに。
自分の端末はわりと問題ないのですが...まぁお友達の端末の動作がぁぁって感じです。  

「Android端末でゲームとか(笑)」というiPhone勢は今も結構いると思います。  
Androidが登場した初期は構成がボロボロで、iPhoneには体感的に負けていました...  

> Androidでゲームをするとカクついて話にならない。  

こんなこと言われるようなひどい時代があったのでした...まぁ実装とその次代のメーカの問題なんですけれどね。 

 - Regza Phone（おいやめろ）


## 昔のAndroidスマホとiPhone

### iPhoneは...
 - とにかく使えることを前提として開発（UI/UX）
 - ハードとOSの製造プロセスはに統一的

**最適化路線で、動作安定性が高い**
→ 競合が存在しないため価格は高価格に推移し、値下がりもしづらいブランド品のような扱いに。

### Androidスマホは... 
 - ユーザがカスタムしていける自由さを前提に開発（OSS）
 - OSはAndroid（Linuxベース）にメーカーカスタムが加わったものと、そのメーカのハードがアセンブルされていることが多い。

**汎用化路線で、独自の機能が搭載。**
→ 競合が多いため価格は低価格に推移し。新しいものが次々と現れるため値下がりが消耗品並に早い。

## 今のAndroidスマホとiPhone
### iPhoneは...
 - 洗練されたプラットフォームは昔と変わらない
 - Android端末には既に実装されているものが多い機能が搭載されるようになる
   - 防水
   - 非接触IC決済機能   
 
 
**最低限欲しかった機能上記機能の搭載により、Android使ってたけどiPhoneでいいじゃんというユーザも増えたことでしょう**

### Andoridスマホは...
 - パフォーマンスに大きく影響していた"Dalvik VM"を廃止。"ART runtime"に変更。  
   （コードコンパイル処理がインストール時点で実装されたことで、動作が劇的に高速化しました。）  
 - 国内端末ではSoCがSnapdragon/Kirin/MediaTekくらいになってきた。（ように見えるが、他国ではどうか不明）
    
**iPhoneより高額な端末も登場するほどに...ゲームが快適に動くゲーミングスマホはGPUのパワーが強いSnapdragonが多いイメージ。**


## ...で？なんで未だに同時期に発売されたiPhoneとAndroidスマホでなめらかさがこんなにも違うの？

ここまで来てもおそらく

> "iPhone最高！Androidはゴミ！"

とイキるキッズも多いことでしょう...悲しいですね、義務教育の敗北というのは。
えぇ、とっても悲しいです。もっと世界は広いということは知っておいてほしい。


何故Androidは性能が悪く見えるのか。順に追っていきましょう。  

1. 初期の国産メーカスマホがあまりにも酷かった
   - これはメーカがあかんかったやつですね。**REGZA Phone**（もうやめてあげて）。
   ハイスペックと謳いながら動作はガクガク、OS設定サポートもろくにせずアップデートできないバグをアップデートで対応しようとした伝説とかありませんでしたっけ？

1. アプリケーションの実行環境が違う
   なに当たり前なこと言ってるんだと思いますが、実行方法がまるで違います。  
   - iPhone
     - ネイティブコードを本体リソース直接で実行できます。  
    →　これは、ハード仕様が統一されているからこそできることですね。  
   - Androidスマホ  
      - ネイティブコードをVMという仮想端末上で実行しています。  
        →　ハードウェア構成がメーカによって違う為、共通した動作になるように仮想の環境でアプリを実行しています。  
          見た感じは直接実行しているように見えますが、仮想的なディスプレイに描画している分の体感差がでます。  

1. メモリ管理方法が違う
    何それおいしいの？おいしくありません。  （説明はかなり端折りますｊ）
   - iPhone
      -  リファレンスカウント：  
         参照回数をカウントして、カウントが0になったものから破棄していく。  
        （まめに処理するもので、作業環境に影響が出づらい）  
　　→　要はアプリは立ち上げたままにしないと、定期的に毎回メモリをリリースしてしまう。  
**低リソースでも快適な反面バッテリが短寿命化しやすい。**
   - Androidスマホ
      - マーク・アンド・スイープ：  
        全体をスキャンしてオブジェクトに印が付いていなければ破棄していく。  
       （まとめて処理するもので、作業環境に影響が出やすい）   
   → 要はメモリ上にアプリケーションが存在している場合はめちゃくちゃ立ち上がりが早い。  
**低リソースのマシンではすぐにメモリ解放が走ってしまうのでモッサリ動作の発生・バッテリ短寿命化**
      
       ゲーム中突然重たくなるというのはメモリ開放が開始されている可能性がある。
       早急に新型の機種に買い替えを検討するべし。
       CPUパワーに余裕があるならば、メモリ開放アプリをゲームの最中で定期的に発動するのも◎



3. 画面の解像度
    画面の解像度がグラフィック性能に見合わず、高負荷に耐えられないということもあります。  
    これに関しては本来はメーカが設計して自分で変えられるように展開してあげるといいですよね。

    **CPUとメモリは多少余裕あるのに描写が遅いなら、解像度を疑え。**

  > TIPS: **SoC開発側の努力とランタイムの改善**    
  SoC開発側のたゆまぬ努力のおかげで、今となっては大きな体感差を感じることはほぼ無いでしょう。  
   

## 結論：Androidはゲームに向いているの？   

### A. いいえ、向いていません。  

   向いてはいませんが、新型機種に変更することによってネイティブ動作なiPhoneに近づきます。
   お金があるなら**Snapdragon835**の端末が今なら値段も下がっていてコスパいいですよ。


### でも今の機種からまだ変えられない...

   暫定対処は可能です。

  1. ミドルスペックな端末（格安スマホみたいなグレード：2万~4万）
      - 発熱対策は物理で行いましょう。  
      （スマホクーラーを買う...ドスパラのスマホ用ゲーミングクーラーが1500円だから買え！）
      - メモリ解放アプリでゲームのロード中にメモリ解放してあげてください
        （心配なら手動で、A-Teamさんがゲームブースター作ってくれてるので使ってみて）
      - 上級者向け：画面の解像度を落とす  
       （adbコマンドで画面の解像度を変更します）
      
  1. 二年前程度のハイエンドな端末（機変しろ）
      - 発熱対策は省電力モードで解決する場合があります。  
      （XperiaだとSTAMINAモードでなるべく制限しない設定にすると幸せになれるかも）
      - メモリ解放アプリを自動稼働にして、優先度低で回しておくと快適になる。  
      （心配なら手動で、A-Teamさんがゲームブースター作ってくれてるので使ってみて）
      - 上級者向け：画面の解像度を落とす  
      （adbコマンドで画面の解像度を変更します）  
      
  1. 中古のiPhoneを買える  
      - ゲーム機として割り切れる勇気と少しお金があるならこれが一番手っ取り早い。  
      （キャリア判定▲とか安いからねらい目）


## 上級者向け：画面の解像度を落とす  
画面の解像度を落とすことにより、GPUへの負荷を軽減できます。   
発熱が抑えられるようになり、快適にゲームがプレイできるようになります。

### ADBの有効化
- 条件
  - Android 5.0 以降
  - ADB が使えること
  - 壊れても泣かないモチベーション
  - WindowsOSの入っているPC（今回はこれの想定）

###  PC側準備
#### ADB環境の導入
1. [15 seconds ADB Installer](https://forum.xda-developers.com/showthread.php?t=2588979)を入手する
2. インストーラを起動してプロンプト通りにすべて肯定して進みます。 
3. インストール完了画面が出れば完了。

#### ADB環境の起動
1. [Windowsキー]+[R]を同時に押して"ファイル名を指定して実行"画面を立ち上げて以下をコピー・ペーストします  
   (UACに実行するか尋ねられるので聞かれたらOKを選択する。)

```{command_line.ps1}
powershell.exe -Command "Start-Process powershell.exe -Verb runas"
```


### スマホ側準備
#### ADBを有効化

1. 設定アプリを開きます。
1. [システム] を選択します（Android 8.0 以降のみ）。
1. 一番下までスクロールして [端末情報] を選択します。
1. 一番下までスクロールして [ビルド番号] を 7 回タップします。
1. 前の画面に戻り、下部に [開発者向けオプション] が表示されているか確認し、開発者オプションを表示します。
1. [USBデバッグ]にチェックを入れます。（許可するか確認されたらOKをタップ）。
2. PCとスマホを接続するとフィンガープリントの確認がでます。許可してください。  
 （次から確認しないにチェックを入れておくと幸せになれることもある。）

> 参考:  [デバイスの開発者向けオプションを設定する](https://developer.android.com/studio/debug/dev-options?hl=ja)

### 画面解像度の変更

立ち上げておいたPCコンソール画面にて以下のコマンドを発行します。  
今回は1080x1920(スマホは縦持ちなので右側の数値が大きい)で設定しています、画面解像度の数値には十分注意。  

```{command_line.shell}
adb shell wm size 1080x1920
adb shell wm density 300
```

ちなみに、#コンパスをプレーする場合は2160x3840@800に設定してからグラフィック1でプレーするとあのカクつきが全くなくなります。  
（Xperiaの場合は2160x3840で電話アプリが着信があると頻繁に強制終了するので1890x3360@600が最適値です）  

なんで解像度上げたら快適になるのかはよくわかりませんが、自分とフォロワーさんの情報だと...
[@Usamimi_Latias](https://twitter.com/Usamimi_Latias)： Xperia XZ/コンパスグラフィック1設定で改善認められる。
[@amatuyu8810](https://twitter.com/amatuyu8810)：AQUOS Sense/コンパスグラフィック1設定で改善認められる。
って感じです。(実験したAndroidコンパスプレイヤーの方情報求む)

```{Best_setting.shell}
adb shell wm size 1890X3360
adb shell wm density 600
```

> 参考：[16:9一覧表](http://himagine.s20.xrea.com/pc/hdtable.html)  

設定を元に戻したい場合は以下のコマンドを実行します 

```{command_line.shell}
adb shell wm reset
```