2014年5月21日水曜日

[UE4] Androidでレンダリング解像度を変えてみよう!!

[UE4] Androidパフォーマンスチェック!!、の続きです。

さて、せっかくなので次はレンダリング解像度を変更して、パフォーマンスをみてみよう!!
UE4には、起動時にデバイスの種類を判別して、そのデバイス合ったパフォーマンス設定を適用する、という機能があります。
起動時のログをみてると、Nexus7(2013)は、DeviceProfile=Android_Adreno320で実行されているのが分かります。

各DeviceProfileの設定は、以下のファイルに書かれています。
<Install Dir>\Unreal Engine\<Version>\Engine\Config\BaseDeviceProfiles.ini
----------------------------------------------------------
[Android DeviceProfile]
DeviceType=Android
BaseProfileName=
+CVars=r.MobileContentScaleFactor=1
...
[Android_Mid DeviceProfile]
DeviceType=Android
BaseProfileName=Android
+CVars=r.MobileContentScaleFactor=0.8
...
[Android_Adreno320 DeviceProfile]
DeviceType=Android

BaseProfileName=Android_Mid
----------------------------------------------------------
この場合、
[Android]の値 -> [Android_Mid]の値で上書き -> [Android_Adreno320]の値で上書き
となるので、Nexus7(2013)でのMobileContentScaleFactorは0.8という事になります。

で、MobileContentScaleFactorがどういう値かというと、コードには、
// CSF is a multiplier to 1280x720
と書いてあるので、1280x720をベースにした解像度のスケール値という事のようです。
(ちなみにiOSでは、違う意味合いのようなので注意!!)

という訳で、レンダリング解像度を変更してみましょう。
プロジェクト特有のiniファイルは、
<My Documents>\Unreal Projects\<Project Name>\Config
に置くようなので、今回は、
<My Documents>\Unreal Projects\Mobile Temple 4.1\Config\DefaultDeviceProfiles.ini
というファイルを作成して、以下のように記述します。
----------------------------------------------------------
[Android_Adreno320 DeviceProfile]
DeviceType=Android
BaseProfileName=Android_Mid
+CVars=r.MobileContentScaleFactor=0.4
----------------------------------------------------------

さて、これで作ったビルドを実行してみると、結果は以下の通り。
ScaleFactor=0.4, 12FPS, Frame:84ms, Draw:40ms

レンダリング解像度が半分になった!!
デバッグ出力が画面からはみ出ちゃって、読めなくなっちゃったけど、まあその辺はご愛嬌(^_^;
前回のScaleFactor=0.8のデフォルト状態と比べても、ほとんどフレームレートは変わってないので、drawcallそのものがボトルネックみたい、という読みは当たってたっぽい(^o^)

せっかくなので、他の値も試してみました。
ScaleFactor=1.0, 12FPS, Frame:80ms, Draw:35ms
ScaleFactor=1.0。
あまりフレームレートは変わらず。Adreno320なら720p位がちょうどいい落としどころなのかも。

ScaleFactor=2.0, 7FPS, Frame:138ms, Draw:68ms
ScaleFactor=2.0。
超綺麗、だけどさすがに重い。っていうかデバッグ出力が小さすぎて読めない(^_^;
さすが720pの倍解像度...、という訳ではなくてNativeResolutionでClampしているようなので、Nexus7(2013)の解像度1900x1200でレンダリングしているものと思われます(未確認)。

うーん、.iniファイルでGPU毎にレンダリング設定を変えられるのは嬉しい機能だけど、やっぱAndroidの機種対応は大変だなぁ(^_^;
EpicがちゃんとGPU毎のUE4最適設定をしてくれるといいのだけど…。
まだAdreno系しかデバイス認識はしてないっぽいけど、他のメーカーのデバイスはとりあえず[Android_Low/Mid/High]に振り分けてくれるのかな?手持ちのデバイスがないから確認出来ず。
Nvidia Tegra K1には割と力を入れてくるっぽいので、次当たりは入ってくるかも。

UNREAL ENGINE 4.2 UPDATE PREVIEW
  • Lots of iOS, Android, and HTML5 improvements – full details will be in the final release notes.
まあ、4.2ではAndroid周りも書ききれないほどのアップデートが入るようなので、期待しましょう~(^o^)

2014年5月15日木曜日

[UE4] Androidパフォーマンスチェック!!

さてさて、Nexus7でUE4デモをいじって気がついた事。

UE4はAndroidでも4本指タッチで、コンソールコマンドが入力出来る!!


以前はiOS版でしか出来なかったので、これはかなり嬉しい(^o^)。
(ただしAndroidの話なので、全てのデバイスで動く訳ではないと思います。)

とりあえず基本の、
stat fps
stat unit
をNexus7(2013)で実行。プロジェクトはMobile Temple。
スタート地点で、15FPS...。
うーん、重いなぁ。
Nexus7(2013)は解像度の割にはGPUが強くないので、こんなもんかもしれないけど...
DrawThreadが遅いのは仕方ないとしても、FrameのmsがDrawの2倍以上になのは気になる所。
Threadの同期でロスが大きいのか? そもそもこの数値が正しくない可能性もあるので現時点では何とも言えない。

次に、一番わかりやすそうな、
stat scenerendering
を実行して、二か所で比較。
スタート地点。12 FPS, Frame:73ms, Draw:30ms, Mesh draw calls:271。
スタート地点から振り返った位置。31 FPS, Frame:31ms, Draw:12ms, Mesh draw calls:91。
という訳で、ほぼDrawcallの数にDrawThreadの重さが比例する、という至って普通の結果に(^_^;
フィルレート系の問題なら、Rendering解像度を下げて表示時に引き延ばす、っていう解決策もあったけど、Drawcallの問題だとすると、その手は効かなさそう。
モバイル向けに、もっとDrawcallを抑えるようなデータを作るしかないかぁ。
Mobile Templateと銘打ってる割には、あんまりモバイル向けなアセットの作り方はしてないみたいだ(^_^;
(追記:このプロジェクトの名前、実はMobile Templateじゃなくて、Mobile Templeでした。完全に誤解してました。すんません(^_^;)

しかし、普通に動かしてるだけでもNexus7がかなり熱くなる...。
電力消費量もハンパじゃなさそう(^_^;
GameThreadは余裕だから、実ゲームを作る際も、Renderingアセットをきっちり作るのがポイントになるだろうなぁ。

[UE4] Androidでレンダリング解像度を変えてみよう!!、に続く。

2014年5月12日月曜日

[UE4] Androidに転送!!

という訳で、UE4という新しいおもちゃが触れるようになったので、忘備録代わりにちょいちょい書いてみようという試みナリ。

とりあえず、この辺を見ながらやった所、割と簡単にNexus7 2013に転送成功。
[UE4] Android端末でサンプルを実行する手順まとめ | historia Inc – 株式会社ヒストリア

WindowsからAndroidへの転送は、以前より相当楽になった印象。
GooglePlay用のExpansionファイル(.obb)も勝手に作ってくれて、超楽ちん。(前はあんなに苦労したのになぁ...(^_^;)
でもデータ毎に転送するモードはないのかな? 変更したデータだけを転送してくれると、開発中のテストは助かるんだけど...。
Expansionモードのみだと、ちょっとしたデータ変更でも.obbを再構築して、転送しなきゃいけないので、トライ&エラーがかなり厄介そう。
しかしCookの圧倒的な遅さは相変わらず(^_^;。JenkisとかのCIツールの導入は必至だなぁ。