Скільки пам'яті займає текстура на графічному процесорі?


9

Великий png на диску може займати лише пару мегабайт, але я думаю, що на gpu той самий png зберігається у нестисненому форматі, який займає набагато більше місця. Це правда? Якщо це правда, скільки місця?

Відповіді:


16

Файли JPG та PNG майже завжди будуть меншими на диску, ніж у пам'яті; їх потрібно декомпресувати на ходу, щоб отримати необроблені RGB-дані, тим самим вимагаючи більшої потужності для завантаження та більше оперативної пам'яті після цього. Так багато сучасних двигунів вирішили зберігати на диску такий самий формат, що і у пам'яті, що призводить до файлів такого ж розміру, що і вимоги до пам'яті текстури (але також більших, ніж PNG або JPG). RGB / RGBA і S3TC / DXTn / BCn - це найбільш широко використовувані формати, оскільки вони читаються прямо в пам'ять без будь-якої обробки (тексту DXT попередньо стискаються).

Отже, це розміри для різних поширених форматів текстур:

  • L (яскравість, наприклад, відтінки сірого): ширина * висота * 1 байт.
  • LA (яскравість та альфа, поширені для шрифтів): ширина * висота * 2 байти.
  • RGB (колір, без альфа): ширина * висота * 3 байти.
  • RGBA (колір з альфа): ширина * висота * 4 байти.
  • DXT1 / BC1 (колір, двійковий альфа): (ширина * висота * 4 байти) / 8 (коефіцієнт стиснення 8: 1).
  • DXT3 / BC2 (колір, різка альфа) / DXT5 / BC3 (колір, градієнта альфа): (ширина * висота * 4 байти) / 4 (коефіцієнт стиснення 4: 1).

Якщо ви використовуєте зображення з міпмапами , текстура вимагатиме 4/3 стільки пам’яті. Крім того, ширина і висота текстури можуть бути округлені внутрішньо, щоб бути потужністю двох на старому або менш здатному обладнання, а також на деяких дуже обмежених обладнаннях, також змушених бути квадратними.

Більше інформації про DXT: це стиснення втрат; це означає, що деякі дані про колір втрачаються при стисненні текстури. Це негативно впливає на вашу текстуру, спотворюючи гострі рамки та створюючи «блоки» на градієнтах; але переваги набагато кращі, ніж недоліки (якщо у вас DXT текстура виглядає жахливо погано, просто тримайте її нестиснутою; інші компенсують втрату розміру). Крім того, оскільки пікселі стискаються блоками фіксованого розміру, ширина та висота текстури повинні бути кратними чотирма.


Це правильно, за винятком першого пропозиції: формат текстури на диску може бути будь-яким сильно стиснутим форматом, і тому він не займає такого ж місця на диску, як у VRAM, за винятком форматів дисків, які є прямими серіалізаціями форматів пам'яті.

Звичайно, можна, але перевіряйте активи, які використовуються в іграх, створених за допомогою Unreal Engine, Source та ін. Вони зазвичай не стискаються на диску, тому що на сьогоднішній день є більше ніж достатньо місця на диску, щоб залишити ресурси нестисненими; а заощаджений простір не компенсує додатковий час оперативної пам'яті та процесора, необхідний для розпакування файлів при кожному завантаженні.
r2d2rigo

1
Я думаю, ви знайдете, що варіюється від двигуна до двигуна. Багато великих двигунів - особливо ті, що працюють на консолях - використовуватимуть формат диска, ідентичний або близький до формату пам'яті. Але досить легко знайти ігри для ПК, що доставляють активи PNG або JPEG. Якщо вам доведеться перейти на диск для завантаження, яке все одно буде домінувати у вашому часі. Крім того, Майк конкретно згадує PNG та JPEG як формат диска.

В основному правильно, за винятком того, що формати RGB зазвичай не існують на графічних процесорах; дивіться: opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

Очевидно: Це залежить від формату.

Візьмемо квадратну текстуру 256 на 256 пікселів. Якщо він нестиснений 32-бітний з альфа-каналом ( Colorу XNA), то він займає 256 КБ ( 256*256*4байт).

16-бітні формати (наприклад :),Bgr565 очевидно, будуть наполовину меншими - 128 КБ .

