Почему игры занимают все больше места?
Список игр, которые вскоре легко будут занимать более 100 Гб, безостановочно растет.
Помните, всего лишь месяц назад я писал, что технология HDD умерла для меня? Некоторые из последних игр очень стараются заставить меня пересмотреть эту точку зрения. Как только я подумал, что 1 Тб памяти будет более чем достаточно, а про 2 Тб даже говорить не приходилось, сразу же появилось (или стало известно о скором выходе) несколько игр, размер которых превысит 100 Гб. Конечно же, мне не нужно устанавливать на ПК все имеющиеся у меня игры, но мне нравится держать некоторую коллекцию для разнообразных тестов и всякого такого. Но я впал в изумление, когда увидел Red Dead Redemption 2, готовую поглотить 150 Гб, и Call of Duty: Modern Warfare, на которую в конечном итоге, судя по тому, что известно, может понадобиться 175 Гб.
Что за полнейший бред творится с размером игр?! Индустрия внезапно перепрыгнула с 50 Гб, считающихся огромными, до почти трехкратного превышения! Я помню, когда целые игровые миры могли содержаться всего лишь на одной дискете - ну, может, на коллекции дискет. Не важно. Дело в том, что, если бы мы все еще работали в дистрибуции с физическими носителями, мы смотрели бы на игры, которые требовали бы по 20 DVD, 250 CD или, если хотите, 121 500 3,5-дюймовых дискет). Разумеется, речь идет про версию с «высокой плотностью» размером в 1,44 Мб, а не о более ранней в 720 Кб.
Я решил немного покопаться, потому что, хоть простой ответ заключается в том, что в игры теперь включают больше текстур, видео, аудио, карт и других файлов, это, на самом деле, объясняет далеко не все. Я заострил внимание на первой позиции в этом списке, потому что информация о текстурах была наиболее доступной. Я помню довольно много текстур-паков высокого разрешения, выпущенных за последние пару лет. Что я действительно хотел узнать, так это то, почему текстуры с более высоким разрешением занимают настолько больше места.
Позвольте мне начать с простого примера - размеры файлов для относительно скромной текстуры разрешением 2048x2048 пикселей (2K-текстуры, если так привычнее). Если вы хотите сохранить такую текстуру без какого-либо сжатия, это будет означать 32-битное значение для каждого пикселя: RGBA (красный, зеленый, синий и альфа-канал - это такое техническое название для степени прозрачности). Всего получается около 4,2 миллиона пикселей и, как мы упомянули выше, 4 байта на пиксель, что в итоге выдает нам хороший файл размером около 16 Мб. А теперь подумайте обо всех моделях и текстурах в некоторых наиболее крупных играх с открытым миром. Если бы на каждой поверхности использовалась несжатая 2K-текстура, даже при размере игры в 150 Гб осталось бы место лишь для 9600 уникальных текстур.
Ладно, это на самом деле не выглядит слишком печально, но помните, что речь шла о 2K-текстурах. А что, если игра хочет использовать 4K-текстуры разрешением 4096x4096? Это увеличит размер файла в четыре раза и, как следствие, сократит число уникальных текстур до одной четвертой: 2400 текстур для 150 Гб или всего 800 текстур в игре на 50 Гб. Этого даже близко не достаточно для современной игры со множеством различных локаций, так что дело обстоит иначе.
Но позвольте мне вернуться к тому моменту, где я говорил о сжатии. Почему текстуры должны храниться без сжатия? Конечно, это может привести к несколько более высокому качеству изображения, но размеры файлов в итоге окажутся огромными (относительно). Любой, кто знаком с цифровыми изображениями, вероятно, думает, что файлы форматов JPEG или PNG подошли бы лучше, и если мы говорим про размеры файлов - они будут правы. Это как положить мусор в уплотнитель: JPEG высокого качества (но с потерей данных, то есть в нем все равно будут артефакты сжатия) может сократить размер файла примерно до 2 Мб или сильнее (соответственно, с более низким качеством изображения) - до 1 Мб или даже до 0,5 Мб. Если попробовать PNG, то его сжатие без потерь обычно может уменьшить размер файла вдвое.
Проблема заключается в том, что оба этих алгоритма являются в достаточной мере переменными и сложными. Вашему компьютеру может потребоваться всего лишь доля секунды, чтобы открыть и обработать изображение формата JPEG, но что, если ему потребуется обработать тысячи таких изображений? Время загрузки игры возрастет непомерно, так что геймеры вряд ли обрадуются.
Поприветствуем алгоритм DirectX Texture Compression, также известный как DXTC (или его ранняя версия - S3TC, названная в честь ныне уже несуществующей компании S3 Graphics, которая создала его еще в конце 90-х). Официально S3TC стал поддерживаться в DirectX с версии 6.0, выпущенной в 1998 году. Позже его переименовали в DXTC, развив его до пяти различных режимов работы. Я не буду углубляться в детали низкого уровня, но если вкратце, DXTC - это алгоритм фиксированного сжатия изображений. Это означает, что в отличие от JPEG и PNG, здесь легко с точностью определить, насколько большими будут конечные файлы, а также проще создать аппаратное обеспечение для ускорения обработки изображений. По сути, все современные видеокарты, начиная с 2000 года, имеют аппаратную поддержку S3TC/DXTC.
Для игр, использующих DXTC, наиболее распространенными режимами работы являются степени сжатия 6:1 или 4:1. Это означает, что игра может хранить в четыре-шесть раз больше изображений в том же объеме. Unreal Engine и Unity Engine тоже поддерживают DXTC, наряду с другими форматами файлов, и, хотя я уверен, что есть исключения, мне кажется, что большинство игр в настоящее время используют для своих текстур именно DXTC. И, естественно, не все текстуры, используемые в игре, должны иметь одинаковое разрешение, поэтому маленькие объекты, которые могут занимать всего несколько сотен пикселей экранного пространства, не будут храниться в виде массивной 2К- или 4К-текстуры.
Есть еще одна вещь: MIP-текстурирование. «MIP» происходит от латинской фразы «multum in parvo», означающей «много вещей в маленьком пространстве» (да, я тоже не знал об этом, пока не написал эту статью - спасибо, Википедия!). MIP-текстурирование существует с начала 80-х годов и широко используется в графических приложениях. Краткий итог: не каждую текстуру нужно постоянно хранить в полном разрешении. Предварительно рассчитав текстуры с более низким разрешением, можно оптимизировать требования к памяти и пропускной способности.
В конечном итоге каждая DXTC-текстура сохраняет мипмапы одной и той же текстуры интервалами в половину разрешения, практически до нуля – до размера в 1x1 пиксель. Если вы работаете с 2K-текстурой, вам нужно предварительно рассчитать 11 дополнительных файлов: 1024x1024, 512x512, 256x256, 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2 и 1x1. Unreal Engine даже предоставляет эти полезные сведения в своей документации с указанием окончательных размеров файлов.
Теперь мы можем, по крайней мере, получить разумное представление о том, сколько места потребуется игре, основываясь на количестве используемых текстур и их размере. Расчет начинается с количества уникальных текстур, и для простоты я собираюсь игнорировать тот факт, что не все текстуры имеют одинаковый размер. Я думаю, можно сказать, что для любой достаточно сложной игры со множеством локаций счет будет идти на тысячи текстур. Давайте просто попробуем 10000 в качестве удобного круглого числа.
Если исходить из размеров файлов, указанных Unreal Engine, то для 1К-текстур (стандартные текстуры «высокого качества») игре потребуется 13,3 Гб. Увеличьте разрешение хотя бы до 2K, и это приведет к скачку до 53,3 Гб. А если вам нужны новейшие и самые лучшие 4К-текстуры, вам придется подготовить 223,7 Гб. Упс! И это мы говорим только про текстуры. В играх также присутствует много аудиофайлов, особенно если учесть их полную озвучку (например, опять же, Call of Duty и Red Dead Redemption 2). Добавьте к рассмотрению файлы геометрии и разные видео, и в итоге любая современная игра, которая использует текстуры в разрешении 4K, окажется довольно массивной.
Очевидно, что нет однозначного подхода относительно того, как игры хранят свои текстуры, не говоря уже об аудио и видео файлах. Тем не менее, в целом, большая часть проблемы разрастания размера последних игр, похоже, произрастает именно из текстурирования. Преимущество состоит в том, что мы больше не получаем в играх повторяющиеся текстуры, и все выглядит намного более реалистичным. Оглядитесь назад в прошлое на такие игры, как оригинальный Half-Life или Deus Ex, - не заметить улучшение качества изображения невозможно. Я с нетерпением жду возможности посмотреть на закат в Red Dead Redemption 2, любуясь графикой - и будьте вы прокляты, 150 Гб!
Но текстуры с более высоким разрешением, несомненно, подвержены уменьшению заметного прибавления в качестве, особенно при более низких разрешениях. Переключитесь с ультры на текстуры с высоким качеством (с 4K до 2K или с 2K до 1K), и изменения часто даже трудно будет заметить, особенно на 1080p-мониторе. Это потому, что высококачественные текстуры обычно используются только на небольшой части экрана. В конце концов, по понятиям, стена с 2K-текстурой должна выглядеть лучше, чем та же стена с 1K-текстурой, но отойдите подальше, и игровой движок, вероятно, заменит 2K-текстуру аналогом с более низким на одну ступень разрешением, и вы этого даже не заметите.
Это хорошая новость, потому что я, безусловно, совсем не жду игр, пытающихся использовать текстуры с разрешением 8K, которые еще в четыре раза увеличат их размер. Возможно, когда-нибудь в будущем мы все будем использовать 8K-дисплеи, и это встанет в разряд нормального, но, надеюсь, к тому времени у нас также будут доступные SSD-накопители емкостью в десятки терабайт. Или так, или кто-нибудь умный изобретет более эффективный алгоритм сжатия текстур. Я могу на это только надеяться.
Источник: PC Gamer