fix: Fix memory leak from instantiated materials in line renderer and polygon renderer

This commit is contained in:
2025-02-19 21:49:38 +08:00
parent 302dc36eba
commit 6ee7a4720c
2 changed files with 29 additions and 9 deletions

View File

@@ -13,11 +13,16 @@ namespace Cryville.EEW.Unity.Map {
[RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshRenderer))]
class LineRenderer : MonoBehaviour { class LineRenderer : MonoBehaviour {
Material _sharedMaterial;
public Material Material { public Material Material {
get => _meshRenderer.material; get => _meshRenderer.sharedMaterial;
set { set {
_meshRenderer.material = value; if (value == _sharedMaterial) return;
_meshRenderer.material.color = m_color; if (_sharedMaterial != null) Destroy(_meshRenderer.sharedMaterial);
_sharedMaterial = value;
if (_sharedMaterial == null) return;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
} }
} }
@@ -28,7 +33,7 @@ namespace Cryville.EEW.Unity.Map {
set { set {
if (m_color == value) return; if (m_color == value) return;
m_color = value; m_color = value;
_meshRenderer.material.color = value; _meshRenderer.sharedMaterial.color = value;
} }
} }
@@ -126,12 +131,17 @@ namespace Cryville.EEW.Unity.Map {
_meshFilter.mesh = new(); _meshFilter.mesh = new();
} }
_mesh = _meshFilter.mesh; _mesh = _meshFilter.mesh;
_meshRenderer.material.color = m_color; if (_sharedMaterial == null && _meshRenderer.sharedMaterial != null) {
_sharedMaterial = _meshRenderer.sharedMaterial;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
} }
void OnDestroy() { void OnDestroy() {
if (_positions is not null) if (_positions is not null)
ArrayPool<Vector2>.Shared.Return(_positions); ArrayPool<Vector2>.Shared.Return(_positions);
Destroy(_mesh); Destroy(_mesh);
Destroy(Material);
} }
void LateUpdate() { void LateUpdate() {
if (_valid) return; if (_valid) return;

View File

@@ -11,11 +11,16 @@ namespace Cryville.EEW.Unity.Map {
[RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))] [RequireComponent(typeof(MeshRenderer))]
class PolygonRenderer : MonoBehaviour { class PolygonRenderer : MonoBehaviour {
Material _sharedMaterial;
public Material Material { public Material Material {
get => _meshRenderer.material; get => _meshRenderer.sharedMaterial;
set { set {
_meshRenderer.material = value; if (value == _sharedMaterial) return;
_meshRenderer.material.color = m_color; if (_sharedMaterial != null) Destroy(_meshRenderer.sharedMaterial);
_sharedMaterial = value;
if (_sharedMaterial == null) return;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
} }
} }
@@ -40,10 +45,15 @@ namespace Cryville.EEW.Unity.Map {
_meshFilter.mesh = new(); _meshFilter.mesh = new();
} }
_mesh = _meshFilter.mesh; _mesh = _meshFilter.mesh;
_meshRenderer.material.color = m_color; if (_sharedMaterial == null && _meshRenderer.sharedMaterial != null) {
_sharedMaterial = _meshRenderer.sharedMaterial;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
} }
void OnDestroy() { void OnDestroy() {
Destroy(_mesh); Destroy(_mesh);
Destroy(Material);
} }
public void SetPolygon(IEnumerable<IEnumerable<PointF>> polygon) { public void SetPolygon(IEnumerable<IEnumerable<PointF>> polygon) {
_mesh.Clear(); _mesh.Clear();