Является ли большая MTLTexture более производительной, чем использование нескольких меньших MTLTexture? - PullRequest
0 голосов
/ 26 ноября 2018

Я использую Металл для отображения изображения в 2D плоскости.Изображение рендерится как плитки на IOSurface с использованием Core Image.После рендеринга каждой плитки IOSurface отправляется через XPC в приложение, оборачивается в MTLTexture, а его содержимое копируется в основную текстуру с использованием blit-кодировщика.IOSurface затем используется повторно, если это необходимо.

У меня есть полный контроль над размерами плиток и размерами текстур, и мне интересно, предпочитает ли Metal иметь небольшое количество больших текстур, большое количество маленькихтекстуры или если это просто не имеет значения

Есть некоторые компромиссы, с которыми я уже сталкивался, и наиболее заметным из них является то, что если я использую меньшие текстуры, то стоимость (повторного) создания мипмапов может быть меньше.Существует также проблема текстур, имеющих максимальный размер 16384, что подразумевает, что любое изображение, которое больше этого размера, должно быть в любом случае мозаичным.

Примите во внимание следующее:

Размеры изображения, использованные ниже, приведены просто для упрощения математики, в реальной жизни я работаю с изображениями DSLR, панорамами, сшитыми изображениями и т. Д.

# 1 - одна текстура, которая покрывает все изображение:

Single Tile

Texture Type: MTLTextureType2D
Texture Size: 400 x 300 px

КогдаБазовое изображение рендерит плитку, и я копирую ее в текстуру, я должен регенерировать мипмапы для всей текстуры, хотя большая часть содержимого текстуры не изменилась.


# 2 - Использование двух текстур:

Two Tiles

Texture Type: MTLTextureType2DArray
Texture Array Count: 2
Texture Size: 200 x 300 px (x2)

С покрытием двух плитоксодержание изображения, мне нужно только восстановить мип-карты для «грязной» плитки.


# 3 - Использование множества текстур:

Many Tiles

Texture Type: MTLTextureType2DArray
Texture Array Length: 12
Texture Size: 100 x 100 px (x12)

В этом сценарииЯ могу свести к минимуму создание mip-карт, сопоставив размер плитки текстуры с моим размером плитки рендеринга, но для этого потребуется большое количество MTLTextures.


MTLTextureDescriptor.arrayLength, документированное как способное хранить значения между1..2048, что говорит о том, что использование большого количества текстур не так уж плохо.

Единственная текстура передается моему фрагментному шейдеру, и все, что она делает, это пробует цвет в соответствующих координатах.

Использование текстур меньшего размера дает мне гораздо большую точность в маркировке «грязных» областей изображения, которые необходимо аннулировать, но мне любопытно, следует ли избегать большого количества текстур или нет.

Мои нынешние попытки измерить производительность несколько важны для меня, и мне интересно, если это потому, что это не имеет значения с точки зрения Металла.В конечном счете, необходим тот же объем памяти (с моей точки зрения), но мне было бы интересно узнать, есть ли компромиссы в производительности, о которых я не знаю.

...