Welcome to U.A.C. [O.S.A.]
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Смотрим на логику работы doom движков от 0.2 до 0.9
   Список разделов - Doom и его порты - Смотрим на логику работы doom движков от 0.2 до 0.9Ответить
АвторСообщение
BFG2407
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 79 points
1211

Doom Rate: 1.38

Posts quality: +235
Ссылка на пост №1 Отправлено: 05.08.15 22:04:46
Новая редакция:

Решил всковырнуть в IDA .exeшники дум движков, для приблизительного сравнения, насколько они похожи на то, что есть в версии 1.0
Тут меня сразу-же ждало разочаровние: версия движка 1.0 либо чем то пожата, но IDA выдала некорректный граф - после анализа кода, он выходит незаконченным. Впрочем его изображение я предоставлю с пометкой на место где программа запнулась. Для начала я просто предоставлю изображения графов, почти без комментариев, а в последующих постах буду стараться за счёт чтения кода приблизительно обрисовать логику работы, но для версии 0.2 я даже стараться не буду - овчинка не стоит выделки: когда увидите вы сами всё поймёте. Хочу оговориться, что на изображениях вы увидите блок-схемы без кода, в дальнейшем я буду показывать, где какой участок кода расположен.

1.
Этот граф выдаёт IDA когда подсовываем ей .exe v 0.2 - чесн, ковырятся даже в нём не хочу, единственное, что понял: место отмеченное звёздочкой - код занимающийся построением левела.

2.
Этот граф получен из 0.3. На лицо хаотичный творческий рост из 0.2 - единственное, что понятно, это то, что благодаря меню, вырисовалась структура "запуска" (верхняя часть изображения) и "завершения" (нижняя часть), при этом прописано уйма условий при которых двиг заводиться и останавливается, в ряде случаев условия цикличны. Но всё равно разобраться в этом весьма проблематично, хотя и логика уже прослеживается.

3.
Это версия 0.4 Структура уже стройная и удобоваримая - чувствуется переписывание движка "с нуля". Компилятор идентифицировался - Boland C. Немного не понятно завершение программы, хотя второй выход (а точнее вылет), в случае ошибки.

4.
Внимание найдите 10 отличий, хотя можете не искать - в структуре их нет. Это версия 0.5: разница только в том, что написано внутри блоков - самом коде. В логике работы разницы нет.

5.
Эта версия 0.9 - структура теперь более линейная. В случае ошибки двиг перескакивает часть кода и завершается в штатном режиме без бсодов и зависаний. Ясное дело код претерпел значительные изменения. В виду отсутствия версий: 0.6, 0.7, 0.8 не берусь утверждать когда и как в его логике что-либо менялось. Может быть структура обрисовалась после добавления bsp - двиг стал работать более стабильно, и нужда в аварийных блоках, попросту пропала.

6.
Это выдала IDA на релизную версию 1.0, запнулась она в последнем блоке:
Красным отмечена строка, где программа не схавала. Вполне вероятно, что .exe был запакован. Однако я не думаю, что 1.0 будет чем-либо сильно отличаться по логике от 0.9 - вполне вероятно ситуация та-же, что с 0.4 и 0.5: разница только в содержимом блоков.

Думаю, что при наличии времени буду потихоньку допиливать анализ. Анализ будет как "геймпленый" мы будем пытаться понять логику работы запуская альфы и ища баги наверняка, а так-же пытаться понять что написано в коде. Предупреждаю сразу, что ассемблерист из меня плохой даже "со словарём", поэтому сильно не бейте. Жаль нет ЗЕРНОЕd'а!

P.S. Рано построил доводы относительно версий 0.4, 0.5 и 0.9. Дело в том, что собраны были они борландом, а следовательно дизасемблировалась борландовская развёртка - dos4gw. Появилась следующая задача: отвязать версии 0.4, 0.5 и 0.9 от Dos4GW - получить LE файл. После этого пропустить в IDA его через HexRays - получить исходник на С++. Не гарантирую, что всё будет работать, но зато будет более-менее понятно.

P.S.S. Как выяснилось на графы 0.4, 0.5, 0.9 - Dos4gw не влияет, т.к. он расположен отдельно от .exe, а вот на версии 1.0 IDA запиналась именно по причине этого самого dos4gw
2 2 1
sobran
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 79 points
1361

Doom Rate: 1.29

Posts quality: +346
Ссылка на пост №2 Отправлено: 06.08.15 01:06:45
Немного разачарован при виде практически линейной схемы в 0.9 версии, хотя может это говорит о профессионализме разрабов и "Элегантном" коде.

ПС
Может перенсти в какой-нибудь другой раздел эту тему? В вокругдум например?
4 1
ZZYZX
- UAC Commissar -
Next rank: = UAC Commissar = after 16 pointsМодератор форума
6284

Doom Rate: 1.65

Posts quality: +1630
Ссылка на пост №3 Отправлено: 06.08.15 04:18:02
Если я правильно понимаю, то это main().
В идеале main() игрового движка должен выглядеть так:

int main(int argc, char** argv)
{
    parse_args(argc, argv);
    main_loop_init();
    while (main_loop_step())
        sleep(1);
    main_loop_shutdown();
    return get_main_loop_return_value();
}


Почему в альфах дума такой огромный main(), я не понимаю. В версии 1.0 всё хорошо.
А запнулась ида потому, что скорее всего там нестандартное использование регистров. Программисты под дос регулярно таким грешили, как и компиляторы с оптимизацией.
2 2 1
BFG2407
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 79 points
1211

Doom Rate: 1.38

Posts quality: +235
Ссылка на пост №4 Отправлено: 06.08.15 08:19:44
ZZYZX
Вполне вероятно. Однако, в main содержится ещё что-то. Дело в том, что если говорить об ассемблерном построении, то сначала мы имеем перечисление функций - до тела программы, затем само тело программы. Функции в ассемблерном представлении, не совсем то, что в представлении С. Но при этом не факт, что графы - это только тело "main". Хотя и main может быть огромным, если разбиения на функции особо нет.

P.S. на еденице IDA запнулась, по причине "не соответствия типов" - это происходит, когда dos4gw собирают во едино с .exe, а не выносят его отдельно от основного .exe

sobran
Да можно перенести. Надо будет ещё поковырять и накатать первую статейку.

Добавлено спустя 2 дня 12 часов 30 минут 22 секунды:

Преждевременно, но всё-таки, закину. Считаю это не такая важная фича, чтобы только из-за неё статью пилить.
И так, это модифицированный dos4gw - он 32х битный, и весит меньше. Стабилизирует работу приложений использующих него, и полностью совместим с dos4gw. Подойдёт не только для альфа версий дум, но и для других игр с "открытым" dos4gw.exe. Короче попробуйте с Chasm: the Rift - может при 1024x768 будет работать стабильно. Версии 0.4 и 0.5 теперь реже вылетают и хуже провоцируют нестабильность. В 0.5 заработал Hi-Res режим! (правда криво, ибо криво написан).
А это модифицированный doom.exe v1.0 - 32х битное приложение, однако под XP 64 bit, и 7-кой работать не будет! Работает только с версией shareware 1.0 коротая лежит на DP. Скорость работы немного выше.
2 2 1
BFG2407
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 79 points
1211

Doom Rate: 1.38

Posts quality: +235
Ссылка на пост №5 Отправлено: 12.01.16 01:47:28
Забросил :crazy: надо будет после того как подразрулусь с делами продолжить
2 2 1
Страница 1 из 1Перейти наверх
   Список разделов - Doom и его порты - Смотрим на логику работы doom движков от 0.2 до 0.9