Optimize GC for sprite update.

This commit is contained in:
2023-02-18 14:42:42 +08:00
parent ff8c925f32
commit ba6239068a
2 changed files with 15 additions and 16 deletions

View File

@@ -127,15 +127,15 @@ namespace Cryville.Crtr.Components {
UpdateScale(); UpdateScale();
UpdateZIndex(); UpdateZIndex();
} }
readonly Vector2[] _uvs = new Vector2[4];
protected virtual void UpdateUV() { protected virtual void UpdateUV() {
var frame = CurrentFrame; var frame = CurrentFrame;
if (SpriteInfo.IsNullOrEmpty(frame)) return; if (SpriteInfo.IsNullOrEmpty(frame)) return;
Vector2[] muv = OriginalUV; Vector2[] muv = OriginalUV;
Vector2[] uv = new Vector2[muv.Length]; for (int i = 0; i < _uvs.Length; i++) {
for (int i = 0; i < uv.Length; i++) { _uvs[i] = frame.Frame.GetUV(muv[i]);
uv[i] = frame.Frame.GetUV(muv[i]);
} }
mesh.Mesh.uv = uv; mesh.Mesh.uv = _uvs;
} }
float _opacity = 1; float _opacity = 1;

View File

@@ -44,27 +44,26 @@ namespace Cryville.Crtr.Components {
UpdateUV(); UpdateUV();
} }
readonly Vector2[] _uvs = new Vector2[8];
readonly Vector3[] _verts = new Vector3[8];
protected override void UpdateUV() { protected override void UpdateUV() {
var frame = CurrentFrame; var frame = CurrentFrame;
if (SpriteInfo.IsNullOrEmpty(frame)) return; if (SpriteInfo.IsNullOrEmpty(frame)) return;
Vector2[] muv = OriginalUV; Vector2[] muv = OriginalUV;
Vector2[] uv = new Vector2[muv.Length];
var or = frame.Ratio; var or = frame.Ratio;
var sr = Scale.x / Scale.y; var sr = Scale.x / Scale.y;
var b = new Vector2( var rr = or / sr;
(or / sr) * _border.x, var b1 = rr * _border.x;
1 - (or / sr) * (1 - _border.y) var b2 = 1 - rr * (1 - _border.y);
);
Vector3[] vert = mesh.Mesh.vertices;
for (int i = 0; i < muv.Length; i++) { for (int i = 0; i < muv.Length; i++) {
float x; float bx; float x; float bx;
switch ((int)muv[i].x) { switch ((int)muv[i].x) {
case 0: x = 0; bx = 0; break; case 0: x = 0; bx = 0; break;
case 1: x = _border.x; bx = b.x; break; case 1: x = _border.x; bx = b1; break;
case 2: x = _border.y; bx = b.y; break; case 2: x = _border.y; bx = b2; break;
case 3: x = 1; bx = 1; break; case 3: x = 1; bx = 1; break;
default: throw new NotSupportedException("Built-in resource corrupted"); default: throw new NotSupportedException("Built-in resource corrupted");
} }
@@ -74,12 +73,12 @@ namespace Cryville.Crtr.Components {
case 3: y = 1; break; case 3: y = 1; break;
default: throw new NotSupportedException("Built-in resource corrupted"); default: throw new NotSupportedException("Built-in resource corrupted");
} }
uv[i] = frame.Frame.GetUV(x, y); _uvs[i] = frame.Frame.GetUV(x, y);
bx -= 0.5f; y -= 0.5f; bx -= 0.5f; y -= 0.5f;
vert[i] = new Vector3(bx, 0, y); _verts[i] = new Vector3(bx, 0, y);
} }
mesh.Mesh.uv = uv; mesh.Mesh.uv = _uvs;
mesh.Mesh.vertices = vert; mesh.Mesh.vertices = _verts;
} }
public override void Init() { public override void Init() {