I have a code like the following. It will memory leak when switching scenes.
void OnWillRenderObject()
{
if( MyAutoTileMap.TileAnimFrameHasChanged )
{
m_uv = m_meshFilter.mesh.uv;
// Animated tiles
float fTextTileWidth = (float)MyAutoTileMap.Tileset.TileWidth / MyAutoTileMap.Tileset.AtlasTexture.width;
float offset = fTextTileWidth * MyAutoTileMap.TileAnim3Frame * 2;
foreach( AnimTileData animTileData in m_animatedTiles )
{
m_uv[ animTileData.VertexIdx + 0 ].x = animTileData.U0 + offset;
m_uv[ animTileData.VertexIdx + 1 ].x = animTileData.U0 + offset;
m_uv[ animTileData.VertexIdx + 2 ].x = animTileData.U1 + offset;
m_uv[ animTileData.VertexIdx + 3 ].x = animTileData.U1 + offset;
}
// waterfall tiles
float fTextTilePartHeight = (float)MyAutoTileMap.Tileset.TilePartHeight / MyAutoTileMap.Tileset.AtlasTexture.height;
foreach (AnimTileData animTileData in m_animatedWaterfallTiles)
{
int tilePartOff = (animTileData.SubTileRow + 4-MyAutoTileMap.TileAnim4Frame) % 4 - animTileData.SubTileRow;
offset = -fTextTilePartHeight * tilePartOff;
m_uv[animTileData.VertexIdx + 0].y = animTileData.V0 + offset;
m_uv[animTileData.VertexIdx + 1].y = animTileData.V1 + offset;
m_uv[animTileData.VertexIdx + 2].y = animTileData.V1 + offset;
m_uv[animTileData.VertexIdx + 3].y = animTileData.V0 + offset;
}
m_meshFilter.mesh.uv = m_uv;
}
}
void OnDestroy()
{
//avoid memory leak
if (m_meshFilter != null && m_meshFilter.sharedMesh != null)
{
DestroyImmediate(m_meshFilter.sharedMesh);
m_meshFilter.sharedMesh = null;
}
}
}
If I mark the following two lines, then it won’t memory leak any more.
// m_uv = m_meshFilter.mesh.uv;
...
// m_meshFilter.mesh.uv = m_uv;
Is anything wrong in the OnDestroy() method? What I missing?