Перейти к содержимому


Фотография
* * * * * 1 Голосов

WTD


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 54

#41 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 30 August 2009 - 21:42

listener, ты пишешь на C++ ведь? Если да, то можешь плиз написать DLL для подсчитывания флагов? Я слышал, что DLL, написанные на C++, можно использовать в Delphi, на котором пишем я и Дагерон. Очень прошу. Нам это очень поможет.

#42 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 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.

listener, ты пишешь на C++ ведь? Если да, то можешь плиз написать DLL для подсчитывания флагов? Я слышал, что DLL, написанные на C++, можно использовать в Delphi, на котором пишем я и Дагерон. Очень прошу. Нам это очень поможет.

Я уже давно собираюсь сделать такую dll (не только считать флаги, но и записывать файл). Как только будет немного свободного времени - обязательно сделаю.

Сообщение отредактировал listener: 31 August 2009 - 09:49

You think your day was surreal? Try mine.

#43 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 31 August 2009 - 10:36

RussianCJ
В любом случае нормальную постановку всех коллекций и структур я уже сделал.
Осталось получить нормальные размеры сегметов и соответствующие флаги.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#44 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 06 September 2009 - 10:03

listener, извини за некоторую наглость. Я хотел спросить: ты ещё не сделал dll? Просто ты нас пойми, мы с другом застопорились на создании мода и не можем продолжить, пока нет этого dll. Ещё раз спасибо за предложенную помощь и извини, если что.

#45 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 06 September 2009 - 11:13

Пока нет. Ближайшие две недели - у меня на первом месте рабочий проект (есть такое слово deadline). На всякую мелочь (типа копания в форматах) еще как-то получается выкроить часик в день, а здесь нужно день-два плотно покопаться.
You think your day was surreal? Try mine.

#46 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 21 September 2009 - 11:57

Продолжая тему флагов.

Решил перечитать мануал по флагам ещё раз на форуме Санни Билдера. Ты говорил, что на страницы выделено 11 бит, из них 7 бит - кол-во страниц по 4096 байт, а 4 бита определяют необходимость использования страниц меньшего размера. Значит ли это, что можно воспользоваться лишь счётом больших страниц, разделив CPU и GPU блоки только на страницы по 4096 байт?

Edit: Ещё вопрос. Если на количество больших страниц выделено 7 бит, то максимальное кол-во байтов, которые можно делить на такие страницы - 520192. Что делать с блоками больше этого размера?

Сообщение отредактировал RussianCJ: 21 September 2009 - 12:38


#47 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 21 September 2009 - 13:23

Большая страница может быть размером от 4К (1<<(0+12)) до 128M (1<<(15+12)) Т.е., максимальный размер ресурса - 128M * 127 + 64M + 32M + 16M + 8M = 32632M Любой непрерывный объект должен целиком укладываться в страницу, т.е. размер большой страницы должен быть не меньше, чем размер самого большого объекта в ресурсе (например, для текстуры 1024x1024 DXT1 - 512К или больше). Если использовать только большие страницы - ничего страшного не будет, за исключением того, что памяти будет тратиться больше.

Сообщение отредактировал listener: 21 September 2009 - 13:26

You think your day was surreal? Try mine.

#48 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 21 September 2009 - 15:11

Аа, хорошо... И ещё, выше ты давал совместно с флагами сжатия и страничности ещё и маски чисел...но я не совсем разобрался в них. Можешь прокомментировать каждую маску?

#49 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 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 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 22 September 2009 - 09:01

У-ф-ф-ф... Еще одна попытка поставить все с головы на ноги.

Для начала, точно сформулируем задачу: нам требуется записать RSC.
Задача расчета флагов - к этому относится очень слабо.

Что же такого сложного в записи RSC? Ресурс состоит из набора непрерывных объектов, ссылающихся друг на друга.
Например, .wtd содержит pgDictionary, offsetMap (DWORD[132]), массив хэшей, массив указателей, соответствующее количество grcTexture и текстурных данных к ним. Каждый перечисленный элемент - это непрерывный объект.

