Fernandez Francisco(フェルナンデス フランシスコ)
KLabGames事業本部 Technical Artist
RENDERING 最適化
『禍つヴァールハイト』
RENDERING 最適化『禍つヴァールハイト』
ゲームのターゲット
30 FPS
ポストエフェクト
端末のターゲット Q3 2015>
● Sony Xperia Performance
● Aquos SHV34
● Samsung Galaxy S7
● Iphone 6+
メモリ700 MB
プロフィールターゲットを決める BOTTLENECK 端末でテスト
100 キャラクター
!
RENDERING 最適化『禍つヴァールハイト』
FPS
平均9 FPS。
最大20 FPS。
カットシーンでも平均は8-9 FPSぐらい。
解像度: 1280 x 720。
プロフィールターゲットを決める BOTTLENECK 端末でテスト
!
!
RENDERING 最適化『禍つヴァールハイト』
プロフィールツール SnapDragon Profiler / Mali Graphic Profiler / XCode
レンダリング: 30 FPS = 1 FPS 33.3 MS (GPU 25.7 MS)
ゲーム= 30%(7.7MS)
ポストエフェクト/影 = 70% (18 MS)
プロフィールターゲットを決める BOTTLENECK 端末でテスト
!
RENDERING 最適化『禍つヴァールハイト』
Unity Post Process Stack v2
● モバイル向きではない。
● かなり重い。
● シェーダーの効率が悪い。
● 追加するとUnityが自動的に Native Size render textureを作る。(Offにしても)
Unity Blog とARM
プロフィールターゲットを決める BOTTLENECK 端末でテスト
!
RENDERING 最適化『禍つヴァールハイト』
Unity Post Process Stack v2
● Multiple Render Texture.
● Main Cameraの設定をForce into RTになっている。
● GPUのメモリからロードする。
!
プロフィールターゲットを決める BOTTLENECK 端末でテスト
RENDERING 最適化『禍つヴァールハイト』
PROFILEDECIDE TARGET BOTTLENECK TEST ON DEVICE
Bottleneck, Unity Post Process
Unity Post Process
18 MS
● Native resolution textureを削除する。
● GMEMロードを削除する。
● Blitを削減する。
● GPUのNative Depth Textureを使用する。
● レンダリングTimeを改善。
!
!
4 MS
Original Post Process
RENDERING 最適化『禍つヴァールハイト』
Original Post Process
● GPUのNative Depth Textureを使用する。
● Dual filteringでぼやけを作る。
● Temporary Render Textureの解像度 1/4を使用する。
● OnRenderImage, CommandBufferやめてOnPostRenderを使用
する。
プロフィールターゲットを決める BOTTLENECK 端末でテスト
RENDERING 最適化『禍つヴァールハイト』
Original Post Process
● OpenGL 2.0からオッケーです。
● Android / IOS オッケー。
● 簡単にオフをできる.
● MSを改善。
● Depth of Field、被写界深度。
● Post Process Fog、フォグ、霧。
● Vignette、ヴィネット。
● Bloom with fake HDR、ブルームと偽物
HDR。(Alpha Channelにマスクを使用す
る)
● Color Correction、色補正。
● Etc、など。
プロフィールターゲットを決める BOTTLENECK 端末でテスト
機能
RENDERING 最適化『禍つヴァールハイト』
30 FPSが出来ましたか? まだ.
● Frame Rateは改善しましたが、安定して30FPSは出てない。
● 着実で30 FPSにするなら、45FPSに目標した方がいい。
● モバイル端末は暑さと電池を守るためにCPU/GPUのスピードを制限す
る。
● Throttling.
!
プロフィールターゲットを決める BOTTLENECK 端末でテスト
RENDERING 最適化『禍つヴァールハイト』
もう一回プロフェール
● CPU 40.85MS
● 1291 Draw Calls
● No Early Z-test
● No Texel Size
!
プロフィールターゲットを決める BOTTLENECK 端末でテスト
レンダリング: 30 FPS = 1 FPS 33.3 MS (GPU 25.7 MS)
RENDERING 最適化『禍つヴァールハイト』
Bottleneck, Draw Call / Set Pass / Batch
● 普通200 Draw Call
● 新し端末300 Draw Call (Q3
2018, 2019)
プロフィールターゲットを決める BOTTLENECK 端末でテスト
RENDERING 最適化『禍つヴァールハイト』
Bottleneck, 背景 Draw Call / Set Pass / Batch
Draw Call
* No Scene
Set Pass
● Meshをマージする
○ 3D Software
● Material 削減。
● ローポリのゲームオブ
ジェクトが多いほうより、
ハイポリのゲームオブ
ジェクトが少ないほうが良
い
● Unityのシーンを使うなら
Batching Static をチェッ
クする。
● Unityのシーンを使わない
ならScriptで
Combine(R/W)。
● Dynamic Mesh Batch
はCpuに重い。
● Frustum Culling Data.
!
● シェーダーのPass数を確
認。
● 違う render States。
Batch
プロフィールターゲットを決める BOTTLENECK 端末でテスト
!
!
RENDERING 最適化『禍つヴァールハイト』
背景のDraw Call 削減テスト
● Mesh 40.85 MS
● Dynamic Mesh 7.8 MS
● Mesh 5.1 MS
● Dynamic Mesh 0 MS
1291 Draw Call 33 Draw Call
プロフィールターゲットを決める BOTTLENECK 端末でテスト
Total
● CPU 40.85 MS + GPU 18 MS ● CPU 5.1 MS + GPU 4 MS
RENDERING 最適化『禍つヴァールハイト』
30 FPSを出来ましたか? はい、ポストエフェクトオン。
プロフィールターゲットを決める BOTTLENECK 端末でテスト
RENDERING 最適化『禍つヴァールハイト』
Early Z-Test Camera CullingTexture
● Opaqueのレンダリング
順番は前から後ろ。
● Transparentのレンダリ
ング順番は後ろから前。
● Pixelsを廃棄。
(Discard)
● 変なレンダリングの順番 
(+1000) 。
● 同質なTextureサイ
ズ。
● MipMaps。
● Frustum Culling。
● Occlusion Culling。
● Camera Cull 距離。
Shaders
● 重いシェーダー。
● 2D Sampler。
● シェーダーVariants。
● シェーダーCompile。
● Shader Forge など。
30 FPSを保つ
!
!
Occlusion culling (Scene でBakeするのが必要)
RENDERING 最適化『禍つヴァールハイト』
!
Early Z-Test Camera CullingTexture Shaders
廃棄したPixelsは赤色で見える(SnapDragon)。
30 FPSを保つ
FillRate/Overdraw ZReject/Early Ztest
RENDERING 最適化『禍つヴァールハイト』
!
!
!
最後の画像で見えないPixelをレンダリングをしない、SkyBox注意。
Early Z-Test Camera CullingTexture Shaders
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
Textureサイズ。赤色ポイントは大きすぎる、青色ポイントは小さすぎる。
1280 x 720
Early Z-Test Camera CullingTexture Shaders
30 FPSを保つ
720 PX.
キャラクター 300px.
草  32 px.
etc.
RENDERING 最適化『禍つヴァールハイト』
1280 x 720
Frustum Cullingはいつもオンになっています。
(Camera Culling).
Occlusion CullingはUnityシーンが必要 
(OcclusionのデーターはシーンにBakeします)。
Camera Layer Culling (距離)。
!
Camera camera = GetComponenet<Camera>();
floot[] distances = new float[32];
distance[10] = 15;
camera.layerCullDistance = distances;
Early Z-Test Camera CullingTexture Shaders
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
Early Z-Test Camera CullingTexture Shaders
● Real time シェーダー Compile (Override)。
● シェーダースピードチェック。
● 簡単な方法で重いシェーダーを見つかる。
● シェーダー計算No-Op注意。
● Texture SamplerやFill Rateや Interpolations
などの確認。
SnapDragon プロフェール
!
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
1280 x 720
Early Z-Test Camera CullingTexture Shaders
● Real time シェーダー
Compile。
● シェーダースピードチェック。
● 使いやすい。
● 重いシェーダー。
● 比較することが出来ます。
● Texture SamplerやFill Rate
や Interpolationsなどの確
認。
XCode プロフェール
!
30 FPSを保つ
!
RENDERING 最適化『禍つヴァールハイト』
Early Z-Test Camera CullingTexture Shaders
● 1行あたりを確認することが可
能。
● 頂点を確認することが可能。
XCode
!
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
1280 x 720
Early Z-Test Camera CullingTexture Shaders
Mali Graphic プロフェール , Offline Compiler
● Compile無しでシェーダーのスピードを確認が可能。
● 計算やロードやtextureなど確認が可能。
● Spilling注意 (Uniform足りない場合)。 !
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
1280 x 720
Early Z-Test Camera CullingTexture Shaders
ヒント
● 全てをhalfにする。
● ポリゴンのバグが発生したら、 Positionを Floatにす
る。
● UV Coordinatesの確認をするならUnityの
TimeScaleを100にする。バグが発生したら、UVを
Floatにする。(UVScroll)
● Unity #Include を消す。(影, ライト, 霧) 必要な物だ
けを使う。
● Variantsが多くなると最適化し辛くなるのででききるか
ぎり減らす。
● IFやFORやBranchを使用しない方がおすすめ。Clip
は最初にする。
● Vertexで計算した方がいい.
● 最近GPUが早くなったのでLUTを読むよりシェーダー
で計算する方が早い。
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
1280 x 720
Early Z-Test Camera CullingTexture Shaders
シェーダー最適化のおすすめ
● シェーダー Variant Collectionを使用する。
● シェーダーWarmUpを使用する。
● MayaからなどのインポートしたFBXのMaterialとシェーダー注意。(Standard, Unlit Lightmap)
● Build In シェーダー注意。(Mobile Particlesなど)
!
Shader Compile
Shader Collection
30 FPSを保つ
RENDERING 最適化『禍つヴァールハイト』
簡単なFPS Checker (Override)
FPS 確認。
12 34
5
6
7
1
2
3
4
5
6
7
シェーダー 確認。
Textureサイズ確認。
プロフェール保存する。
解像度確認。
Camera Culling確認。
メモリ確認。
RENDERING 最適化『禍つヴァールハイト』
Contact
Francisco Fernandez
fernandez-f@klab.com
ありがとうございます。
Q&A
https://www.klab.com/jp/
http://www.franfndz.com
Memory 700 MB 100 Character Other talk.

RENDERING 最適化「禍つヴァールハイト」