Я создаю средство просмотра изображений на основе Metal и в настоящее время экспериментирую с загрузкой некоторых довольно больших изображений (70 000 x 24 000 пикселей).Изображение загружается в несколько MTLTextures
, каждый из которых типа MTLTextureType2DArray
.
Металл, кажется, создает текстуры и выделяет необходимую память, поскольку XCode сообщает о моем приложении, используя более 9 ГБ памяти.На моем 13 "MBP с 16 ГБ памяти у меня явно нет 9 ГБ памяти GPU для всех этих текстур, поэтому я предполагаю, что Металл использует системную память для выделения?
Однако, когда приходит времяПри выполнении прохода рендеринга Metal немедленно выдает ошибку Insufficient Memory
, когда я запрашиваю текущий дескриптор прохода рендеринга.
Как мне управлять распределением текстур, чтобы не превышать какие-либо пределы для металла или системы?какой-то размер изображения, который мне нужно будет переключить с загрузки всего изображения в память, на подход, основанный на использовании плитки, но он будет варьироваться от одной машины к другой в зависимости от графического процессора и оперативной памяти.
Я бы подумал, чтовыделение новых текстур в какой-то момент начнёт давать сбой, но я, кажется, смогу выделить достаточно, чтобы покрыть изображение шириной 70000 пикселей и высотой 24000 пикселей (BGRA8
), но это же выделение вызывает ошибку памяти при проходе рендерингапроисходит.
Правка №1:
Я только что понял, что при использовании MTLStorageModeManaged
для текстур Metal необходимо обновить представление текстуры в видеопамяти, только когда я назначаю текстуру индексу фрагмента во время моего прохода рендеринга.Если я не назначу все текстуры, то моя ошибка «Недостаточно памяти» исчезнет, потому что, по-видимому, осталось достаточно видеопамяти для того, чтобы Металл выделил для рисования.
Это говорит о том, что у меня может быть столько же данных текстуры, сколько у меня в системной памяти, но мне нужно быть осторожным, сколько из этих текстурных данных я получаю во время прохода рендеринга, чтобы не исчерпать доступную видеопамять.
Ошибка консоли Xcode:
Выполнение буфера команд было прервано из-за ошибки во время выполнения.Недостаточно памяти (код IOAF 8)
Трассировка стека:
![Xcode Stack Trace](https://i.stack.imgur.com/5r4AP.png)
ПамятьДатчик:
![Memory Gauge](https://i.stack.imgur.com/hf7w6.png)