wasabia / flutter_gl

cross-platform call OpenGL API by Dart through dart:ffi. Provides OpenGL with Texture Widget on Flutter.
245 stars 60 forks source link

Can't release memory After disposed the Texture #37

Open kingzhang-A11 opened 1 year ago

kingzhang-A11 commented 1 year ago

Hi, I have some problems when I tried to release memory. If I don't create a new textureId, the memory wouldn't be out of memory, but once I tried to dispose of one and create a new one, the memory will increase rapidly. After multiple operations, my app will crash... My code like this: ` @override void dispose() { picList![0].dispose(); picList![1].dispose();

_gl.deleteTexture(frameTextureList[0]);
frameTextureList[0] = 0;

_gl.deleteTexture(frameTextureList[1]);
frameTextureList[1] = 0;

_gl.deleteFramebuffer(defaultFramebuffers);
defaultFramebuffers = 0;

_gl.deleteRenderbuffer(defaultRenderbuffer);
defaultRenderbuffer = 0;

_gl.deleteTexture(frameTexture);
frameTexture = 0;

_gl.deleteTexture(frameTexture2);
frameTexture2 = 0;

_gl.deleteTexture(defaultFramebufferTexturess);
defaultFramebufferTexturess = 0;

_gl.deleteTexture(sourceTexture);
sourceTexture = 0;

if (vao != 0 && vao != null) {
  _gl.deleteVertexArray(vao);
  vao = 0;
}
if (vertexBuffer != 0 && vertexBuffer != null) {
  _gl.deleteBuffer(vertexBuffer);
  vertexBuffer = 0;
}
if (vertexBuffer1 != 0 && vertexBuffer1 != null) {
  _gl.deleteBuffer(vertexBuffer1);
  vertexBuffer1 = 0;
}

_gl.deleteProgram(glProgram);
glProgram = 0;
_gl.useProgram(0);
_gl.finish();

flutterGlPlugin.dispose();

super.dispose();

}`

I change the NativeArray.app.dart file to: `final freenalizer = NativeFinalizer(DynamicLibrary.executable().lookup('free'));

@override void dispose() { if (!disposed) { calloc.free(data); freenalizer.detach(this); disposed = true; } super.dispose(); }

NativeUint8Array(int size) : super(size) { _list = calloc(size); freenalizer.attach(this, _list.cast(), detach: this); oneByteSize = sizeOf(); } NativeUint8Array.from(List listData) : super.from(listData) { _list = calloc(listData.length); freenalizer.attach(this, _list.cast(), detach: this); oneByteSize = sizeOf(); this.toDartList().setAll(0, listData); } ` can someone help me fix this bug? Thank you!!!!!!!