Если хочется формального определения: непрерывный объект - это набор полей, доступ к которым осуществляется по смещению от начала этого объекта.

Требуется найти такое размещение этих объектов по набору блоков памяти размером 2^N, чтобы каждый объект находился полностью внутри блока.
(Здесь и далее, для простоты изложения я опускаю тот факт, что наборов объектов два, наборов блоков - два и размеров - тоже два).

После этого, задача получения флагов - тривиальна (и код получается гораздо меньше).
Т.е. флаги - это не цель, а побочный результат.

Неприятное следствие: ресурс, для которого неполностью известна структура, корректно записать нельзя.

А приведенный код - некорректен по своей природе. Значения флагов - это побочный эффект работы раскладчика блоков, и конечный результат получается вообще в одну строку.
header->dwFlags = 0xC0000000|(pflags << 15)|vflags;
pflags и vfalgs считаются при раскладке.
(Это все есть в том архиве, который я выкладывал еще зимой). Он, в принципе, работоспособен. Надо только перетащить его на новые библиотеки и добавить свеженакопанные ресурсы.
You think your day was surreal? Try mine.

#51 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 23 September 2009 - 07:14

У-ф-ф-ф... Еще одна попытка поставить все с головы на ноги.

Но всё-таки попытка.

Для начала, точно сформулируем задачу: нам требуется записать RSC.
Задача расчета флагов - к этому относится очень слабо.

Но чтение ресурса ведь будет идти с использованием этих флагов. Не думаю что это так маловажно.

Что же такого сложного в записи RSC? Ресурс состоит из набора непрерывных объектов, ссылающихся друг на друга.
Например, .wtd содержит pgDictionary, offsetMap (DWORD[132]), массив хэшей, массив указателей, соответствующее количество grcTexture и текстурных данных к ним. Каждый перечисленный элемент - это непрерывный объект.

Если имелся ввиду только CPU блок, то вполне согласен.

Требуется найти такое размещение этих объектов по набору блоков памяти размером 2^N, чтобы каждый объект находился полностью внутри блока.
(Здесь и далее, для простоты изложения я опускаю тот факт, что наборов объектов два, наборов блоков - два и размеров - тоже два).

Ну тоже самое ты ранее говорил.

pflags и vfalgs считаются при раскладке.

Вот тут поподробнее. Имеется ввиду вычисление оптимального размера страниц и их количества?

(Это все есть в том архиве, который я выкладывал еще зимой). Он, в принципе, работоспособен. Надо только перетащить его на новые библиотеки и добавить свеженакопанные ресурсы.

Насколько я понимаю, речь идёт о pgBase?

Ох, почему-то сначала я думал, что флаги - это набор битов с информацией о размерах и количестве страниц двух блоков (это не считая ещё двух битов, отвечающих за страничность и сжатие). Теперь я начинаю путаться.

#52 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 02 October 2009 - 11:43

Пока нет.
Ближайшие две недели - у меня на первом месте рабочий проект (есть такое слово deadline).
На всякую мелочь (типа копания в форматах) еще как-то получается выкроить часик в день, а здесь нужно день-два плотно покопаться.

Извини, если что, но всё-таки есть ли какие-нибудь сдвиги с dll?

#53 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 02 October 2009 - 12:37

Чтобы не повторяться: http://forums.gtamod...w...post&p=3367
(там в конце поста есть вопросы)
You think your day was surreal? Try mine.

#54 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 02 October 2009 - 13:28

Информация о вскрытии ресурсов Xenon Texture Dictionary...не улавливаю связи...

#55 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 02 October 2009 - 15:10

Там (по крайней мере, в последних двух постах) не про xtd, а про новую версию rsc_io
You think your day was surreal? Try mine.




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных