WTD
#41
Отправлено 30 August 2009 - 21:42
#42
Отправлено 31 August 2009 - 09:49
#define RSC_PAGED 0x80000000 #define RSC_COMPRESSED 0x40000000 #define RSC_PHYS_PAGE_COUNT_MASK 0x3C000000 #define RSC_PHYS_TOTAL_PAGES_MASK 0x03FF8000 #define RSC_PHYS_LARGE_PAGES_MASK 0x03F80000 #define RSC_PHYS_S2_PAGE_MASK 0x00040000 #define RSC_PHYS_S4_PAGE_MASK 0x00020000 #define RSC_PHYS_S8_PAGE_MASK 0x00010000 #define RSC_PHYS_S16_PAGE_MASK 0x00008000 #define RSC_VIRT_PAGE_COUNT_MASK 0x00007800 #define RSC_VIRT_TOTAL_PAGES_MASK 0x000007FF #define RSC_VIRT_LARGE_PAGES_MASK 0x000007F0 #define RSC_VIRT_S2_PAGE_MASK 0x00000008 #define RSC_VIRT_S4_PAGE_MASK 0x00000004 #define RSC_VIRT_S8_PAGE_MASK 0x00000002 #define RSC_VIRT_S16_PAGE_MASK 0x00000001
Интересно проследить как происходит сбор wtd-файла в G-Texture. Почему-то размер CPU-части округляется padding-ом до 8192 когда можно округлить до 4096. SimpleCollection/PtrCollection после grcTexturePC. Только вот какая в этом логика?
Это я экспериментировал с разными базовыми размерами. Для большинства файлов, так получается лучшая раскладка в physical (GPU) части. pgBase.rar - это кусок, который был написан для G-Texture.
Я уже давно собираюсь сделать такую dll (не только считать флаги, но и записывать файл). Как только будет немного свободного времени - обязательно сделаю.listener, ты пишешь на C++ ведь? Если да, то можешь плиз написать DLL для подсчитывания флагов? Я слышал, что DLL, написанные на C++, можно использовать в Delphi, на котором пишем я и Дагерон. Очень прошу. Нам это очень поможет.
Сообщение отредактировал listener: 31 August 2009 - 09:49
#43
Отправлено 31 August 2009 - 10:36
В любом случае нормальную постановку всех коллекций и структур я уже сделал.
Осталось получить нормальные размеры сегметов и соответствующие флаги.
#44
Отправлено 06 September 2009 - 10:03
#45
Отправлено 06 September 2009 - 11:13
#46
Отправлено 21 September 2009 - 11:57
Решил перечитать мануал по флагам ещё раз на форуме Санни Билдера. Ты говорил, что на страницы выделено 11 бит, из них 7 бит - кол-во страниц по 4096 байт, а 4 бита определяют необходимость использования страниц меньшего размера. Значит ли это, что можно воспользоваться лишь счётом больших страниц, разделив CPU и GPU блоки только на страницы по 4096 байт?
Edit: Ещё вопрос. Если на количество больших страниц выделено 7 бит, то максимальное кол-во байтов, которые можно делить на такие страницы - 520192. Что делать с блоками больше этого размера?
Сообщение отредактировал RussianCJ: 21 September 2009 - 12:38
#47
Отправлено 21 September 2009 - 13:23
Сообщение отредактировал listener: 21 September 2009 - 13:26
#48
Отправлено 21 September 2009 - 15:11
#49
Отправлено 21 September 2009 - 16:04
function CalculateFlags(CPUSize, GPUSize, PageSizeCPU, PageSizeGPU: Integer):Integer; export; var CPUPageCount,GPUPageCount:Integer; Flags:Integer; begin CPUPageCount:=CPUSize div PageSizeCPU; if CPUSize mod PageSizeCPU > 0 then CPUPageCount:=CPUPageCount+1; GPUPageCount:=GPUSize div PageSizeGPU; if GPUSize mod PageSizeGPU > 0 then GPUPageCount:=GPUPageCount+1; Flags:=CPUPageCount shl 8; Flags:=(Flags or Round(Log2(PageSizeCPU)-12)) shl 7; Flags:=(Flags or GPUPageCount) shl 8; Flags:=(Flags or Round(Log2(PageSizeGPU)-12)) shl 2; Result:=Flags; end;
Вот код на делфи...хотя я более чем уверен, что он неправильный (не может же он быть таким маленьким). Использовал с учётом того, что страницы одного размера у каждого блока.
Эти слова поставили меня в тупикПри записи мало просто посчитать размер блока, нужно еще и найти относительно оптимальную раскладку структр по блокам.
Edit: Немного поменял код. На сонную голову написал чушь насчёт размеров страниц.
Сообщение отредактировал RussianCJ: 21 September 2009 - 21:18
#50
Отправлено 22 September 2009 - 09:01
Для начала, точно сформулируем задачу: нам требуется записать RSC.
Задача расчета флагов - к этому относится очень слабо.
Что же такого сложного в записи RSC? Ресурс состоит из набора непрерывных объектов, ссылающихся друг на друга.
Например, .wtd содержит pgDictionary, offsetMap (DWORD[132]), массив хэшей, массив указателей, соответствующее количество grcTexture и текстурных данных к ним. Каждый перечисленный элемент - это непрерывный объект.
Если хочется формального определения: непрерывный объект - это набор полей, доступ к которым осуществляется по смещению от начала этого объекта.
Требуется найти такое размещение этих объектов по набору блоков памяти размером 2^N, чтобы каждый объект находился полностью внутри блока.
(Здесь и далее, для простоты изложения я опускаю тот факт, что наборов объектов два, наборов блоков - два и размеров - тоже два).
После этого, задача получения флагов - тривиальна (и код получается гораздо меньше).
Т.е. флаги - это не цель, а побочный результат.
Неприятное следствие: ресурс, для которого неполностью известна структура, корректно записать нельзя.
А приведенный код - некорректен по своей природе. Значения флагов - это побочный эффект работы раскладчика блоков, и конечный результат получается вообще в одну строку.
header->dwFlags = 0xC0000000|(pflags << 15)|vflags;pflags и vfalgs считаются при раскладке.
(Это все есть в том архиве, который я выкладывал еще зимой). Он, в принципе, работоспособен. Надо только перетащить его на новые библиотеки и добавить свеженакопанные ресурсы.
#51
Отправлено 23 September 2009 - 07:14
Но всё-таки попытка.У-ф-ф-ф... Еще одна попытка поставить все с головы на ноги.
Но чтение ресурса ведь будет идти с использованием этих флагов. Не думаю что это так маловажно.Для начала, точно сформулируем задачу: нам требуется записать RSC.
Задача расчета флагов - к этому относится очень слабо.
Если имелся ввиду только CPU блок, то вполне согласен.Что же такого сложного в записи RSC? Ресурс состоит из набора непрерывных объектов, ссылающихся друг на друга.
Например, .wtd содержит pgDictionary, offsetMap (DWORD[132]), массив хэшей, массив указателей, соответствующее количество grcTexture и текстурных данных к ним. Каждый перечисленный элемент - это непрерывный объект.
Ну тоже самое ты ранее говорил.Требуется найти такое размещение этих объектов по набору блоков памяти размером 2^N, чтобы каждый объект находился полностью внутри блока.
(Здесь и далее, для простоты изложения я опускаю тот факт, что наборов объектов два, наборов блоков - два и размеров - тоже два).
Вот тут поподробнее. Имеется ввиду вычисление оптимального размера страниц и их количества?pflags и vfalgs считаются при раскладке.
Насколько я понимаю, речь идёт о pgBase?(Это все есть в том архиве, который я выкладывал еще зимой). Он, в принципе, работоспособен. Надо только перетащить его на новые библиотеки и добавить свеженакопанные ресурсы.
Ох, почему-то сначала я думал, что флаги - это набор битов с информацией о размерах и количестве страниц двух блоков (это не считая ещё двух битов, отвечающих за страничность и сжатие). Теперь я начинаю путаться.
#52
Отправлено 02 October 2009 - 11:43
Извини, если что, но всё-таки есть ли какие-нибудь сдвиги с dll?Пока нет.
Ближайшие две недели - у меня на первом месте рабочий проект (есть такое слово deadline).
На всякую мелочь (типа копания в форматах) еще как-то получается выкроить часик в день, а здесь нужно день-два плотно покопаться.
#53
Отправлено 02 October 2009 - 12:37
#54
Отправлено 02 October 2009 - 13:28
#55
Отправлено 02 October 2009 - 15:10
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных














