fix: Fix memory leak from instantiated materials in line renderer and polygon renderer
This commit is contained in:
@@ -13,11 +13,16 @@ namespace Cryville.EEW.Unity.Map {
|
||||
[RequireComponent(typeof(MeshFilter))]
|
||||
[RequireComponent(typeof(MeshRenderer))]
|
||||
class LineRenderer : MonoBehaviour {
|
||||
Material _sharedMaterial;
|
||||
public Material Material {
|
||||
get => _meshRenderer.material;
|
||||
get => _meshRenderer.sharedMaterial;
|
||||
set {
|
||||
_meshRenderer.material = value;
|
||||
_meshRenderer.material.color = m_color;
|
||||
if (value == _sharedMaterial) return;
|
||||
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 {
|
||||
if (m_color == value) return;
|
||||
m_color = value;
|
||||
_meshRenderer.material.color = value;
|
||||
_meshRenderer.sharedMaterial.color = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,12 +131,17 @@ namespace Cryville.EEW.Unity.Map {
|
||||
_meshFilter.mesh = new();
|
||||
}
|
||||
_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() {
|
||||
if (_positions is not null)
|
||||
ArrayPool<Vector2>.Shared.Return(_positions);
|
||||
Destroy(_mesh);
|
||||
Destroy(Material);
|
||||
}
|
||||
void LateUpdate() {
|
||||
if (_valid) return;
|
||||
|
@@ -11,11 +11,16 @@ namespace Cryville.EEW.Unity.Map {
|
||||
[RequireComponent(typeof(MeshFilter))]
|
||||
[RequireComponent(typeof(MeshRenderer))]
|
||||
class PolygonRenderer : MonoBehaviour {
|
||||
Material _sharedMaterial;
|
||||
public Material Material {
|
||||
get => _meshRenderer.material;
|
||||
get => _meshRenderer.sharedMaterial;
|
||||
set {
|
||||
_meshRenderer.material = value;
|
||||
_meshRenderer.material.color = m_color;
|
||||
if (value == _sharedMaterial) return;
|
||||
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();
|
||||
}
|
||||
_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() {
|
||||
Destroy(_mesh);
|
||||
Destroy(Material);
|
||||
}
|
||||
public void SetPolygon(IEnumerable<IEnumerable<PointF>> polygon) {
|
||||
_mesh.Clear();
|
||||
|
Reference in New Issue
Block a user