Чем открыть файл gcf
GLTF (GL Transmission Format) — это формат файла для хранения 3Д сцен и моделей, который является крайне простым в понимании (структура записана в стандарте JSON), расширяемым и легко взаимодействующим с современными веб-технологиями. Данный формат хорошо сжимает трёхмерные сцены и минимизирует обработку во время выполнения приложений, использующих WebGL и другие API. GLTF сейчас активно продвигается Khronos Group как JPEG от мира 3D. На сегодняшний день используется GLTF версии 2.0. Существует и бинарная версия данного формата, которая называется GLB, единственное различие которого в том, что все хранится в одном файле с расширением GLB.
Эта статья — 1 часть из 2х. В ней мы с вами рассмотрим такие артефакты формата и их атрибуты, как Scene, Node, Buffer, BufferView, Accessor и Mesh. А во второй статье мы рассмотрим оставшиеся: Material, Texture, Animations, Skin и Camera. Больше общей информации о формате можно найти здесь.
Если в процессе просмотра статьи захочется лично поработать с данным форматом, то можете скачать модели GLTF 2.0 с официального репозитория Khronos на GitHub
Система координат и единицы измерения
GLTF использует правостороннюю систему координат, то есть перекрестное произведение +X и +Y дает +Z, где +Y — верхняя ось. Передняя часть 3D ассета GLTF обращена к оси +Z. Единицами измерения для всех линейных расстояний являются метры, углы же измеряются в радианах а положительное вращение объектов — против часовой стрелки. Node трансформации и channel paths анимаций являются трехмерными векторами или кватернионами со следующими типами данных и семантикой:
translation: трехмерный вектор, содержащий перевод по осям x, y и z
rotation: кватернион (x, y, z, w), где w скаляр
scale: трехмерный вектор, содержащий коэффициенты масштабирования по осям x, y и z
Проблематика и её решение
Изначально GLTF формат был задуман Khronos Group как решение для передачи 3D контента по интернету и был призван минимизировать количество импортеров и конвертеров, разные виды которых создаются при работе с графическими API.
На текущий момент GLTF и его бинарный брат GLB используются как унифицированные форматы и в CAD программах (Autodesk Maya, Blender и т. д.), в игровых движках (Unreal Engine, Unity и прочих), AR/VR приложениях, соц. сетях и т.д.
Представители Khronos Group утрвеждают следующее:
- GLTF универсален — может использоваться одинаково хорошо как для простой геометрии, так и для сложных сцен с анимацией, различными материалами и т. д.
- Он достаточно компактен. Да, это можно оспорить, ведь всё зависит от от алгоритмов конвертации и я лично знаю случаи, когда GLTF был больше размером, чем оригинальный, к примеру, FBX файл, но в большинстве случаев это так.
- Простота анализа данных – это корневой плюс данного формата. GLTF иерархия использует JSON, а геометрия хранится в бинарном виде, никакого декодинга не нужно!
Как открыть файл GCF?
Первое, что вам нужно сделать, это просто «дважды щелкнуть » по значку файла GCF, который вы хотите открыть. Если в операционной системе есть соответствующее приложение для ее поддержки, а также существует связь между файлом и программой, файл следует открыть.
Шаг 1. Установите Steam
Проблема, о которой часто забывают, - убедиться, что на компьютере установлен Steam. Самый простой способ - использовать поисковую систему системы, введя в ней название программы Steam. При отсутствии соответствующей программы ее установка в подавляющем большинстве случаев решит проблему. Ниже вы найдете список приложений, поддерживающих файлы GCF.
Для чего нужен файловый формат .PCK?
Как сокращение от "Package" (пакет) расширение .pck чаще всего встречается в роли идентификатора файлов-пакетов ресурсов (.pck) в различных играх, преимущественно жанра MMORPG. Каждая игра использует свой собственный, зачастую сугубо закрытый формат упаковки ресурсов, а расширение .pck служит лишь общим признаком типа файла. Файл .pck обычно представляет собой большой по размеру двоичный архив-контейнер, содержащий главные игровые ресурсы (изображения, звуки, музыку, управляющие скрипты и т.д.). Такие архивы ресурсов (.pck) всегда являются мишенью для энтузиастов моддинга, ищущих пути извлечения, модификации и обратной упаковки содержимого.
К многопользовательским MMORPG-играм, использующим файлы .pck, относятся Perfect World, Giant Bomb, SwordsMan Online и многие другие. У каждой игры существуют сообщества поклонников, которые могут иметь арсенал неофициальных средств для работы с файловым форматом PCK данной игры.
Другой случай использования расширения .pck имеет отношение к файлам пакетов (.pck), создаваемым и поддерживаемым сервером управления системами SMS или диспетчером конфигураций SCCM 2007 Майкрософт. Файл .pck представляет собой сжатую версию пакета программного обеспечения, распространяемого узлом SMS/SCCM. Файлы PCK имеют свойство быстро накапливаться (к примеру, в каталоге "SMSPKG") и занимать большие объемы дискового пространства, при этом их нельзя просто так удалить без нарушения работы системы управления пакетами. В Интернете имеются подробные описания корректных алгоритмов действий касательно файлов PCK.
В довольно узком контексте расширение также было избрано крупным украинским разработчиком ПО и поставщиком криптографических решений "Интеллект-Сервис" (IS) для обозначения собственного закрытого формата сертификата открытого ключа (.pck). В паре с сертификатом секретного ключа (.sk) файл .pck служит в качестве электронной цифровой подписи (ЭЦП). Формат .pck/.sk поддерживается таким ПО IS, как MeDoc, IS-PRO и др.
Как и обещал в предыдущей статье, начинаю публиковать статьи о той части инфраструктуры Steam, которую смогло открыть Anti-Steam сообщество путём реверс-инжиниринга и продолжительных мозговых штурмов.
Файлы формата GCF до недавнего времени являлись стандартом для всех игр, выпускаемых компанией VALVE, а NCF — для всех остальных. Сами по себе эти файлы представляют образ файловой системы с несколькими уровнями защиты. Отличие NCF от GCF заключается в том, что первые содержат только заголовки, а файлы, принадлежащие им, расположены в отдельном каталоге (/SteamApps/common/ ). Поэтому описывать буду GCF, а все особенности NCF приведу после.
В данной статье я подробно разберу структуру данных файлов и работу с ними на примере своей библиотеки (ссылка на неё — в конце статьи). Начало будет достаточно скучным — описание структур и назначения их полей. Самое «вкусное» будет после них…
Весь код, приведенный здесь, является плодом реверс-инжиниринга библиотек Steam. Большая часть информации о формате файлов была почерпнута из открытых источников, я же немного её дополнил и значительно оптимизировал работу с файлами кеша (даже по сравнению с самой популярной на то время библиотекой HLLIB).
Общая структура файлов
Файл логически разбит на 2 части — заголовки и непосредственно содержимое. Содержимое разбито на блоки, которые в свою очередь разбиты на сектора по 8кБ, принадлежность которых к определённым файлам и их последовательность описаны в заголовках. Все заголовки содержат поля, являющиеся четырёхбайтными целыми числами (исключение — часть, отвечающая за список имён файлов и каталогов).
- FileHeader
- BlockAllocationTableHeader
- BlockAllocationTable[]
- FileAllocationTableHeader
- FileAllocationTable[]
- ManifestHeader
- Manifest[]
- FileNames
- HashTableKeys[]
- HashTableIndices[]
- MinimumFootprints[]
- UserConfig[]
- ManifestMapHeader
- ManifestMap[]
- ChecksumDataContainer
- FileIdChecksumTableHeader
- FileIdChecksums[]
- Checksums[]
- ChecksumSignature
- LatestApplicationVersion
- DataHeader
FileHeader
- HeaderVersion
- CacheType
- FormatVersion
- ApplicationID
- ApplicationVersion
- IsMounted
- Dummy0
- FileSize
- ClusterSize
- ClusterCount
- Checksum
Первым параметром передаётся указатель на структуру, а вторым — её размер, за исключением поля Checksum (то есть меньше на 4).
BlockAllocationTableHeader
- BlockCount
- BlocksUsed
- LastUsedBlock
- Dummy0
- Dummy1
- Dummy2
- Dummy3
- Checksum
BlockAllocationTable
- uint16_t Flags
- uint16_t Dummy0
- FileDataOffset
- FileDataSize
- FirstClusterIndex
- NextBlockIndex
- PreviousBlockIndex
- ManifestIndex
- 0x8000 — блок используется;
- 0x4000 — локальная копия файла имеет приоритет;
- 0x0004 — блок зашифрован;
- 0x0002 — блок зашифрован и сжат;
- 0x0001 — блок содержит некие «сырые» данные (RAW).
FileAllocationTableHeader
- ClusterCount
- FirstUnusedEntry
- IsLongTerminator
- Checksum
FileAllocationTable
Таблица секторов, содержащая FileAllocationTableHeader.ClusterCount записей типа uint32_t. Каждая ячейка содержит индекс следующего кластера в цепочке или значение терминатора (смотрите объявление FileAllocationTableHeader, если является последним в цепочке.
Индексом списка является номер сектора.
ManifestHeader
- HeaderVersion
- ApplicationID
- ApplicationVersion
- NodeCount
- FileCount
- CompressionBlockSize
- BinarySize
- NameSize
- HashTableKeyCount
- NumOfMinimumFootprintFiles
- NumOfUserConfigFiles
- Bitmask
- Fingerprint
- Checksum
Manifest
- NameOffset
- CountOrSize
- FileId
- Attributes
- ParentIndex
- NextIndex
- ChildIndex
- 0x00004000 — узел является файлом;
- 0x00000100 — зашифрованный файл;
- 0x00000001 — конфигурационный файл. Локальная копия не перезаписывается.
FileNames
Блок данных типа char, размером ManifestHeader.NameSize байт. Содержит нуль-терминированные строки, являющиеся именами элементов, описываемых в дереве манифестов. Обязательным является наличие первого, корневого элемента — пустой строки. Смещение имён элементов задаётся значением Manifest[].NameOffset
HashTableKeys
Содержит хеш-таблицу имён элементов. Содержит значения индексов для HashTableIndices, распределенных по индексам, являющимися производным от хеш-функции Дженкинса lookup2 для строк, приведённых к нижнему регистру. Подробнее будет рассмотрено при описании поиска элементов.
HashTableIndices
Содержит таблицу индексов элементов, на которые ссылаются значения из предыдущей таблицы. Количество элементов — ManifestHeader.NodeCount.
MinimumFootprints
Содержит список номеров элементов в Manifest, которые необходимо распаковать при запуске приложения.
UserConfigs
Содержит список номеров элементов в Manifest, являющихся файлами пользовательской конфигурации.
ManifestMapHeader
ManifestMap
Содержит таблицу ссылок на первый блок (структура BlockAllocationTable) для каждого элемента. Индексом элементов является номер элемента в дереве манифестов. Для каталогов и файлов, не сохранённых в кеше (имеющих нулевой размер или для NCF), содержит значение, равное BlockAllocationTableHeader.BlockCount.
ChecksumDataContainer
FileIdChecksumTableHeader
- FormatCode
- Dummy0
- FileIdCount
- ChecksumCount
FileIdChecksums
Checksums
Список контрольных сумм. Содержит последовательные подсписки, на первый элемент которых ссылается значение FileIdChecksums[].FirstChecksumIndex.
Значения рассчитываются по следующему алгоритму:
ChecksumSignature
Сигнатура блока контрольных сумм. Содержит значение хеша для блока контрольных сумм, рассчитанное по алгоритму SHA-1 и зашифрованное алгоритмом RSASSA-PKCS1-v1_5.
LatestApplicationVersion
Данное поле содержит версию блока контрольных сумм. Обновляется до актуальной после каждого обновления содержимого.
DataHeader
- ClusterCount
- ClusterSize
- FirstClusterOffset
- ClustersUsed
- Checksum
Алгоритмы
Наконец-то пришла очередь самого интересного — самые интересные примеры кода, работающего с этими структурами с подробными объяснениями. Полный пакет исходных кодов можно найти на моём репозитории.
Расчет размера файла
В большинстве случаев размер файла равен значению поля Manifest[].CountOrSize. Но для файлов размером более 4Гб такой путь не подходит. Программисты VALVE обошли это следующим путём: для файлов размером более 2Гб устанавливаем старший бит этого поля в «1» и заводим в списке ещё один (или несколько) элементов с такими же значениями остальных полей, получая своеобразную цепочку. Суммируя значение полей Manifest[].CountOrSize из данной цепочки мы и подсчитаем итоговый размер файла.
Здесь я сделал небольшой «финт ушами», допустив, что файлы размером более 4Гб всё-таки не будут входить в состав кеша…
Поиск элемента по имени
например, нам надо найти файл с именем «hl2/maps/background_01.bsp». Все имена у нас хранятся в древовидном виде, поэтому путь придётся разбивать на элементы, связанные разделителем (в данном случае — "/"). Затем мы ищем у потомков корневого элемента элемент с именем «hl2». У него — элемента с именем «maps», и только затем — элемент с именем «background_01.bsp». Данный путь самый очевидный, но очень медленный — происходит побайтовой сравнение строк, да ещё и обход по дереву. Сплошные затраты.
Для ускорения данной процедуры в заголовках есть хеш-таблицы.
Как видно из кода, из всего пути к файлу мы берем только его имя и рассчитываем хеш для него. Берём остаток от целочисленного деления результата на значение ManifestHeader.HashTableKeyCount — это будет номер записи в списке HashTableKeys, содержащей либо 0xffffffff (если нет такого элемента) или значение X+ManifestHeader.HashTableKeyCount. Исходя из этого вычисляем X, являющийся номером элемента в списке HashTableIndices, с которого может находиться искомый элемент. Значения из этого списка указывают на искомый элемент, имя которого сравнивается в запросом. Если не совпало — берём следующий элемент списка и повторяем до тех пор, пока старший бит номера элемента равен «0».
Понимаю, что получилось запутанно, но именно так оно и работает… Вините в подобной путанице программистов VALVE.
Данный метод значительно лучше прямого поиска по дереву — сравнивалась производительность при запуске игры с самописной библиотекой-эмулятором Steam.dll, о которой ещё будет разговор.
Получение полного пути к элементу
Данное действие несколько обратно предыдущему — по номеру элемента надо пройтись по дереву до корневого элемента и получить путь к файлу.
Код для Delphi значительно меньше из-за того, что для C++ я не использовал класс std::string — не знал про него тогда. С ним код вышел бы значительно короче.
Потоки
При написании библиотек для архиво-подобных форматов файлов (которые содержат в себе другие файлы) я использую принцип «поток-в-потоке», что позволяет открывать файлы в архиве, не распаковывая его. Например, в кеше half-life.gcf старых версий был файл pak0.pak, являющийся архивом. В итоге я открывал файл half-life.gcf, в нём — pak0.pak. в котором в свою очередь читал необходимые файлы. И всё это — без распаковки даже в память, весь функционал реализуется через написанные мною же обёртки над файловыми потоками (низкоуровневыми, на уровне WindowsAPI).
Таким образом значительно упрощается работа с содержимым — можно открывать файлы и читать данные из них без лишних телодвижений.
Извлечение файла с проверкой контрольной суммы
В данной процедуре активно используются потоки, описанные выше — я просто читаю файл фрагментами фиксированного размера (максимальный размер фрагмента для контрольных сумм — 32Кб), рассчитываю для них контрольные суммы и сверяю их со значениями из таблицы в заголовках.
В коде для Delphi присутствует дополнительный код для отображения прогресса работы — вызов callback-функций OnProgress, OnProgressObj.
Дешифрование содержимого файлов
Поскольку многие игры незадолго до выхода можно загрузить заранее, то их содержимое в таких случаях оказывается полностью или частично зашифровано. С выходом игры становится доступен ключ для дешифровки данного контента, осуществляемая следующим кодом:
Расчет контрольной суммы для ManifestHeader
Заключение
Остальные функции, не рассмотренные в данной статье ввиду громоздкости их описания (использование битовых карт занятых секторов при изменении карты секторов, перестроение данной карты и многое-многое другое) можно просмотреть в репозитории (там же лежат и остальные фрагменты программ, которые будут рассмотрены в последующих статьях). Данные исходные коды можно использовать в своих проектах (если кому-то нужны такие раритеты. ).
Примерная дата последнего обновления всех исходных кодов — вторая половина 2011-ого года.
PS: Написание данной библиотеки мне очень помогло при написании лабораторной работы по предмету Операционные системы в университете — требовалось симулировать работу файловой системы (создание, запись, чтение и удаление файлов). Моя работа была первой и, наверное, единственной за всё время, в которой использовался именно образ файловой системы с разбиением на блоки и сектора — а это была просто-напросто урезанная версия данной бибилотеки (без контрольных сумм). Даже дефрагментатор для кеша я дописал в составе данной работы…
Программы, обслуживающие файл GCF
Windows
MAC OS
GCF расширение файла
Имя файла | Game Cache Format |
---|---|
Разработчик файлов | Valve |
Категория файла | Файлы игр |
Файл GCF поддерживается в операционных системах 2. В зависимости от вашей операционной системы вам может потребоваться другое программное обеспечение для обработки файлов GCF. Ниже приводится сводка количества программ, которые поддерживают и открывают файл GCF на каждой системной платформе.
Операционные системы
GLTF — взгляд изнутри
Как было сказано выше GLTF, как правило, состоит из 2х файлов: 1й с форматом .gltf, который хранит в себе структуру 3D сцены в виде JSON и 2й файл с форматом .bin, который хранит уже непосредственно все данные этой сцены.
Структура формата строго иерархическая и имеет следующий вид:
Рассказывая далее о структуре я буду использовать примеры простейшего GLTF файла, который хранит в себе 1 односторонний треугольник с материалом по умолчанию. Если захотите, то вы можете его скопировать и вставить в любой GLTF просмотрщик, чтобы "пощупать" содержимое файла лично. В своей практике я использовал разные, но остановился на этом, который использует Three.js под капотом. Также хорошей опцией будет использование Visual Studio Code с GLTF плагином. Так у вас появится выбор сразу из 3х движков: Babylon.js, Cesium, Three.js
Как открыть файл GCF?
Отсутствие возможности открывать файлы с расширением GCF может иметь различное происхождение. С другой стороны, наиболее часто встречающиеся проблемы, связанные с файлами Game Cache Format, не являются сложными. В большинстве случаев они могут быть решены быстро и эффективно без помощи специалиста. Приведенный ниже список проведет вас через процесс решения возникшей проблемы.
Шаг 1. Скачайте и установите Steam
Основная и наиболее частая причина, препятствующая открытию пользователями файлов GCF, заключается в том, что в системе пользователя не установлена программа, которая может обрабатывать файлы GCF. Этот легкий. Выберите Steam или одну из рекомендованных программ (например, GCFExplorer) и загрузите ее из соответствующего источника и установите в своей системе. Полный список программ, сгруппированных по операционным системам, можно найти выше. Если вы хотите загрузить установщик Steam наиболее безопасным способом, мы рекомендуем вам посетить сайт Valve Corporation и загрузить его из официальных репозиториев.
Шаг 2. Обновите Steam до последней версии
Вы по-прежнему не можете получить доступ к файлам GCF, хотя Steam установлен в вашей системе? Убедитесь, что программное обеспечение обновлено. Разработчики программного обеспечения могут реализовать поддержку более современных форматов файлов в обновленных версиях своих продуктов. Если у вас установлена более старая версия Steam, она может не поддерживать формат GCF. Самая последняя версия Steam обратно совместима и может работать с форматами файлов, поддерживаемыми более старыми версиями программного обеспечения.
Шаг 3. Свяжите файлы Game Cache Format с Steam
После установки Steam (самой последней версии) убедитесь, что он установлен в качестве приложения по умолчанию для открытия GCF файлов. Метод довольно прост и мало меняется в разных операционных системах.
Выбор приложения первого выбора в Windows
- Выберите пункт Открыть с помощью в меню «Файл», к которому можно щелкнуть правой кнопкой мыши файл GCF.
- Нажмите Выбрать другое приложение и затем выберите опцию Еще приложения
- Наконец, выберите Найти другое приложение на этом. , укажите папку, в которой установлен Steam, установите флажок Всегда использовать это приложение для открытия GCF файлы свой выбор, нажав кнопку ОК
Выбор приложения первого выбора в Mac OS
Шаг 4. Убедитесь, что GCF не неисправен
Если вы выполнили инструкции из предыдущих шагов, но проблема все еще не решена, вам следует проверить файл GCF, о котором идет речь. Проблемы с открытием файла могут возникнуть по разным причинам.
1. GCF может быть заражен вредоносным ПО - обязательно проверьте его антивирусом.
Если файл заражен, вредоносная программа, находящаяся в файле GCF, препятствует попыткам открыть его. Сканируйте файл GCF и ваш компьютер на наличие вредоносных программ или вирусов. GCF файл инфицирован вредоносным ПО? Следуйте инструкциям антивирусного программного обеспечения.
2. Убедитесь, что файл с расширением GCF завершен и не содержит ошибок
3. Проверьте, есть ли у пользователя, вошедшего в систему, права администратора.
Некоторые файлы требуют повышенных прав доступа для их открытия. Выйдите из своей текущей учетной записи и войдите в учетную запись с достаточными правами доступа. Затем откройте файл Game Cache Format.
4. Убедитесь, что в системе достаточно ресурсов для запуска Steam
Операционные системы могут иметь достаточно свободных ресурсов для запуска приложения, поддерживающего файлы GCF. Закройте все работающие программы и попробуйте открыть файл GCF.
5. Убедитесь, что у вас установлены последние версии драйверов, системных обновлений и исправлений
Последние версии программ и драйверов могут помочь вам решить проблемы с файлами Game Cache Format и обеспечить безопасность вашего устройства и операционной системы. Устаревшие драйверы или программное обеспечение могли привести к невозможности использования периферийного устройства, необходимого для обработки файлов GCF.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла GCF мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле GCF.
Не удается открыть файл GCF? Ты не единственный. Тысячи пользователей ежедневно сталкиваются с подобными проблемами. Ниже вы найдете советы по открытию файлов GCF, а также список программ, поддерживающих файлы GCF.
Что такое файл GCF?
Scene и Node элементы
Первым-наперво идет основная нода под названием Scene. Это корневая точка в файле, с которой все и начинается. Данная нода содержит массив сцен, которые хранит GLTF и выбор той, которая будет грузится по умолчанию после открытия файла. Контент же 3D сцены начинается со следующего объекта, который называется “Node”. Массив сцен и нод был упомянут не зря, т.к. возможность хранить несколько сцен в одном файле реализована, но на практике стараются хранить одну сцену в одном файле.
Каждая нода является “входной точкой” для описания отдельных объектов. Если объект сложный и состоит из нескольких мешей, то такой объект будет описан «родительской» и «дочерними» нодами. Например, автомобиль, который состоит из корпуса и колес, может быть описан следующим образом: основная нода описывает машину и, в частности, ее корпус. В этой ноде содержится список “дочерних нод”, которые, в свою очередь, описывают уже оставшиеся составные части, такие как, к примеру, колеса. Обработка всех элементов будет осуществляться рекурсивно. Ноды могут иметь TRS (translation, rotation, scale a.k.a. смещени е, поворот и масштабирование) анимации. Кроме того, что такие трансформации влияют непосредственно на сам меш, они точно также воздействуют и на дочерние ноды. В довесок ко всему вышесказанному думаю стоит упомянуть, что внутренние "камеры", если таковые имеются, которые отвечают за отображение для пользователя объекта в кадре, также прикреплены к объекта Node. Объекты ссылаются друг на друга используя соответствующий атрибуты: scene имеет атрибут node, node объект имеет атрибут mesh. Для более простого понимания всё вышесказанное проилюстрировано на следующем рисунке.
Программы для открытия файла GCF
Не забывайте загружать программы, поддерживающие файлы GCF, только из проверенных и безопасных источников. Предлагаем использовать сайты разработчиков программного обеспечения.
GCFExplorer
Steam
Steam
Шаг 2. Создайте ассоциацию Steam с файлами GCF.
Однако может случиться так, что само приложение не вызывает открытия файла GCF в приложении Steam, но вы можете установить это вручную. Связь может быть создана с помощью раскрывающегося списка, доступного, если щелкнуть файл правой кнопкой мыши и выбрать « Свойства». В окне, помимо прочего, будет отображаться тип файла и информация, с помощью которой программа используется для запуска файла. Изменения можно внести с помощью кнопки «Изменить» . Если в списке нет программного обеспечения, просто выберите «Обзор» и вручную выберите каталог, в котором установлено приложение. Установка флажка "Всегда использовать выбранную программу . " навсегда связывает файл GCF с программой Steam.
Шаг 3. Обновите Steam до последней версии.
Если, однако, после привязки Steam к Game Cache Format проблемы все равно остались, вам следует обновить программу до последней версии. Некоторые приложения позволяют выполнять обновление с уровня программы, а для других вам необходимо загрузить установщик со страницы Valve Corporation и установить.
Шаг 4. Проверьте наличие следующих проблем с файлом GCF.
Конечно, может случиться так, что, несмотря на описанные выше действия, файл все равно не работает. Наиболее частые проблемы с файлами:
Файл пустой или неполный
Размер затронутого файла может быть меньше 0 КБ или меньше ожидаемого. Это предполагает усечение содержимого файла GCF при загрузке или копировании. Единственный вариант восстановления - снова загрузить файл.
Файл GCF инфицирован вредоносным ПО.
Самая частая причина здесь - компьютерные вирусы. Быстрая проверка на вирусы с использованием современной антивирусной программы устранит любые сомнения. Некоторые поставщики антивирусов также предоставляют бесплатные онлайн-сканеры. Однако важно сканировать всю систему, а не только файл GCF или каталог программы. Иногда файлы GCF, зараженные вирусом, не могут быть восстановлены, поэтому заранее сделайте резервную копию.
Файл находится в другой версии
Типичная ошибка совместимости - программа не поддерживает старую версию файла GCF. На своих веб-сайтах разработчики обычно предлагают бесплатные решения таких проблем, например, в виде программы преобразования или более старой версии программы.
Файл поврежден
Для этого может быть много причин. Восстановление очень зависит от типа файла. Некоторые программы предлагают возможность восстановления данных из поврежденных файлов GCF. Вы можете восстановить файл из резервной копии или использовать Valve help.
Файл GCF зашифрован.
Файл находится в закрытом месте
Некоторые системные каталоги исключены из модификации. Хотя обычно при чтении такого файла проблем не возникает, его может оказаться невозможным сохранить. Копирование файла GCF в другое место решит проблему.
GCF файл используется другой программой
Это может произойти с файлом, который не поддерживает множественный доступ. В этом случае файл GCF блокируется первым приложением, открывшим его. Просто закройте ненужные программы. Иногда приходится ждать закрытия сеанса с файлом GCF. Антивирусные программы или создаваемая резервная копия могут заблокировать файл на некоторое время без ведома пользователя. Если и это не помогло, перезагрузите устройство.
У вас есть проблема с открытием .PCK-файлов? Мы собираем информацию о файловых форматах и можем рассказать для чего нужны файлы PCK. Дополнительно мы рекомендуем программы, которые больше всего подходят для открытия или конвертирования таких файлов.
Buffer, BufferView и Accessor
Под объектом Buffer подразумевается хранилище бинарных, не обработанных, данных без структуры, без наследования, без значения. В буфере хранится информация о геометрии, анимациях и скиннинге. Главное преимущество бинарных данных в том, что они крайне эффективно обрабатываются GPU, т.к. не требуют дополнительного парсинга, кроме, возможно, декомпрессии. Данные в буфере могут быть найдены по атрибуту URI, который явно дает понять где находятся данные и здесь всего 2 варианта: либо данные хранятся во внешнем файле с форматом .bin, либо они встроены внутрь самого JSON. В первом случае URI содержит ссылку на внешний файл, в этом случае папка, в которой находится GLTF файл, считается корневой. Во втором случае файл будет иметь формат .glb, отсылающий нас к более компактному, с точки зрения количества файлов, брату-близнецу GLTF, формату GLB. Данные в бинарном файле хранятся как есть, побайтово.
JSON в нашем примере с треугольником будет выглядеть следующим образом:
Пример буфера, закодированного в base64:
Если же у вас будет внеший файл, то JSON преобразует свой вид в следующий:
Блок Buffers также имеет дополнительный атрибут byteLength, который хранит в себе значение размера буфера.
Первым шагом в структуризации данных из буфера служит объект BufferView. BufferView можно назвать "срезом" информации из Buffer, который характеризуется определенным сдвигом байт от начала буфера. Данный "срез" описывается при помощи 2х атрибутов: отсчет “сдвига” от начала буфера для считывания и длинной самого среза. Простой пример нескольких объектов BufferView для наглядности их использования на основе нашего примера:
Как вы видите, в данном примере содержится 4 основных атрибута:
- Buffer указывает на индекс буфера (порядковый номер в массиве буферов, начинается с 0).
- byteOffset — определяет “сдвиг” начала отсчета в байтах для данного “среза”
- byteLength — определяет длину “среза”
- target — определяет тип данных, содержащихся в bufferView
Первый BufferView содержит первые 6 байт буфера и не имеет сдвига. Со вторым "срезом" все немного сложнее: как видите, его сдвиг находится на 8м байте, вместо ожидаемого 6го. Данные 2 байта являются пустыми и были добавлены в процессе формирования буфера благодаря процессу под названием "padding". Оно нужно, чтобы значение подогнать значение байт границы в 4 байта. Такой трюк нужен для более быстрого и легкого считывания данных из буфера.
Стоит сказать еще пару слов об атрибуте target. Он используется для классификации типа информации на которую ссылается bufferView. Здесь всего 2 варианта: либо это будет значение 34962, которое используется для ссылки на атрибуты вертексов (vertex attributes — 34962 — ARRAY_BUFFER) или же 34963, которое используется для индексов вертексов (vertex indices — 34963 — ELEMENT_ARRAY_BUFFER). Последним штрихом при для понимания и структуризации всей информации в Buffer является объект Accessor.
Accessor — это объект, который обращается к BufferView и содержит атрибуты, которые определяют тип и расположение данных из BufferView. Тип данных аксессора кодируется в type и componentType. Значением атрибута type является строка и имеет следующие значения: SCALAR для скалярных значений, VEC3 для 3х мерных векторов и MAT4 для матрицы размерностью 4х4 или же кватерниона, который используется для описания rotation (поворота).
В свою очередь componentType указывает тип компонентов этих данных. Это GL константа, которая может иметь такие значение, как, к примеру, 5126 (FLOAT) или 5123 (UNSIGNED_SHORT), для указания того, что элементы имеют плавающую запятую и т.п.
Различные комбинации этих свойств могут использоваться для описания произвольных типов данных. Пример основанный на нашем треугольнике.
Разберём атрибуты, представленные в JSON:
- bufferView — указывает порядковый номер BufferView из массива BufferView, который использует Accessor. BufferView же, в свою очередь, хранит информацию об индексах.
- byteOffset — сдвиг байт для начала считывания данных текущим Accessor. На один BufferView может ссылаться несколько объектов типа Accessor.
- componentType — константа, указывающая на тип элементов. Может иметь значения 5123, которой соответствует тип данных UNSIGNED_SHORT или же 5126 для FLOAT.
- count — отображает как много элементов хранится в buffer.
- type — определяет тип данных: скаляр, вектор, матрица.
- max и min — атрибуты, которые определяют минимальное и максимальное значение положение данных элементов в пространстве.
Объект Meshes содержит информацию о мешах, расположенных в сцене. Одна нода (node объект) может хранить только 1 меш. Каждый объект типа mesh содержит массив типа mesh.primitive, в свою очередь примитивы — это примитивные объекты (к примеру треугольники) из которых состоит непосредственно меш. Данный объект содержит много дополнительных атрибутов, но все это служит одной цели — правильному хранению информации об отображении объекта. Основные атрибуты меша:
- POSITION — позиция вертексов по осям XYZ
- NORMAL — нормализованные XYZ нормали вертексов
- TANGENT — XYZW тангентсы вертексов. W указывает куда направлен тангент и имеет значечние либо +1, либо -1.
- TEXCOORD_0 — текстурные координаты UV. Может хранится несколько наборов.
- COLOR_0 — RGB или RGBA цвета вертексов.
- JOINTS_0 — данный атрибут содержит индексы суставов/джоинтов (Joints) из соответствующего массива joints, которые должны влиять на вертекс (вершину).
- WEIGHTS_0 — данные этого атрибута определяют веса, указывающие насколько сильно сустав/joint влияет на вершину.
- weights — атрибут, отвечающий за веса морфинга.
- material — содержит индекс, который является номером материала в массиве Materials
Данный объект будет иметь следующий вид для нашего случая:
К сожалению из-за ограничения весь материал не вместился с одну статью, поэтому оставшуюся часть можно найти во второй статье, в которой мы рассмотрим оставшиеся артефакты: Material, Texture, Animations, Skin и Camera, а также соберём минимальный рабочий GLTF файл.
Программы, которые поддерживают GCF расширение файла
В следующем списке перечислены программы, совместимые с файлами GCF, которые разделены на категории 2 в зависимости от операционной системы, в которой они доступны. Файлы с суффиксом GCF могут быть скопированы на любое мобильное устройство или системную платформу, но может быть невозможно открыть их должным образом в целевой системе.
Читайте также: