March 28, 2024, 15:08
bigger smaller reset     1020px Wide width Full width Reset   * *

Gildor's Forums

  Homepage Facebook Read news on Twitter Youtube channel Github page
Welcome, Guest. Please login or register.
Did you miss your activation email?

« previous next »
Print
Author Topic: Как правильно загрузить архивы?  (Read 5101 times)
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« on: July 21, 2010, 20:17 »


Как загрузить архивы от UT3 игры, точно в том порядке, и в том же количестве как делает игра?
нужно в итоге получить MaxObjectIndex и воспроизвести работу IndexToObject().

поставить отладчиком брек на ULinkerLoad::ULinkerLoad() и все переписать на бумажку сложно, архивов то сотни. да и к игре иногда выходят патчи, и список может меняться. нужен более универсальный метод.

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

Logged
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« Reply #1 on: July 21, 2010, 21:37 »


кажется я спешу и туплю.
сервер же присылает клиенту огромный список в виде:
Code:
12:26:23 - DevNet: PendingLevel received: USES GUID=628429C66E7849A7943E0F8DEC56E4C2 PKG=Core EXT=u FLAGS=35651584 GEN=2 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=DB0013C42B8F4E0896D8C4993BE3DC76 PKG=Engine EXT=u FLAGS=2097152 GEN=2 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=1468415D39D1478BA7EF7486D9F431DE PKG=EngineResources EXT=upk FLAGS=33554433 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=CAA64622C4EF4F6B92A2C7D6A1D4D8C4 PKG=EngineFonts EXT=upk FLAGS=33554433 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=472F0D15379F4957B1A664DC9E03BA17 PKG=BlobShadowTextures EXT=upk FLAGS=33554432 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=9FAE862301734F4EBC76926BCA03E270 PKG=EngineMaterials EXT=upk FLAGS=33554433 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=A52AA5ED039D4DE090D14625CDD884FF PKG=EngineMeshes EXT=upk FLAGS=33554433 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=85FE19B00D654633BD53FDF0F9D6347D PKG=EditorMeshes EXT=upk FLAGS=33554433 GEN=1 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=46C43A72400B474FAB9D9A2298D70534 PKG=Editor EXT=u FLAGS=35651584 GEN=2 BASEPKG=None
12:26:23 - DevNet: PendingLevel received: USES GUID=F4F5EF8D91804365BF2496E560CEDFB2 PKG=UnrealEd EXT=u FLAGS=35651584 GEN=2 BASEPKG=None
.....
.....

наверно по нему и надо ориентироваться. загружать архивы в этом порядке...
Logged
Gildor
Administrator
Hero Member
*****
Posts: 7978



View Profile WWW
« Reply #2 on: July 21, 2010, 22:15 »

Интересно - а как вы ставите breakpoint на нативную функцию? Да ещё и по имени класса? В UT2004 это ещё было реально - там большинство функций было проэкспортировано из dll. Но в UE3 никаких dll нет - там всё статически слинковано в один исполняемый файл без какой либо отладочной информации!
Logged
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« Reply #3 on: July 22, 2010, 11:22 »

конечно не по имени класса. я обычно нахожу такие функции по их лог сообщениям или по характерным действиям.
ну к примеру, находим сначала UGameEngine::Init() по сообщению "Game engine initialized",
потом двигаемся по ней отладчиком, пока не находим LoadMap(), и так далее.
или можно наоборот, поставить точку останова на win32 CreateFileW, и в обратном порядке, смотреть откуда туда пришли. это приведёт нас к GFileManager->CreateFileReader() который находится в ULinkerLoad::ULinkerLoad() который и нужен.


вообщем сейчас я загружаю все файлы так -
у меня есть конфиг, в котором прописано
archives=E:/APB_Beta-EU/Engine/Content;E:/APB_Beta-EU/APBGame/Content;E:/APB_Beta-EU/APBGame/ScriptUserBuild
двигаюсь по этим фолдерам и их субфолдерам, собираю все файлы (5215 файлов, 10 гб). и читаю только начало их заголовков, вытаскиваю GUID. кэширую все GUID и имена файлов. занимает 4 секунды.
потом беру (это еще не сделано) список GUID-ов которые надо загрузить (415 guid-ов), открываю файлы, читаю, и гружу их экспорт в один общий список экспорта. всё, mission complete Smiley
« Last Edit: July 22, 2010, 11:27 by wad » Logged
Gildor
Administrator
Hero Member
*****
Posts: 7978



View Profile WWW
« Reply #4 on: July 22, 2010, 11:46 »

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

