Closed kustraslawomir closed 1 year ago
@ThomasGorisse
each memory jump is a session creation and closing
@ThomasGorisse without building ViewRenderable & ModelRenderable there are no leaks at all. Maybe +- 200MB, but not that much. The app is stable. How can I release renderable's? What I'm missing? :( Could You please take a chance to help with this?
on low-quality modelRenderable (1,5 MB) There is no big deal, only on larger models (like 10-15MB).
I guess, 1MB of .glb files leaves 8-10MB of locked RAM memory on each session.
Same Issue on the official sample.
halloween.glb
@ThomasGorisse https://github.com/google/filament/releases/tag/v1.22.2 engine: Fix some memory leaks.
Maybe it is fixed in filament 1.22.2?
@kustraslawomir hello, Look at RenderableInstance#createFilamentAssetModelInstance(). Free up FilamentAssets. like this, use RenderableInstance#destroyGltfAsset()
public class RenderableInstance implements AnimatableModel {
//desc added by ikkyu will be used when loading gltf resources.
private AssetLoader loader;
...
void createFilamentAssetModelInstance() {
if (renderable.getRenderableData() instanceof RenderableInternalFilamentAssetData) {
RenderableInternalFilamentAssetData renderableData =
(RenderableInternalFilamentAssetData) renderable.getRenderableData();
Engine engine = EngineInstance.getEngine().getFilamentEngine();
//updated by ikkyu
loader =
new AssetLoader(
engine,
RenderableInternalFilamentAssetData.getMaterialProvider(),
EntityManager.get());
FilamentAsset createdAsset = renderableData.isGltfBinary ? loader.createAssetFromBinary(renderableData.gltfByteBuffer)
: loader.createAssetFromJson(renderableData.gltfByteBuffer);
...
}
...
public void destroyGltfAsset(){
if (loader == null)return;
if (filamentAsset != null){
loader.destroyAsset(filamentAsset);
filamentAsset = null;
}
}
@eqgis What sceneform version do you use? I have a slightly different implementation. There is no destroyGltfAsset method or class member 'loader' variable.
Thank you, I will try to implement this.
@kustraslawomir The earlier version I used. The method of destroyGltfAsset was I added. You can refer it.
@eqgis In sceneView/sceneform-android there is com.gorisse.thomas.sceneform\core\1.21.0
@eqgis ok thank you! <3
@kustraslawomir You're welcome, study together.
@eqgis
I think with your solution memory usage is more optimal. Thank you!!!
@eqgis On the above screen I reopened the session with 12MB .glb file 10 times.
Full solution:
package com.ultron.ar.utils
import com.google.android.filament.Engine
import com.google.android.filament.EntityManager
import com.google.android.filament.gltfio.AssetLoader
import com.google.android.filament.gltfio.FilamentAsset
import com.google.android.filament.gltfio.UbershaderLoader
import com.google.ar.sceneform.rendering.EngineInstance
import com.google.ar.sceneform.rendering.RenderableInstance
object CleanAssetsUseCase {
private var engine: Engine = EngineInstance.getEngine().filamentEngine
private val materialProvider = UbershaderLoader(engine)
private var loader = AssetLoader(
engine,
materialProvider,
EntityManager.get()
)
fun destroyGltfAsset(filamentAsset: FilamentAsset?) {
if (filamentAsset != null) {
loader.destroyAsset(filamentAsset)
}
}
}
fun RenderableInstance?.clear() {
this?.let { renderableInstance ->
CleanAssetsUseCase
.destroyGltfAsset(renderableInstance.filamentAsset)
renderableInstance.detachFromRenderer()
renderableInstance.destroy()
}
}
@eqgis there might be some problems with CleanAssetsUseCase? What do You think?
@ThomasGorisse Sorry to worry You, but I have a huge problem with memory.
I'm trying everything, but nothing works.
What else can I do? I can't migrate to sceneview as my project is too large at this point.
Each session (for example navigation to arFragment, add +- 100mb to memory stack. So after 10-15 sessions app crashes due to memory usage. Is anything I can do?
Some code with load AR models: