Ответы:
JPG и PNG файлы почти всегда будут меньше на диске, чем в памяти; они должны быть распакованы на лету, чтобы получить необработанные данные RGB, что потребует большей вычислительной мощности для загрузки и большего объема оперативной памяти. Многие современные движки предпочитают хранить на диске тот же формат, что и в памяти, что приводит к файлам того же размера, что и требования к текстуре (но также больше, чем PNG или JPG). RGB / RGBA и S3TC / DXTn / BCn являются наиболее широко используемыми форматами, поскольку они считываются прямо в память без какой-либо обработки (текстуры DXT предварительно сжаты).
Итак, это размеры для различных распространенных форматов текстур:
Если вы используете изображение с мипмапами , текстуре потребуется 4/3 больше памяти. Кроме того, ширина и высота текстуры могут быть внутренне округлены, чтобы быть степенью двойки на старых или менее способных аппаратных средствах, а на некоторых очень ограниченных аппаратных средствах, также вынужденных быть квадратными.
Больше информации о DXT: это сжатие с потерями; это означает, что некоторые цветовые данные теряются при сжатии текстуры. Это негативно влияет на вашу текстуру, искажая четкие границы и создавая «блоки» на градиентах; но преимущества намного лучше, чем недостатки (если у вас есть текстура, которая выглядит ужасно плохо в DXT, просто держите ее несжатой; другие компенсируют потерю размера). Кроме того, поскольку пиксели сжимаются блоками фиксированного размера, ширина и высота текстуры должны быть кратны четырем.
Очевидно: это зависит от формата.
Давайте возьмем квадратную текстуру 256 на 256 пикселей. Если он несжатый 32-разрядный с альфа-каналом ( Color
в XNA), то он занимает 256 КБ ( 256*256*4
байтов).
16-битные форматы (например Bgr565
:), очевидно, будут вдвое меньше - 128 КБ .
Тогда вы попадаете на сжатые форматы. В XNA у вас есть DXT1, DXT3 и DXT5 (также известный как S3 Compression ). Это формат сжатия с потерями. Это также блочный формат - это означает, что вы можете выбирать из него (потому что вы знаете, в каком блоке находится пиксель). Это также быстрее, потому что вы используете меньше пропускной способности.
Степень сжатия DXT1 составляет 8: 1, а для DXT3 и DXT5 - 4: 1.
Таким образом, размер изображения DXT1 256x256 составляет 32 КБ . И DXT3 или DXT5 составляет 64 КБ .
И затем есть мипмаппирование . Если это включено, это создает серию изображений в графической памяти, каждая половина размера предыдущего. Так для нашего изображения 256x256: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. Текстура с mipmapping примерно 133% от размера оригинала.
Большинство графических процессоров могут читать только очень специфический формат сжатия. например. BC *, DXT *, не такие форматы, как png. Так что да, по большей части это правда, что .png займет больше места в видеопамяти, чем на диске.
Текстуры могут храниться в сжатом или несжатом виде как в видеопамяти, так и в системной памяти.
Для несжатых текстур общее эмпирическое правило заключается в том, что он займет столько же места в видеопамяти, сколько в несжатом виде в системной памяти.
Для сжатых текстур DXT1. GPU хранит 8 байтов для каждой плитки 4x4 в вашей текстуре. Несжатые данные (8 бит на канал RGB) обычно бывают 4x4x3 = 48 байтов, так что коэффициент сжатия равен 6: 1. Для сжатых текстур DXT3 / DXT5 графический процессор хранит 16 байтов для каждой плитки 4x4 в вашей текстуре. Это немного более низкая степень сжатия 3: 1.
Есть несколько предостережений с несжатыми и сжатыми текстурами:
Большая часть памяти выделяется в страницах (размер которых зависит от графического процессора) фиксированного размера. например. 4 КБ и часто это не перераспределяется и совместно используется с другими данными GPU. То есть. если размер вашей текстуры меньше размера страницы, он часто остается размером страницы.
У некоторых графических процессоров есть очень специфические требования к выравниванию. В прошлом некоторые графические процессоры требовали, чтобы текстуры имели степень 2. Это часто требовалось для поддержки визуализированного представления (см. Morton Ordering: http://en.wikipedia.org/wiki/Z-order_(curve )) для улучшения локальности доступа при выборке из текстуры. Это означало, что текстуры странных размеров будут дополняться, чтобы сохранить эти требования (обычно это заполнение обрабатывается драйвером). Несмотря на то, что порядок следования демонов не обязательно используется в современном графическом процессоре, может существовать вздутие живота для поддержки конкретных требований графического процессора.
Несколько представлений вашей текстуры могут существовать в памяти в любой момент времени, особенно если вы используете на них блокировки отбрасывания. Это может привести к увеличению объема используемой памяти до тех пор, пока gpu больше не использует представления (обычно это несколько кадров после рендеринга процессора).
Если вы включите mipmapping, дополнительные mips будут потреблять в среднем около трети базового уровня mip. YMMV на основе вышеуказанных предостережений.
AFAIK, это ширина изображения * высота * BPP, независимо, если это PNG, JPG или BMP. Я не знаю, как устроен DDS или другие сжимаемые форматы.
Mip-mapping увеличит потребность в видеопамяти.
Мои знания в этой теме могут быть немного устаревшими. Я отказался от 3D некоторое время назад.