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(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;
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user