Gildor's Forums

Author Topic: Метод сжатия в .xnb на XBOX360.  (Read 6897 times)
destrator
Newbie
*
Posts: 20


View Profile
Метод сжатия в .xnb на XBOX360.
« on: October 15, 2011, 20:11 »

.xnb - формат конвейера контента XNA Game Studio. На XBOX 360 данные сжаты с использованием набора функций Xbox XMemCompress API. Собственно, именно ими я и попытался распаковать один из файлов:
Code:
char Magic[3];
char Platform;
char XNBFormatVersion;
char FlagBits;
SIZE_T CompressedFileSize;
SIZE_T DecompressedDataDize;

FILE* xnbFile = NULL;

errno_t err = fopen_s(&xnbFile, "bg0.xnb", "rb");
if(!err)
{
fread(Magic, 1, 3, xnbFile);
fread(&Platform, 1, 1, xnbFile);
fread(&XNBFormatVersion, 1, 1, xnbFile);
fread(&FlagBits, 1, 1, xnbFile);
fread(&CompressedFileSize, sizeof(UINT32), 1, xnbFile);
fread(&DecompressedDataDize, sizeof(UINT32), 1, xnbFile);

printf("Compressed sixe: %d, decompressed size: %d\n", CompressedFileSize, DecompressedDataDize);

XMEMDECOMPRESSION_CONTEXT decmpContext = NULL;
HRESULT hr = E_FAIL;

hr =  XMemCreateDecompressionContext(XMEMCODEC_DEFAULT, NULL, 0, &decmpContext);
if(FAILED(hr))
{
printf("Decompression Context Creation Failed\n");
fclose(xnbFile);
return -1;
}

SIZE_T CompressedDataSize = CompressedFileSize-12;
char* pCompressedData = new char[CompressedDataSize];
fread(pCompressedData, 1, CompressedDataSize, xnbFile);
char* pDecompressedData = new char[DecompressedDataDize];


printf("Decompression...\n");
hr =  XMemDecompress(decmpContext, pDecompressedData, &DecompressedDataDize, pCompressedData, CompressedDataSize);
if(FAILED(hr))
{
printf("Decompression failed\n");
}
else
{
printf("Decompression successful\n");
}

delete [] pCompressedData;
delete [] pDecompressedData;
fclose(xnbFile);
}
else
{
printf("Can't open file\n");
}


Контекст создается успешно, но программа виснет на вызове XMemDecompress. Никакой допольнительной информации получить не удается.

Я подумал, что вряд ли Microsoft самостоятельно разработали алгоритм сжатия. Вероятнее всего они взяли что-нибудь готовое.
Собственно, вопрос: не пытался ли кто-нибудь распаковать данные этого формата? Какой алгоритм сжатия в нем используется?
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7972



View Profile WWW
Re: Метод сжатия в .xnb на XBOX360.
« Reply #1 on: October 15, 2011, 20:18 »

Про XMA говорится, что это модифицированный WMA. Этот формат у них декодируется аппаратно.
Logged
destrator
Newbie
*
Posts: 20


View Profile
Re: Метод сжатия в .xnb на XBOX360.
« Reply #2 on: October 15, 2011, 20:34 »

Про XMA говорится, что это модифицированный WMA. Этот формат у них декодируется аппаратно.

Да нет же Smiley XMA - это медиаформат, он здесь не причем. XNB - это контейнер для контента, в эти файлы сериализуются (а на xbox еще и сжимаются) все данные, начиная от шейдеров и заканчивая моделями и текстурами.

Попробовал распаковать его с zlib, ничего не вышло. Чудес не бывает Sad
Logged
destrator
Newbie
*
Posts: 20


View Profile
Re: Метод сжатия в .xnb на XBOX360.
« Reply #3 on: October 15, 2011, 20:38 »

Попробую unlzx. LZX использовался во многих решениях Microsoft Smiley
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7972



View Profile WWW
Re: Метод сжатия в .xnb на XBOX360.
« Reply #4 on: October 15, 2011, 20:41 »

Да нет же Smiley XMA - это медиаформат, он здесь не причем. XNB - это контейнер для контента, в эти файлы сериализуются (а на xbox еще и сжимаются) все данные, начиная от шейдеров и заканчивая моделями и текстурами.
каюсь, невнимательно прочитал Smiley
Quote
Попробовал распаковать его с zlib, ничего не вышло. Чудес не бывает Sad
да, MS deflate не используют. Хотя и поддерживают PNG и ZIP в операционной системе.
Logged
destrator
Newbie
*
Posts: 20


View Profile
Re: Метод сжатия в .xnb на XBOX360.
« Reply #5 on: October 15, 2011, 23:19 »

gildor
Что-от не могу найти толковой библиотеки по работе с lzx. Может быть вы знаете? Скачанная unlzx предназначена для работы с соответствующими архивами Amiga. Неужели чего-нибудь универсально-кроссплатформенного вроде zlib для lzx не существует?
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7972



View Profile WWW
Re: Метод сжатия в .xnb на XBOX360.
« Reply #6 on: October 15, 2011, 23:27 »

Загляните в readme к umodel, там расписано всё что я использую Wink
Logged
destrator
Newbie
*
Posts: 20


View Profile
Re: Метод сжатия в .xnb на XBOX360.
« Reply #7 on: October 16, 2011, 03:18 »

Загляните в readme к umodel, там расписано всё что я использую Wink
Спасибо. Посмотрю. А вообще я уже закончил. Алгоритм взял из проекта MonoXNA. Уже распаковал пару ресурсов, переписал им заголовки на Windows и скормил XNA. Видео кушает на ура, а вот эффекты не хочет. В прочем, с эффектами ситуация предсказуемая. Было бы странно, если бы под Windows и под XBOX 360 был один и тот же шейдерный байткод Smiley

Теперь будем копать глубже. Надо изучить все типы ресурсов Smiley
Logged
Jump to:  

Powered by SMF | SMF © 2006-2009, Simple Machines LLC
Leviathan design by Bloc | XHTML | CSS