Browse Source

better viewer dispose

Raanan Weber 7 năm trước cách đây
mục cha
commit
6a8ecef9e8
2 tập tin đã thay đổi với 40 bổ sung1 xóa
  1. 8 1
      Viewer/src/templateManager.ts
  2. 32 0
      Viewer/src/viewer/viewer.ts

+ 8 - 1
Viewer/src/templateManager.ts

@@ -163,6 +163,7 @@ export class TemplateManager {
         Object.keys(this.templates).forEach(template => {
             this.templates[template].dispose();
         });
+        this.templates = {};
 
         this.onInit.clear();
         this.onAllLoaded.clear();
@@ -355,11 +356,17 @@ export class Template {
         this.onStateChange.clear();
         this.isLoaded = false;
         // remove from parent
-        this.parent.removeChild(this.fragment);
+        try {
+            this.parent.removeChild(this.fragment);
+        } catch (e) {
+            //noop
+        }
 
         this.loadRequests.forEach(request => {
             request.abort();
         });
+
+        delete this.fragment;
     }
 
     private getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {

+ 32 - 0
Viewer/src/viewer/viewer.ts

@@ -33,6 +33,8 @@ export abstract class AbstractViewer {
     protected maxShadows: number;
     private _hdrSupport: boolean;
 
+    private _isDisposed: boolean;
+
     public get isHdrSupported() {
         return this._hdrSupport;
     }
@@ -619,20 +621,50 @@ export abstract class AbstractViewer {
     }
 
     public dispose() {
+        if (this._isDisposed) {
+            return;
+        }
         window.removeEventListener('resize', this.resize);
         if (this.sceneOptimizer) {
             this.sceneOptimizer.stop();
             this.sceneOptimizer.dispose();
         }
 
+        if (this.environmentHelper) {
+            this.environmentHelper.dispose();
+        }
+
+        //observers
+        this.onEngineInitObservable.clear();
+        delete this.onEngineInitObservable;
+        this.onInitDoneObservable.clear();
+        delete this.onInitDoneObservable;
+        this.onLoaderInitObservable.clear();
+        delete this.onLoaderInitObservable;
+        this.onModelLoadedObservable.clear();
+        delete this.onModelLoadedObservable;
+        this.onModelLoadErrorObservable.clear();
+        delete this.onModelLoadErrorObservable;
+        this.onModelLoadProgressObservable.clear();
+        delete this.onModelLoadProgressObservable;
+        this.onSceneInitObservable.clear();
+        delete this.onSceneInitObservable;
+
         if (this.scene.activeCamera) {
             this.scene.activeCamera.detachControl(this.canvas);
         }
 
+        this.models.forEach(model => {
+            model.dispose();
+        });
+
+        this.models.length = 0;
+
         this.scene.dispose();
         this.engine.dispose();
 
         this.templateManager.dispose();
+        this._isDisposed = true;
     }
 
     protected abstract prepareContainerElement();