gpt4 book ai didi

ios - 修复或避免默认第三方库中的内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:06:14 28 4
gpt4 key购买 nike

我开发了一个应用程序,其中包含即时预览 3D 模型的分割结果的功能。我有自己的 catmull clark 分割函数来永久修改几何体,但我使用 SCNGeometry 的 .subdivisionLevel 属性临时分割模型作为预览。在大多数情况下,预览并不自动意味着用户会选择永久选项。

.subdivisionLevel 使用(就像 MDLMesh 的分割一样,我尝试将其作为解决方法)Pixar 的 OpenSubdiv 来进行实际的分割和平滑。它比我自己的运行速度更快,但更重要的是,它不会永久修改我通过 SCNGeometry 源提供的顶点数据。

问题是,我无法让它停止泄漏内存。我很久以前第一次注意到这一点,认为这是我的代码中的东西。我不认为它只是一个特定的 IOS 版本,它发生在 Swift 和 Objective C 中。最终我设置了一个小例子,在 Xcode 中的 SceneKit 游戏模板中添加了 1 行,将船的 subdivisionLevel 设置为 1。仪器显示立即导致内存泄漏:

enter image description here

我一周前向 Apple 提交了一份错误报告,但我不确定我是否能很快或根本不会得到回复或修复。屏幕截图来自一个非常小的模型的测试,但即使是小模型(成百上千个顶点)它也会快速泄漏并导致应用程序崩溃。

要重现,请基于 SceneKit 游戏模板在 Xcode 中创建一个新项目,并将以下行添加到 handletap:

  if result.node.geometry!.subdivisionLevel == 3 {
result.node.geometry!.subdivisionLevel = 0
} else {
result.node.geometry!.subdivisionLevel = 3
}

(删除 objective-c 的!)点击飞船泄漏兆字节,再点击它一些,它很快就会加起来。

OpenSubdiv 显然在 3D Studio max 和其他软件中使用,而且它似乎在 Apple 的实现中。所以我的问题是:有没有办法在不完全放弃 SceneKit 的分割功能的情况下解决/避免这个问题,或者苹果的回应是我唯一的机会?

最佳答案

通过 WWDC 视频了解 Apple 对 OpenSubdiv 的 promise 程度以及他们修复漏洞的可能性,我发现自最新的 SceneKit 更新以来,Metal 可以在 GPU 上执行分割。

如果您想在 SceneKit 或 Model IO 中使用分割,这里是必需的两行 (Swift):

let tess = SCNGeometryTessellator()
geometry.tessellator = tess

(来自 WWDC 2017 What's new in Scenekit,视频 23:45)

这将导致在 GPU 上执行分割(因此速度更快,尤其是在更高级别时),使用更少的内存,最重要的是,在将分割级别设置为较低或回零时释放内存。

关于ios - 修复或避免默认第三方库中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com