From 271d0b630a7407dc94085ffc4e57615b93a69306 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Tue, 8 Oct 2013 21:23:36 +0200 Subject: [PATCH] Double buffer meshes. Number 13: http://docs.unity3d.com/Documentation/Manual/MobileOptimisation.html --- spine-tk2d/Assets/Spine/SkeletonComponent.cs | 38 +++++++++++++------ spine-unity/Assets/Spine/SkeletonComponent.cs | 38 +++++++++++++------ 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/spine-tk2d/Assets/Spine/SkeletonComponent.cs b/spine-tk2d/Assets/Spine/SkeletonComponent.cs index bd2bf1c34..bae037ca8 100644 --- a/spine-tk2d/Assets/Spine/SkeletonComponent.cs +++ b/spine-tk2d/Assets/Spine/SkeletonComponent.cs @@ -46,7 +46,9 @@ public class SkeletonComponent : MonoBehaviour { public float timeScale = 1; public bool calculateNormals; public bool calculateTangents; - private Mesh mesh; + private MeshFilter meshFilter; + private Mesh mesh, mesh1, mesh2; + private bool useMesh1; private float[] vertexPositions = new float[8]; private int lastVertexCount; private Vector3[] vertices; @@ -57,7 +59,7 @@ public class SkeletonComponent : MonoBehaviour { private List submeshes = new List(); public virtual void Clear () { - GetComponent().mesh = null; + meshFilter.sharedMesh = null; DestroyImmediate(mesh); mesh = null; renderer.sharedMaterial = null; @@ -65,11 +67,9 @@ public class SkeletonComponent : MonoBehaviour { } public virtual void Initialize () { - mesh = new Mesh(); - GetComponent().mesh = mesh; - mesh.name = "Skeleton Mesh"; - mesh.hideFlags = HideFlags.HideAndDontSave; - mesh.MarkDynamic(); + meshFilter = GetComponent(); + mesh1 = newMesh(); + mesh2 = newMesh(); vertices = new Vector3[0]; @@ -81,6 +81,14 @@ public class SkeletonComponent : MonoBehaviour { } } + private Mesh newMesh () { + Mesh mesh = new Mesh(); + mesh.name = "Skeleton Mesh"; + mesh.hideFlags = HideFlags.HideAndDontSave; + mesh.MarkDynamic(); + return mesh; + } + public virtual void UpdateSkeleton () { skeleton.Update(Time.deltaTime * timeScale); skeleton.UpdateWorldTransform(); @@ -134,9 +142,13 @@ public class SkeletonComponent : MonoBehaviour { else sharedMaterials = submeshMaterials.ToArray(); renderer.sharedMaterials = sharedMaterials; + + // Double buffer mesh. + Mesh mesh = useMesh1 ? mesh1 : mesh2; + useMesh1 = !useMesh1; + meshFilter.sharedMesh = mesh; // Ensure mesh data is the right size. - Mesh mesh = this.mesh; Vector3[] vertices = this.vertices; int vertexCount = quadCount * 4; bool newTriangles = vertexCount > vertices.Length; @@ -145,7 +157,8 @@ public class SkeletonComponent : MonoBehaviour { this.vertices = vertices = new Vector3[vertexCount]; this.colors = new Color32[vertexCount]; this.uvs = new Vector2[vertexCount]; - mesh.Clear(); + mesh1.Clear(); + mesh2.Clear(); } else { // Too many vertices, zero the extra. Vector3 zero = Vector3.zero; @@ -206,14 +219,17 @@ public class SkeletonComponent : MonoBehaviour { Vector3 normal = new Vector3(0, 0, -1); for (int i = 0; i < vertexCount; i++) normals[i] = normal; - mesh.normals = normals; + (useMesh1 ? mesh1 : mesh2).vertices = vertices; + mesh1.normals = normals; + mesh2.normals = normals; if (calculateTangents) { Vector4[] tangents = new Vector4[vertexCount]; Vector3 tangent = new Vector3(0, 0, 1); for (int i = 0; i < vertexCount; i++) tangents[i] = tangent; - mesh.tangents = tangents; + mesh1.tangents = tangents; + mesh2.tangents = tangents; } } } diff --git a/spine-unity/Assets/Spine/SkeletonComponent.cs b/spine-unity/Assets/Spine/SkeletonComponent.cs index 8df5b5c8d..71a1fdbc0 100644 --- a/spine-unity/Assets/Spine/SkeletonComponent.cs +++ b/spine-unity/Assets/Spine/SkeletonComponent.cs @@ -46,7 +46,9 @@ public class SkeletonComponent : MonoBehaviour { public float timeScale = 1; public bool calculateNormals; public bool calculateTangents; - private Mesh mesh; + private MeshFilter meshFilter; + private Mesh mesh, mesh1, mesh2; + private bool useMesh1; private float[] vertexPositions = new float[8]; private int lastVertexCount; private Vector3[] vertices; @@ -57,7 +59,7 @@ public class SkeletonComponent : MonoBehaviour { private List submeshes = new List(); public virtual void Clear () { - GetComponent().mesh = null; + meshFilter.sharedMesh = null; DestroyImmediate(mesh); mesh = null; renderer.sharedMaterial = null; @@ -65,11 +67,9 @@ public class SkeletonComponent : MonoBehaviour { } public virtual void Initialize () { - mesh = new Mesh(); - GetComponent().mesh = mesh; - mesh.name = "Skeleton Mesh"; - mesh.hideFlags = HideFlags.HideAndDontSave; - mesh.MarkDynamic(); + meshFilter = GetComponent(); + mesh1 = newMesh(); + mesh2 = newMesh(); vertices = new Vector3[0]; @@ -81,6 +81,14 @@ public class SkeletonComponent : MonoBehaviour { } } + private Mesh newMesh () { + Mesh mesh = new Mesh(); + mesh.name = "Skeleton Mesh"; + mesh.hideFlags = HideFlags.HideAndDontSave; + mesh.MarkDynamic(); + return mesh; + } + public virtual void UpdateSkeleton () { skeleton.Update(Time.deltaTime * timeScale); skeleton.UpdateWorldTransform(); @@ -134,9 +142,13 @@ public class SkeletonComponent : MonoBehaviour { else sharedMaterials = submeshMaterials.ToArray(); renderer.sharedMaterials = sharedMaterials; + + // Double buffer mesh. + Mesh mesh = useMesh1 ? mesh1 : mesh2; + useMesh1 = !useMesh1; + meshFilter.sharedMesh = mesh; // Ensure mesh data is the right size. - Mesh mesh = this.mesh; Vector3[] vertices = this.vertices; int vertexCount = quadCount * 4; bool newTriangles = vertexCount > vertices.Length; @@ -145,7 +157,8 @@ public class SkeletonComponent : MonoBehaviour { this.vertices = vertices = new Vector3[vertexCount]; this.colors = new Color32[vertexCount]; this.uvs = new Vector2[vertexCount]; - mesh.Clear(); + mesh1.Clear(); + mesh2.Clear(); } else { // Too many vertices, zero the extra. Vector3 zero = Vector3.zero; @@ -206,14 +219,17 @@ public class SkeletonComponent : MonoBehaviour { Vector3 normal = new Vector3(0, 0, -1); for (int i = 0; i < vertexCount; i++) normals[i] = normal; - mesh.normals = normals; + (useMesh1 ? mesh1 : mesh2).vertices = vertices; + mesh1.normals = normals; + mesh2.normals = normals; if (calculateTangents) { Vector4[] tangents = new Vector4[vertexCount]; Vector3 tangent = new Vector3(0, 0, 1); for (int i = 0; i < vertexCount; i++) tangents[i] = tangent; - mesh.tangents = tangents; + mesh1.tangents = tangents; + mesh2.tangents = tangents; } } }