如何释放MTLBuffer和MTLTexture

问题描述 投票:3回答:2

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

textures metal vertex-buffer
2个回答
8
投票

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

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`___lldb_unnamed_symbol1095$$GeForceMTLDriver:
->  0x7fffd2e57b14 <+0>:  push   rbp
    0x7fffd2e57b15 <+1>:  mov    rbp, rsp

......并通过GeForceMTLDriver

dealloc

一直以来,通过各种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]; 方法释放任何资源。


1
投票

如果您使用自动引用计数,正如接受的答案所说,只需设置为nil。

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

https://developer.apple.com/documentation/metal/mtlresource/1515898-setpurgeablestate

关于setPurgeableState,你可以参考链接(qazxswpoi)

© www.soinside.com 2019 - 2024. All rights reserved.