(1) スクリプトを使ってOnGUI()内で表示する
(2) NGUIを使って表示する
を行ってきましたが、DrawCallを抑えるとしたらNGUIが有効という話をよく聞きます。
今回は、以前の記事で使ったプロジェクトを利用して上記(1)(2)を検証してみようと思います。
まずは(1)です。
Sprite用の画像をマーク毎に切り取って(128x128)、それぞれをGUI.Label()で表示します。
↓Skinの使い方についての記事
[Unity] GUI Skin を使って画像を切替える
http://blog.be-style.jpn.com/article/54522582.html
■補足
Skin内の各Styleの名前は以下の通り。各Styleのnormal要素に切り取った画像を適用しています。
丸 = circle
四角 = square
三角 = triangle
星 = star
使ったスクリプト
---------------------------------------------結果↓
#pragma strict
var customSkin : GUISkin;
function OnGUI() {
// GUISkinをセットアップ
if (customSkin) {
GUI.skin = customSkin;
}
GUI.Label(Rect( 20, 20, 128, 128), "", "circle");
GUI.Label(Rect(140, 20, 128, 128), "", "square");
GUI.Label(Rect( 20, 150, 128, 128), "", "triangle");
GUI.Label(Rect(140, 150, 128, 128), "", "star");
GUI.Label(Rect( 20, 280, 128, 128), "", "circle");
GUI.Label(Rect(140, 280, 128, 128), "", "square");
GUI.Label(Rect( 20, 410, 128, 128), "", "triangle");
GUI.Label(Rect(140, 410, 128, 128), "", "star");
}
---------------------------------------------
DrawCall = 8 でした。
次に、(2)です。
以下の記事で作っておいたUISprite(circle,square,star,triangle)を(1)に合わせて配置。
[Unity] NGUIでSprite画像を使って複数のマークを表示してみた
http://blog.be-style.jpn.com/article/54633023.html
結果↓
DrawCall = 2 でした。
■結果
OnGUI()内で画像描画 = DrawCall 8
NGUIで画像描画 = DrawCall 2
描画する画像が増えれば、この差はさらに開きそうです。
iPhoneアプリの快適動作の目安は「DrawCall 20以下」と言われているので
DrawCallを抑えたいときはNGUIが有効そうです。
ただ、NGUIはOnGUIでの描画よりも制御することが大変そうです。
OnGUI内だったらスクリプトで簡単に実現できる事(画像の切替え、ラベルの書換え等)が
NGUIでは手間がかかります。
まだNGUIを使いこなせていない事が一番の原因ですが orz
NGUIをもっと使い込んで、快適なFPSを目指そう。