Swift 内存使用量的增长似乎与金属对象有关

Swift 内存使用量的增长似乎与金属对象有关,swift,metal,Swift,Metal,我目前正在开发一个应用程序,它使用金属来高效地渲染三角形和评估纹理上的适应度函数,我注意到我的金属应用程序的内存使用量正在增长,我真的不明白为什么 首先,我惊讶地看到,在调试模式下,根据Xcode debug panel,内存使用增长非常缓慢(生成200个图像后约20 MB),而在发布时增长得更快(生成200个图像后约100 MB)。 我不存储生成的图像(至少不是故意的……但可能有一些我不知道的泄漏) 我试图了解泄漏(如果是)的来源,但我真的不知道从哪里开始,我拍摄了一个GPU帧捕获以查看金属使

我目前正在开发一个应用程序,它使用金属来高效地渲染三角形和评估纹理上的适应度函数,我注意到我的金属应用程序的内存使用量正在增长,我真的不明白为什么

首先,我惊讶地看到,在调试模式下,根据Xcode debug panel,内存使用增长非常缓慢(生成200个图像后约20 MB),而在发布时增长得更快(生成200个图像后约100 MB)。
我不存储生成的图像(至少不是故意的……但可能有一些我不知道的泄漏)

我试图了解泄漏(如果是)的来源,但我真的不知道从哪里开始,我拍摄了一个GPU帧捕获以查看金属使用的对象,我觉得它可疑:

看起来有数千个对象(列表比您在左面板上看到的要长得多)

每次我画一幅图像时,总有一刻我会调用以下代码:

trianglesVerticesCoordiantes = device.makeBuffer(bytes: &positions, length:  bufferSize , options: MTLResourceOptions.storageModeManaged)
triangleVerticiesColors = device.makeBuffer(bytes: &colors, length: bufferSize, options: MTLResourceOptions.storageModeManaged)
我肯定会一次性分配,然后在需要时简单地将数据复制到这个缓冲区中,但它是否会导致内存泄漏

使用仪器屏幕截图编辑:

编辑#2:使用Inspector时存在大量命令编码器对象:

编辑#3:以下是在分析哪个Xcode可视化调试器时最可疑的内存图:

还有一些细节:

我真的不知道怎么解释这个


谢谢。

可能不会。您是否使用Instruments中的Leaks仪器和Xcode中的static analyzer试图缩小泄漏源?@warrenm未检测到泄漏,但我刚刚注意到一些float4阵列的“总字节数”为9.61 GB(使用屏幕截图更新了我的答案),如果我查看代码中的正确阵列,我没有看到它的大小增加,但是…@warrenm这次我用“所有堆和匿名VM”部分的视图再次更新了我的问题,那里有许多金属对象(它们占了列表的95%)。看起来它们是命令编码器,但我一点也不明白为什么它们没有被解除分配。@grovesNL没有,我从来没有这样做过,这只是一个测试项目,所以我转到了其他项目。老实说,这真是令人惊讶,你用的是斯威夫特吗?我记得我曾大量使用协议,这让我怀疑是否会有一些罕见的错误可能来自Swift,但这只是一个假设。可能不会。您是否使用Instruments中的Leaks仪器和Xcode中的static analyzer试图缩小泄漏源?@warrenm未检测到泄漏,但我刚刚注意到一些float4阵列的“总字节数”为9.61 GB(使用屏幕截图更新了我的答案),如果我查看代码中的正确阵列,我没有看到它的大小增加,但是…@warrenm这次我用“所有堆和匿名VM”部分的视图再次更新了我的问题,那里有许多金属对象(它们占了列表的95%)。看起来它们是命令编码器,但我一点也不明白为什么它们没有被解除分配。@grovesNL没有,我从来没有这样做过,这只是一个测试项目,所以我转到了其他项目。老实说,这真是令人惊讶,你用的是斯威夫特吗?我记得我曾大量使用协议,这让我怀疑是否会有一些罕见的错误可能来自Swift,但这实际上只是一个假设。