Например, движку сказано - загрузить уровень A. Он загружает пакет A.upk (ну или там A.umap, A.xxx и т.п.) и ищет в нём объект "Level" (или что-то вроде того). И втупую его сериализует. Объекты в Unreal Engine устроены так, что они ссылаются на другие ресурсы - из того же пакета (через таблицу экспорта) или из другого (через импорт). Сериализация текущего объекта для загрузки ссылки не прерывается, вместо этого движок запоминает, что после загрузки текущёго объекта надо загрузить ещё один (или много) - объекты для загрузки кладутся в очередь. Очередь для оптимизации загрузки с CD/DVD может сортироваться (я не уверен, что UE3 это делает - по крайней мере в UT2004 такого кода нет). В общем, список загружаемых пакетов и порядок их загрузки зависит от того, что конкретно из пакета загружаем и от того, что этим объектом используется. Ну и от наличия сортировки конечно.

Надеюсь, что я достаточно хорошо объяснил Smiley
Logged
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« Reply #5 on: July 22, 2010, 20:17 »

да, но во первых - как именно объект ссылается на объекты из других архивов? по GUID?

во вторых - непонятно, почему тогда список "USES GUID=....", приходящий от сервера, начинается не с архива уровня, а с Core, Engine, EngineResources, EngineFonts,.... и так далее, а уровень только потом.
есть подозрение, что последовательность загрузки зависит от того, выделенный сервер это или нет.

и третье - исходники UT3 есть, 2006 года. (ссылка удалена)   Cool


« Last Edit: July 22, 2010, 20:28 by gildor » Logged
Gildor
Administrator
Hero Member
*****
Posts: 7978



View Profile WWW
« Reply #6 on: July 22, 2010, 20:27 »

да, но во первых - как именно объект ссылается на объекты из других архивов? по GUID?
Ни в коем случае. Когда сериализуется "UObject*", то идёт int - положительное/отрицательное число ссылается на таблицу импорта/экспорта в текущем пакете.

Quote
во вторых - непонятно, почему тогда список "USES GUID=....", приходящий от сервера, начинается не с архива уровня, а с Core, Engine, EngineResources, EngineFonts,.... и так далее, а уровень только потом.
есть подозрение, что последовательность загрузки зависит от того, выделенный сервер это или нет.
Есть в ini такой раздел - "server packages". И ещё что-то. Там лежат пакеты, которые безусловно загружаются до старта уровня.

Quote
и третье - исходники UT3 есть, 2006 года.
Они могли бы быть полезны для анализа UE1 или UE2. Для современного UE3 они практически бесполезны - там отсутствует ряд ключевых фич движка (например, со стороны пакетов - компрессия). Это скорее не UE3, а какой-нибудь UE2.99
Logged
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« Reply #7 on: July 22, 2010, 21:59 »

Ни в коем случае. Когда сериализуется "UObject*", то идёт int - положительное/отрицательное число ссылается на таблицу импорта/экспорта в текущем пакете.
да, вижу, спасибо. действительно всё по именам. зачем вообще тогда guid-ы непонятно. только для синхронизации контента сервер-клиент? кстати, интересно, что в guid-ах в новых версиях байты определённым образом перемешаны, и не соответствуют guid-ам в USES.
конвертируются так:
Code:
sscanf_s( guid_str, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
&temp[3],   &temp[2],  &temp[1],  &temp[0],
&temp[5],   &temp[4],  &temp[7],  &temp[6],
&temp[8],   &temp[9], &temp[10], &temp[11],
&temp[12], &temp[13], &temp[14], &temp[15]);
Quote
Есть в ini такой раздел - "server packages". И ещё что-то. Там лежат пакеты, которые безусловно загружаются до старта уровня.
вижу. в APB это ServerPackages=FemalePresets, но FemalePresets.upk нет в списке USES, он бы должен быть самым первым тогда.
Quote
Они могли бы быть полезны для анализа UE1 или UE2. Для современного UE3 они практически бесполезны - там отсутствует ряд ключевых фич движка (например, со стороны пакетов - компрессия). Это скорее не UE3, а какой-нибудь UE2.99
возможно, но иерархия и имена нативных классов оттуда подходят почти всегда.
ну и сериализация сетевых пакетов, которая собственно и является моей целью, изменилась не так сильно.
Logged
wad
Silver Sponsor
Newbie
**
Posts: 8


View Profile
« Reply #8 on: July 25, 2010, 06:46 »

все закончил с загрузкой заголовков. всё работает, индексы объектов полностью совпадают с теми что в клиенте. спасибо за советы и помощь.
Logged
Print 
« previous next »
Jump to:  

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