Как освободить id ‹MTLBuffer› металла iOS?

Я использую id<MTLBuffer> vertexBuf = [device newBufferWithLength:count * sizeof(float) options:0];, как освободить память vertexBuf, это резко увеличивает память. В документации Apple нет намека на то, чтобы освободить MTLBuffers, и в моем случае я не могу использовать его повторно. Я пробовал vertexBuf = nil; без улучшений, и я не могу использовать [vertexBuf release], так как в моем проекте включена функция ARC. Любой способ освободить память?

Изменить:
Я могу использовать повторно, но в OpenGLES2 glDeleteBuffers есть опция, которая полезна во многих случаях. Так что я ищу что-то подобное в металле.


person VivekParamasivam    schedule 07.04.2015    source источник
comment
Почему нельзя повторно использовать буфер?   -  person aledalgrande    schedule 14.04.2015
comment
Я могу использовать повторно, но в OpenGLES2 есть опция glDeleteBuffers, которая полезна во многих случаях. Так что я ищу что-то подобное в металле.   -  person VivekParamasivam    schedule 15.04.2015
comment
Попробуйте спросить на форумах разработчиков Apple: devforums.apple.com/community/ios/graphics / металл   -  person aledalgrande    schedule 15.04.2015


Ответы (2)


Узнайте, кто использует vertexBuf. Кто-то использует его и держится за него, иначе память исчезнет, ​​если вы установите его на ноль.

КСТАТИ. Релиз тебе не поможет. ARC сохраняет / выпускает для вас, за исключением того, что он, вероятно, более осторожен и всегда делает это правильно. Если бы вы могли освободить его, и память исчезла, ваше приложение вылетело бы, когда тот, кто использовал vertexBuf, также освободил бы его.

person gnasher729    schedule 07.04.2015
comment
Рассмотрим состояние, в котором вы знаете, что никто не держит vertexBuf, и в этом состоянии нам нужно освободить память. Итак, как освободить место? - person VivekParamasivam; 07.04.2015

Попробуйте это: [vertexBuf setPurgeableState:MTLPurgeableStateEmpty];

Это из документации Apple:

Если состояние - MTLPurgeableStateEmpty, ресурс помечается как данные, которые можно отбросить, поскольку вызывающему абоненту больше не нужно содержимое ресурса.

person llama591    schedule 14.06.2015