【问题标题】:Severe memory leaks in the Autodesk Forge viewer on devices设备上 Autodesk Forge 查看器中的严重内存泄漏
【发布时间】:2018-02-23 10:38:38
【问题描述】:

我正在开发一个 Angular/Typescript 应用程序,它使用 Autodesk Forge 查看器在智能手机和平板电脑上显示建筑模型。应用程序本身运行平稳,但是当我关闭应用程序时出现问题。关闭应用程序后,我注意到几乎没有任何内存被释放,如下图所示(我在 8 秒左右关闭应用程序),再打开查看器两到三次后,它会耗尽内存和崩溃。 当我关闭应用程序时,我调用了 Forge 文档中描述的 tearDown() 和 finish() 方法,并将对 Forge 查看器的所有可能引用设置为 null,但它们的内存泄漏仍然存在。这是我的查看器代码的主要部分:

this.initOptions = {
    path: 'url to model',
    env: 'Local',
    useADP: false,
    extensions: [],
};

Autodesk.Viewing.Initializer(this.initOptions, () => {

    this.onEnvInitialized();
});

private onEnvInitialized() {

    this.viewer = new Autodesk.Viewing.Private.GuiViewer3D(this.viewerContainer.nativeElement, {});
    this.viewer.initialize();
    this.viewer.loadModel(this.initOptions.path, {}, (doc) => {
        // further forge viewer execution here
    }, (errorMsg) => {
        console.log(errorMsg);
    });
}

public ngOnDestroy() {

    // remove all eventlisteners
    this.initOptions = null;
    this.viewer.tearDown();
    this.viewer.finish();
    this.viewer = null;
}

这是一个已知问题和/或有什么方法可以在关闭后手动释放 Forge 查看器使用的内存? (这是用例的一部分,我必须能够在一个会话中依次打开三个以上的查看器。)

更新 [19-09-17]

我尝试在一个新的、空的 angular2 项目中打开我的查看器,尽管通常使用的内存较少,但不清除内存的相同行为仍然适用,如 here 所示。我确实注意到事件侦听器现在大大减少了。我还将 Forge Viewer 更新到版本 2.17,同样的问题在这里仍然适用。

【问题讨论】:

    标签: memory-leaks autodesk-forge autodesk-viewer


    【解决方案1】:

    您当前使用的是哪个版本的查看器?在这里您可以看到查看器版本的最新更改列表,v2.17 默认情况下有一个内存限制。

    https://developer.autodesk.com/en/docs/viewer/v2/overview/changelog/

    如果查看器的版本没有在控制台中定义,也可以通过输入 LMV_VIEWER_VERSION 来检查它

    【讨论】:

    • 嗨 Jaime,我目前正在使用 Forge 查看器的 2.13 版本。我已经尝试过更新版本的查看器,但这破坏了我们的大部分事件处理,所以我最终恢复到 2.13
    • 您好,我建议您尝试升级到更新版本,以解决您遇到的内存泄漏问题。您目前在使用 Viewer 时遇到什么样的问题会破坏您的事件处理?如果不升级到较新版本,我不相信有什么办法可以解决这个问题。
    • 升级到2.17后,FINAL_FRAME_RENDERED_CHANGED_EVENT在项目中不再触发。我们将此事件侦听器与GEOMETRY_LOADED_EVENT 一起使用来确定查看器何时可以使用。但是由于第一个事件永远不会触发,应用程序将在等待事件触发时卡住。这个事件处理程序是否有替代方法或任何其他方式来知道模型何时完全加载?
    • 嗨,我已经用v2.17v3.1.1 测试了FINAL_FRAME_RENDERED_CHANGED_EVENT 事件,它在我这边运行良好。您介意向forge.help@autodesk.com 提供一个可重现的案例(没有角度框架的纯伪造应用程序)吗? 请在发送给我们之前从您提供的任何内容中删除机密数据,谢谢!
    • 嗨@EasonKang,我将我们查看器的纯JS 版本发送到Autodesk 帮助台。希望这会有所帮助。我确实注意到该事件偶尔不会触发(大约每 5 次打开查看器一次)。
    【解决方案2】:

    问题仍然存在于 3.3.5 版 forge 查看器中。然而,这个问题似乎有点深。看起来在调用 viewer.finish() 时它不会释放任何用于纹理的 GPU 内存。

    每当您使用查看器离开页面时,我们都会调用此函数,因为 Angular 会破坏 DOM 中的画布。我希望 .finish 也会从内存中删除纹理。是否可以调用其他函数来完全卸载任何模型和纹理?

    这里有一些屏幕截图,您可以从中看到内存累积。

    Initial initialisation of the page

    after returning to this page after closing it

    after returning to this page after closing it a third time

    【讨论】:

    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
    • 这不是一个新问题,它是 Sjoerds 问题的扩展,包含更多数据。它与 Sjoerd 相同应用程序中的完全相同的问题相关。
    • 您将问题作为答案,无论是新的还是扩展的,请理解这不是这个地方
    • 我希望我明白你刚才说的话。我无法将附加信息作为评论发布,所以我不得不求助于它作为一个问题。如果有其他方法可以做到这一点,这并不意味着创造一个全新的问题,我很想听听。为了澄清起见,我对原始海报提出的问题的项目进行了工具化。我设法更深入地研究了这个问题,并且基本上设法更好地确定了问题所在。这就是为什么我不认为这是一个新问题。
    猜你喜欢
    • 2019-10-11
    • 2021-02-22
    • 2021-12-31
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2011-08-20
    • 2021-12-19
    相关资源
    最近更新 更多