2DToolKit 注意点

「dynamic batching」について。


同じマテリアルであれば、300頂点まで動的にメッシュを作成して、まとめて表示するUnityの描画エンジン標準の機能らしく、
基本的には、モバイルの2D描画を早くするには、これに乗っかるようにデータを作るのでポイントのようです。

2DToolKitは複数のスプライトであっても、同じマテリアルになるように
  • アトラステクスチャでテクスチャを統一。
  • premultied Alhaを使ってアルファブレンドの加算合成とノーマル合成を統一。
などをして、「dynamic batching」を生かすようにしています。

ただし、この「dynamic batching」には落とし穴があって
Transfomのうちscaleの値が違うものがあると、「dynamic batching」が利かなくなってしまうようです。
その対応として、2DToolKitではtk2dSpriteに独自のscaleパラメーターを持たせて、内部でスケール処理をしています。
Unity Communityより
Mesh will be copied ONLY if non-uniform scale is used.
If you set uniformal scale (both X, Y and Z scale are equal) Unity will NOT make a copy of a mesh.
However dynamic batching can not batch scaled and non-scaled meshes together because it has to change GPU re-normalization state (others your lighting would go wonky).
なので、Animationコンポーネントを追加して、キーフレームアニメーションをする場合は
Transformのスケールはいじらずに、tk2dSprite側のスケールを更新する必要があります。
しかし、この値を直接いじっても、内部処理が走らないためスケール値が描画に反映されません。
ヘルパークラスを作るなどして、ヘルパークラスの値をキーフレームアニメさせて、ヘルパー内部のUpdate()などでスケール値を書きかえるなどの対応が必要になります。
こんな感じ?

using UnityEngine;
using System.Collections;
 
public class tk2DAnimationHelper : MonoBehaviour {
 
	tk2dSprite sprite;
 	public Vector3 scale = Vector3.one;
 	public Color color = Color.white;
 
	void Start () {
		sprite = GetComponent<tk2dSprite>();
		scale = sprite.scale;
		color = sprite.color;
	}
 
	void Update () {
		if( scale != sprite.scale )
		{
			sprite.scale = scale;
		}
		if( color != sprite.color )
		{
			sprite.color = color;
		}
	}	
}
 

キーフレームアニメで値を直接いじっても、内部処理を走らせられないという問題は、色の変更なども同様になります。
Unityのシステムの問題の気もするので、なにか解決方法があるかもしれません。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年11月16日 19:25
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。