Потім ви потрапляєте на стислі формати. У XNA у вас є DXT1, DXT3 і DXT5 (також відомий як компресія S3 ). Це формат стиснення збитків. Це також формат на основі блоку - це означає, що ви можете зробити вибірку з нього (адже ви знаєте, в якому блоці знаходиться піксель). Це також швидше, оскільки ви використовуєте меншу пропускну здатність.

Коефіцієнт стиснення DXT1 становить 8: 1, а для DXT3 і DXT5 - 4: 1.

Отже, зображення DXT1 розміром 256x256 становить 32 КБ . А DXT3 або DXT5 - 64 КБ .

А потім є карта карти . Якщо це ввімкнено, це створює серію зображень у графічній пам’яті кожну половину розміру попередньої. Отже для нашого розміру 256x256: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Текстура з картографічним відображенням приблизно на 133% перевищує розмір оригіналу.


4

Більшість графічних процесорів можуть читати лише дуже специфічний формат стиснення. напр. BC *, DXT *, не формати, як png. Так, так, здебільшого вірно, що .png займе більше місця у відеопам'яті, ніж на диску.

Текстури можуть зберігатися стислі або нестиснуті як у відеопам'яті, так і в системній пам'яті.

Для нестиснених текстур загальне правило полягає в тому, що це займе стільки ж місця у відеопам'яті, скільки в нестисненому вигляді в системній пам'яті.

Для стислих текстур DXT1. GPU зберігає 8 байтів для кожної плитки 4x4 у вашій текстурі. Нестиснені дані (при 8 бітах на RGB-канал) зазвичай становлять 4х4х3 = 48 байт, тому це коефіцієнт стиснення 6: 1. Для стислих текстур DXT3 / DXT5 GPU зберігає 16 байт для кожної плитки 4x4 у вашій текстурі. Це трохи нижчий коефіцієнт стиснення 3: 1.

Існує декілька застережень із стислими та стислими текстурами:

  • Більшість пам'яті розподіляється на сторінках (розмір яких варіюється між графічними процесорами) фіксованого розміру. напр. 4 КБ, і часто це не виділяється і не ділиться з іншими даними gpu. Тобто якщо ваш текстурний слід менший за розмір сторінки, слід у пам’яті vid часто все ще буде розміром сторінки.

  • Деякі gpus мають дуже специфічні вимоги до вирівнювання. Раніше деякі графічні процесори мали вимогу, щоб текстури були потужністю 2. Це часто було потрібно для підтримки шикарного представлення (див. Замовлення Мортона: http://en.wikipedia.org/wiki/Z-order_(curve )) для покращення локальності доступу під час вибірки з текстури. Це означало, що текстури непарних розмірів будуть забиті для збереження цих вимог (як правило, з цією накладкою обробляється драйвер). Хоча замовлення мортона не обов'язково використовується в сучасних гпусах, все ще може бути здуття живота, щоб підтримати конкретні вимоги gpu.

  • Кілька зображень вашої текстури можуть існувати в пам'яті в будь-який момент часу, особливо якщо ви використовуєте скасовувані блоки на них. Це може посилити використання вашої пам’яті до тих пір, поки gpu не використовуватиме представлення (як правило, це декілька кадрів позаду CPU-рендерінгу)

  • Якщо ви ввімкнете відображення карт, додаткові пробіли споживають в середньому приблизно третину базового рівня мип. YMMV на основі вищезазначених застережень.


0

AFAIK - це ширина зображень * висота * BPP, незалежна, якщо це PNG, JPG або BMP. Я не знаю, як розміщуються DDS або інші формати, що стискаються.

Mip-карти збільшать потребу в відеопам'яті.

Мої знання з цієї теми можуть бути трохи застарілими. Я покинув 3D деякий час тому.


2
Зображення також мають крок (або крок), що становить кількість байтів між кінцем одного рядка та початком наступного рядка пікселів. Ніхто ще не згадав про це, щоб я міг помилитися.
CiscoIPPhone

1
Зазвичай "крок" відноситься до довжини сканування в байтах (як у Freetype та SDL), а "stride" посилається на простір між елементами, який може бути пікселями або сканерами (як у аргументі OpenGL та Python 3-го фрагмента). Обидва значення необхідні для обробки зображень, але "зазвичай" крок = ширина * bytes_per_pixel і stride = 0. Терміни часто використовуються нескінченно і плутано, тому краще перевірити документи API на вашу бібліотеку на вибір.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.