mayonage-koboの日記

我ら真夜中ゲーム工房の進捗と、ゲーム開発のメモを残しておくブログ

Grow 処理落ちを減らしたい

明けましておめでとうございます。hisojiです。
今年もサークル共々、ゲーム制作を続けていけるよう頑張ります。

今回は高速化について調べました。ゲームのジャンル的にはアクションですからそれなりに処理はかかるんじゃないかと思うので、この際にまとめてみようと思います。
処理速度の問題については前作の「NightBat」でも起こっていました。思えばCollider付きのオブジェクトが大量発生してた気がします。
そもそもこのゲームにおいて高速化する必要があるかが未検証なのですがまあ使うかもしれないですよ多分。

日本語のサイトを色々調べていたのですが、以下の記事で様々な手法が挙げられています。
Yaminabe:うにばな 講座みたいなもの番外編(高速化について) - livedoor Blog(ブログ)
O-Planning 書籍サポートページ 「Unityではじめる2Dゲーム作り徹底ガイド」
シェーダ等3D機能については把握しきれなかったのですが、「Unityはじめるぞー」みたいな初めての方も参考に出来る手法も色々あったので羅列していきたいと思います。
あとはUnity公式サイトを見るのがいいと思うけどえいごよめない。

DrawCallを減らす

多くの記事で取り上げられていたのが、DrawCallの数を減らすことでした。
DrawCallの数は、GameタブからStatsをクリックすると見る事が出来ます。
f:id:mayonage-kobo:20150109124612p:plain
この画面の状態だと26回呼ばれているようですね。
この数はどうなんでしょう。...どうなんでしょう?諸説あるようでよく分からないのですが、この状態で実機テストしたところ処理落ちせず動いています。とにかくDrawCallは少なくした方がいいようです。
ではどうするかというと、これについて後者の記事(pdf)ではスプライト関連の最適化が紹介されていました。スプライト画像を1つの画像にまとめる(アトラス化?)、拡大、回転、アルファ値など工夫出来る事はあるようです。
ちなみに左2人のキャラクターがDrawCallsの大半を占めていました。現在のゲームはキャラクターがアニメーションしてるのですが、それぞれのパーツが別々の画像ファイルになっているからかもしれないです。なので高速化の余地は一応あるのですが、実際に出来るかどうかは検討しないといけません。

そういえばキャラがカメラの画面外に出たらDrawCall数減るんですね。
さらに言えば画面外に出た時の処理とかも書けるんですね。OnBecameVisible()等があるようです。
さらに言えばオブジェクトがアクティブになった瞬間に呼ばれる関数もあるんですね。OnEnable()のような。
もしかして周知の事実...?

無駄な処理を減らす

当たり前なんですが、余計なコンポーネントが付いていたら削除します。
で、調べたら壁全体にrigidbody2D付いてたんですね。消しても特に問題ありませんでした。知らずに壁大量に配置させたらやばかったね。

updateに関する小技もありましたね。ある条件(画面外、離れている等)ではさっさとreturnしてしまうとか。
同じくsetActiveを駆使する方法もありました。ただ非アクティブ化したものを上手くアクティブ化するのが難しい。

GameObject.Find~系の関数は避けた方がいいという案もありました。便利なんだけどねー。なるべくStart時にまとめて格納するのがいいようです。


遅くなったらとりあえず上記の事でも気にしてみようと思います。

隣では背景を描いていました。早く緑に包まれて遊びたい。