Skip to content

Commit 65b397b

Browse files
Some memory management fixes in ViewNode2 material free (#597)
1 parent ff4cae8 commit 65b397b

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

sceneview/src/main/java/io/github/sceneview/loaders/MaterialLoader.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,14 +301,18 @@ class MaterialLoader(
301301
}
302302

303303
fun destroyMaterial(material: Material) {
304-
engine.safeDestroyMaterialInstance(material.defaultInstance)
305-
engine.safeDestroyMaterial(material)
306-
materials -= material
304+
if (material in materials) {
305+
engine.safeDestroyMaterialInstance(material.defaultInstance)
306+
engine.safeDestroyMaterial(material)
307+
materials -= material
308+
}
307309
}
308310

309311
fun destroyMaterialInstance(materialInstance: MaterialInstance) {
310-
engine.safeDestroyMaterialInstance(materialInstance)
311-
materialInstances -= materialInstance
312+
if (materialInstance in materialInstances) {
313+
engine.safeDestroyMaterialInstance(materialInstance)
314+
materialInstances -= materialInstance
315+
}
312316
}
313317

314318
fun destroy() {
@@ -319,4 +323,4 @@ class MaterialLoader(
319323
materials.toList().forEach { destroyMaterial(it) }
320324
materials.clear()
321325
}
322-
}
326+
}

sceneview/src/main/java/io/github/sceneview/node/ViewNode2.kt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import io.github.sceneview.safeDestroyTexture
6464
class ViewNode2(
6565
engine: Engine,
6666
val windowManager: WindowManager,
67-
materialLoader: MaterialLoader,
67+
private val materialLoader: MaterialLoader,
6868
view: View,
6969
unlit: Boolean = false,
7070
invertFrontFaceWinding: Boolean = false,
@@ -102,13 +102,18 @@ class ViewNode2(
102102
setExternalStream(engine, stream)
103103
}
104104

105-
init {
106-
materialInstance = materialLoader.createViewInstance(
107-
viewTexture = texture,
108-
unlit = unlit,
109-
invertFrontFaceWinding = invertFrontFaceWinding
110-
)
105+
override var materialInstance: MaterialInstance = materialLoader.createViewInstance(viewTexture = texture,
106+
unlit = unlit,
107+
invertFrontFaceWinding = invertFrontFaceWinding
108+
).also {
109+
setMaterialInstanceAt(0, it)
111110
}
111+
set(value) {
112+
val old = field
113+
materialLoader.destroyMaterialInstance(old)
114+
field = value
115+
setMaterialInstanceAt(0, value)
116+
}
112117

113118
constructor(
114119
engine: Engine,
@@ -293,7 +298,7 @@ class ViewNode2(
293298

294299
windowManager.removeView(layout)
295300

296-
engine.safeDestroyMaterialInstance(materialInstance)
301+
materialLoader.destroyMaterialInstance(materialInstance)
297302
engine.safeDestroyTexture(texture)
298303
engine.safeDestroyStream(stream)
299304

@@ -426,5 +431,6 @@ class ViewNode2(
426431

427432

428433
private fun Context.findActivity(): ComponentActivity? {
429-
return generateSequence(this) { (it as? ContextWrapper)?.baseContext }.filterIsInstance<ComponentActivity>().firstOrNull()
434+
return generateSequence(this) { (it as? ContextWrapper)?.baseContext }.filterIsInstance<ComponentActivity>()
435+
.firstOrNull()
430436
}

0 commit comments

Comments
 (0)