コンテンツへスキップ

オブジェクトのキャッシュ

  • 日記

何度か書いてたテクスチャが歪む問題ですが、どうも単にテクセル境界からサンプリングしてた事によるよくあるエラーようです。

諦めてスプライト周りを自作しはじめたら再現したのでわかったんですが、それぐらいちゃんとしとけよと言いたいところ。

すでにex2Dのサポートにも報告してありますが、いまいち伝わってるのかどうか。そもそも以前貼ってた画像を見せてもどこがおかしいのかわからないと言われてしまったので、治るかどうかは不明w

一応ex2Dを使用する場合、オブジェクトの座標を整数値にアラインしたあとで0.25ピクセルシフトしてやると大丈夫そうです。0.5だとRadeon系では問題ないんですが、今度はGeforce系で歪みます。歪まない2D系アセットはそのへん考慮してあるんでしょう。

今回はこのままex2Dを使うつもりだけど、つぎからは自作のスプライトで行こうと思います。まあ一番面倒な部分であるスプライトシートの作成はTexturePackerがあるしね。

で、仕上げ作業にかかってたんですが、iPhone4で処理落ちしてたので、さすがにまずいだろうと最適化開始。

まずコライダをboxからsphereに。2割ほど速くなった。

スプライトシートを二枚から一枚に。ドローコールが3から2に。あんまわからんかった。

弾オブジェクトのキャッシュ化。これは劇的で3−4倍速くなった。

というわけで、やはりキャッシュ化が有効なようです。今回は以下のような大雑把な方法で試してみました。

途中、なぜか生成総数よりpoolにキャッシュしたオブジェクト数のほうが多くなるという不具合があったんですが、どうもDelObjectが複数回呼ばれていたようです。削除処理はイベントコール内で処理してたんですが、範囲チェックや当たり判定など複数のイベントが同時に呼ばれてたみたいで、排他的になるようにチェックすることで回避。

特に使い方は書きませんが、この程度でも十分効果があるということで。まあもっとちゃんとしたキャッシュ用アセットも有るようですし、使うならそういうのが良いのではないでしょうか。

Listよりarray使ったほうがいいかも知れませんが、総数でも300程度なので大丈夫でしょう。pythonのListは切り貼りするとすごく重かったんですが、Booだとどうなのかな?

今のところ、たまに60fpsを切ることがあるので、もうちょっとどうにかしたいですが、これ以上削れるとこあるかなあ。ちなみに4Sだと何も最適化しない状態で60FPSよゆーでした。こんなに速度差有るとは……。

しかし、普段gvim+pythonで作業してたやつがmonodevelopのviモード+Booで作業してると、程よい違和感が全力で神経を逆なでしてくれますヨ! そろそろc#に移行しようかしら。

[cc lang=”python”]

import UnityEngine
class ObjectCache (MonoBehaviour):
public cacheTarget as (GameObject)
#
private pool as Hash = {}
private target as Hash = {}

def Start():
for i in cacheTarget:
target[i.name] = i
pool[i.name] = []

def GetObject(name as string, pos as Vector3, rot as Quaternion):
s as List = pool[name] cast List
t as GameObject
if len(s) == 0:
t = Instantiate(target[name] cast GameObject, pos, rot)
t.name = name
t.SendMessage(‘SetCache’, self) #delegate
else:
t = s.Pop()
t.transform.position = pos
t.transform.rotation = rot
t.active = true
t.SendMessage(“Start”) #restart after activate
return t

def DelObject(obj as GameObject):
obj.active = false
(pool[obj.name] cast List).Push(obj)
[/cc]