如何释放MTLBuffer和MTLTexture

时间:2016-08-26 04:27:50

标签: textures metal vertex-buffer

我知道如何创建MTLBuffer和/或MTLTexture但是如何在不再需要这些资源时释放GPU内存?

2 个答案:

答案 0 :(得分:8)

MTLBufferMTLTexture是Objective-C对象,因此引用计数。如果您在Objective-C项目中使用自动引用计数或通过Swift使用Metal,只需确保不再保留对缓冲区或纹理的引用即可释放任何相关的硬件资源。

let texture: MTLTexture? = device.newTexture(with: descriptor)
texture = nil // <- resources will be released

在将nil分配给texture时,可以通过逐步关联相应的程序集来确认这一点,这首先引导我们[MTLDebugTexture dealloc]

MetalTools`-[MTLDebugTexture dealloc]:
    ...
->  0x100af569e <+34>: call   0x100af87ee               ; symbol stub for: objc_msgSendSuper2
    0x100af56a3 <+39>: add    rsp, 0x10
    0x100af56a7 <+43>: pop    rbp
    0x100af56a8 <+44>: ret    

...并通过[MTLToolsObject dealloc]

MetalTools`-[MTLToolsObject dealloc]:
    0x100ac6c7a <+0>:   push   rbp
    0x100ac6c7b <+1>:   mov    rbp, rsp
    0x100ac6c7e <+4>:   push   r14
    ...

......并通过GeForceMTLDriver

GeForceMTLDriver`___lldb_unnamed_symbol1095$$GeForceMTLDriver:
->  0x7fffd2e57b14 <+0>:  push   rbp
    0x7fffd2e57b15 <+1>:  mov    rbp, rsp

一直通过各种dealloc方法释放任何资源。

答案 1 :(得分:1)

如果您使用的是自动引用计数,则如已接受的答案所述,  设置为零。

但是,如果您使用手动引用计数,则Metal具有两种动态分配的资源(MTLBuffer和&MTLTexture),您可以释放 他们以下面的方式。

id<MTLDevice> m_Device = MTLCreateSystemDefaultDevice();
// allocate Buffer
NSUInteger BufferLength = 100;
id<MTLBuffer> m_Buffer = [m_Device newBufferWithLength:BufferLength options:0]; 

// allocate Texture
MTLTextureDescriptor *shadowTextureDesc = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: MTLPixelFormatDepth32Float width: 1024 height: 1024 mipmapped: NO];
id<MTLTexture> m_Texture = [m_Device newTextureWithDescriptor:shadowTextureDesc];

// release Buffer
[m_Buffer setPurgeableState:MTLPurgeableStateEmpty]; 
[m_Buffer release];

// release Texture
[m_Texture setPurgeableState:MTLPurgeableStateEmpty];
[m_Texture release];

关于setPurgeableState,您可以参考链接(https://developer.apple.com/documentation/metal/mtlresource/1515898-setpurgeablestate