HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashNT: блог разработчика
Часть I
Страницы (241): « Первая ... « 82 83 84 85 [86] 87 88 89 90 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Папка мода уже закодирована в пути к карте. Кстати NT умеет так загружаться.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192132

Старое сообщение 12-04-2020 11:57
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Про интерфейсы взаимодействия немного расскажу. В халфе это была основная головная боль, потому что между пользовательской дллкой и движком формировался-набирался некий уникальный интерфейс, и вот что в нём было - то и доступно пользователю. А если тот, кто формировал этот интерфейс о чём-то забывал, то всё, жопа. Или бывало так, что в интерфейс всё-таки добавлялись недостающие функции приходилось мучительно проверять их наличие по версиям, размеру апи и прочей глупости. Это дико неудобно, не говоря уже о том, что для каждой новой библиотеки надо было набивать этот интерфейс заново. Я отказался от этой порочной практики и ввёл таблицу интерфейсов. Таблицы поименованные, в имени дополнительно содержится и номер версии интерфейса. Таким образом для каждой новой пользовательской библиотеки одновременно доступен весь набор функций, достаточно просто её позвать. В обратную сторону это тоже работает, но как правило от пользовательской библиотеки достаточно одной-единственной таблицы экспорта. Но можно сделать и несколько.
То есть, все движковые функции, доступные на клиенте, будут доступны и на сервере и в меню тоже. Ну а если понадобится расширить какой-то интерфейс без потери бинарной совместимости, то от базового достаточно объявить наследный класс, добавить в него недостающие функции и дать ему новое имя в табличке. И всё, совместимость не теряется ни при каких обстоятельствах. Ну а если всё же случится беда, будет виндовая ошибка Pure Virtual Function Call или что-то вроде этого, вместо загадочного вылета по 0x000005, который мог означать вообще всё что угодно.

Добавлено 13-04-2020 в 13:02:

А, вот еще какой любопытный момент. Вот это физическое разделение таблиц экспорта в принципе позволяет сливать несколько пользовательских библиотек в одну, сохраняя разделение кода. Ну скажем клиент и сервер.
Оба в одной дллке, память не пересекается, но иногда, если очень-очень надо, они могут напрямую друг-другу что-то модифицировать, например в сингл-плеере. В халфе, где было именно 2 изолированные дллки такое не прокатит, народ порою шёл на грязные хаки - грузил из hl.dll client.dll, искал там торчащий наружу экспорт и по нему брал какую-то информацию.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192148

Старое сообщение 13-04-2020 10:02
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


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

Забавно, у меня тут недавно возникла аналогичная проблема. Вообще, я стараюсь избегать использования длл - модульность на бинарном уровне как правило бывает не нужна, но тут мне понадобилась отдельная длл.

Поскольку экзешник и длл собираются отдельно, нужно было обеспечить какую-то систему версионирования. Требований к системе у меня было только два:

1. Система должна понимать, что существуют обратно совместимые интерфейсы - если в интерфейс добавилась новая функция, то старый клиент все еще может использовать новый интерфейс также как он использовал старый.
2. Система должна быть удобной для использования во время активной разработки, когда в интерфейс постоянно добавляются новые функции, а старые иногда меняются или удаляются.

Вариантов у меня было два: абстрактные классы (они же "интерфейсы") и структуры с указателями на функции - как в хл.

Соответствие абстрактных классов п.1 для меня так и осталось загадкой. В теории они ему не соответствуют - конпилятор имеет право расположить указатели в vtable так как ему удобно. А вот как обстоит дело на практике я так и не понял. Вроде как MSVC распологает их в порядке объявления и вроде как я даже где-то когда-то видел код который этот факт использовал. Но тут встает другая проблема - клиент как-то должен узнать, что поддерживаются обе версии интерфейса. Сорс (см. пред. ссылку) для этого предлагает экспозить интерфейс два раза. Для сорса это не проблема - движок уже достаточно взрослый и интерфейсы в нем меняются нечасто. Но в развивающемся коде это приведет к тому, что этих версий придется поддерживать целый список, а это противоречит п.2.

В итоге я остановился на структурах с указателями. Порядок работы следующий:

1. Новые функции добавляются в конец структуры - больше ничего делать не нужно.
2. При поломке совместимости версия увеличивается на 1.

Запрашивая интерфейс, клиент передает номер версии и размер своей структуры. Если номер версии отличается, значит интерфейс не совместим - возвращаем false. Далее, если размер интерфейса на клиенте больше, значит у клиента более новая версия - возвращаем false. Если все в порядке - копируем столько байт структуры сколько запросил клиент (у него может быть более старая версия).

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

Статическую сборку я использую для финального билда.

Сообщить модератору | | IP: Записан
Сообщение: 192172

Старое сообщение 13-04-2020 19:12
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
Government-Man писал:
А в сорсе видел как сделано?

Ну у меня в чём-то похожая система, но проще, не такая замороченная.

Цитата:
Government-Man писал:
когда в интерфейс постоянно добавляются новые функции, а старые иногда меняются или удаляются.

пока над исходным кодом работает один человек на совместимость можно плевать. Главное - устаканить интерфейсы к релизу.

Цитата:
Government-Man писал:
Но тут встает другая проблема - клиент как-то должен узнать, что поддерживаются обе версии интерфейса

Ну это легко. Зовём обновлённый интерфейс, получаем хрен, зовём старый интерфейс.

Цитата:
Government-Man писал:
Запрашивая интерфейс, клиент передает номер версии и размер своей структуры. Если номер версии отличается, значит интерфейс не совместим - возвращаем false. Далее, если размер интерфейса на клиенте больше, значит у клиента более новая версия - возвращаем false. Если все в порядке - копируем столько байт структуры сколько запросил клиент (у него может быть более старая версия).

Всё верно, в NT 2015-го года именно такая схема и была реализована.

Вообще дллка нужна для того чтобы отделить неизменный код от изменямого. Скажем движок не меняется, а разные там энтити - вполне.

Цитата:
Government-Man писал:
Статическую сборку я использую для финального билда.

што ты там такое делаешь? Юнити?

Добавлено 13-04-2020 в 23:39:

И кстати к вопросу о неизменности - в идеале ядро движка не должно содержать ни одного константного пути. На практике просто надо свести их к минимуму.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192173

Старое сообщение 13-04-2020 20:39
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
што ты там такое делаешь? Юнити?


Проекты на уече =)

Цитата:
Дядя Миша писал:
Вообще дллка нужна для того чтобы отделить неизменный код от изменямого.


Я преследовал две цели.

Во-первых, в какой-то момент интерфейс действительно должен устаканиться и тогда собирать уеч нужно будет горазо реже, а сравнительно небольшую игровую длл - часто. Но на деле эта проблема не то чтобы стоит остро - если не чистить промежуточные файлы сборки уеча, то по сути он тоже будет перекомпилировать только одну длл.

Основная задача в моем случае - отделить свой код от чужого. По задумке авторов уеча игры на нем делаются путем расширения классов движка. При этом код твоей игры какбы становится модулем движка и все это потом собирается кастомной билд-системой. Собрать свой код отдельно от движка ты уже не сможешь. В принципе это правильно - это удобнее и гибче, чем апи из сотни функций, но код игры при этом становится прочно завязан на архитектуру движка. Я решил избавиться от архитектурных ограничений и перенести большую часто своего кода в длл, отгородившись от движка при помощи апи.

Цитата:
Дядя Миша писал:
Ну это легко. Зовём обновлённый интерфейс, получаем хрен, зовём старый интерфейс.


Но длл тогда получается должна отзываться на каждую версию, которую она поддерживает? Если интерфейс меняется нечасто то это не проблема, а вот если часто - уже проблема, потому что версий накопиться целая телега.

Отредактировано Government-Man 13-04-2020 в 22:10

Сообщить модератору | | IP: Записан
Сообщение: 192174

Старое сообщение 13-04-2020 22:07
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
Government-Man писал:
По задумке авторов уеча игры на нем делаются путем расширения классов движка.

Ядро - суть абстракция, оно не знает ни про какие энтити и прочее. В движке у нас файловая, консоль, рендерер, менеджер моделей, менеджер сети, звуковая подсистема. В игровой части физика, AI, механизм выделения и освобождения энтить, таблицы дельта-кодирования по сети, сейврестор. Всё это завязано на конкретную игру и может кардинально изменяться. А из движка торчат только те функции, которые в принципе поменяться не могут - отправка сообщений в консоль, чтение-запись файлов, отправка приём сетевых сообщений и так далее.

Цитата:
Government-Man писал:
Но длл тогда получается должна отзываться на каждую версию, которую она поддерживает?

так я же говорю, новое API получается путём наследования старого + еще несколько функций.

Добавлено 14-04-2020 в 10:44:

Вот к примеру как реализован механизм смены\загрузки уровней в ядре?
Есть три функции:
C++ Source Code:
virtual void LoadGame( char const *pSaveFileName ) = 0;
virtual void LoadLevel( char const *pMapName, bool background ) = 0;
virtual void ChangeLevel( char const *pNewLevel, char const *pLandmarkName, bool background ) = 0;

Пользовательская часть вызывает их из любого места, движок сохраняет две или три переменных - имякарты\сейва, имя ландмарка, флаг бэкграунда, далее, в начале кадра, вызываются соответственно четыре экспорта из самой дллки.

C++ Source Code:
1
virtual bool SpawnServer( const char *mapname ) = 0;
2
virtual void ExecuteLoadLevel( const char *mapname ) = 0;
3
virtual void ExecuteLoadGame( const char *mapname ) = 0;
4
virtual void ExecuteChangeLevel( bool loadfromsavedgame, const char *mapname, const char *startspot ) = 0;

SpawnServer - это загрузка новой карты, в движке никакие пути не проверяются, что ты там собрался грузить движок не волнует абсолютно, хоть шрифт вместо уровня загрузи, если ты 2д игру делаешь с тайтлами.
Движок в ворлдмодель не лезет и ничего про нее не знает. Единственно что - он пытается у этой модели найти PVS и что-нибудь по нему отсечь, но если не находит, тоже не расстраивается.
Потом, соответственно, если SpawnServer вернул true вызывается одна из трёх функций ниже. Опять таки - движок в эти переменные не смотрит, кроме бэкграунда конечно. То есть вполне возможно реализовать такой абстрактный механизм, когда игра полностью контролируется из пользовательской части.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192176

Старое сообщение 14-04-2020 07:44
-
Flash
Житель форума

Группа: Опытный
Дата регистрации: Jul 2006
Проживает: Украина, Кривой Рог
Сообщений: 688

Рейтинг



Награды
 
[1 награда]


Может и не туда пишу, но поиск по форуму не пашет, поэтому спрошу здесь.
Кто редактировал XashMod_v062_JH1.fgd?
Подключил этот фгд, пропало несколько фгд, оказалось зачем-то снесли переменную targetx, а сам этот таргет так и остался в энтитях, плюс по-моему зачем-то триггер автосейва был продублирован (или это в другой версии фгд ксаша было...).

__________________
Tiger! Tiger! burning bright
In the forests of the night,
What immortal hand or eye
Could frame thy fearful symmetry?

Сообщить модератору | | IP: Записан
Сообщение: 192178

Старое сообщение 14-04-2020 10:22
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Flash создай тему в ветке ксаш-мода по обсуждению FGD. Потому что постоянно по нему вопросы.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192180

Старое сообщение 14-04-2020 13:16
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Так товарищи. По скриншотам вот какие у меня соображения назрели. На данный момент, как вы знаете есть два основных типа скриншотов.
команды scrshot и snapshot. Первая сохраняет скрины в папку мода\scrshots
Вторая - в корень игры. Я поймал себя на мысли, что первой командой за много лет не пользовался вообще никогда, она просто не нужна.
А у второй есть существенный недостаток - поскольку она работает через стандартную систему экзекции буффера, невозможно сделать скриншот в меню, а в консоли приходится вручную вбивать команду. Всё это дико неудобно. Поэтому я решил сделать так: повесить действие команды snapshot на кнопку Print Screen. А для эмуляции привычного функционала - писать его в буффер при зажатом альте. Думаю это будет наилучшим решением.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192227

Старое сообщение 15-04-2020 08:44
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Дядя Миша
Зопили скриншоты в jpg/png.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 192236

Старое сообщение 15-04-2020 10:40
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Лаг будет на таком скриншоте. Да и не хочется тащить джипегу только ради сейва скриншотов. Ну посмотрим, может STB возьму.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192249

Старое сообщение 15-04-2020 13:59
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Дядя Миша
>Лаг будет на таком скриншоте.
Перекодировку/запись в отдельный тред?

>STB
Ух какая интересная штука. Спасибо за наводку.

__________________
http://www.moddb.com/mods/monorail-quest

Отредактировано thambs 15-04-2020 в 14:15

Сообщить модератору | | IP: Записан
Сообщение: 192253

Старое сообщение 15-04-2020 14:13
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
thambs писал:
Ух какая интересная штука.

Тю, я думал все давно уже знают.

В тред призывается Психопат, вот какая интересная мысль мне пришла в голову. У Кармака в третьем дууме есть волшебные функции BitsToFloat и FloatToBits. Они позволяют изготовить переменную с плавающей точкой для любого кол-ва бит. Ну ладно, ладно, не для любого. Минимум 4 бита надо.

Преимущества такого подхода очевидны - плавающая арифметика всегда имеет большую точность, нежели фиксированная точка. У него там эта штука использовалась для отправки флоатов по сети, практически без потерь. Но вот что я думаю. BestFitNormals при помощи таблички, по сути занимается подбором оптимального множителя для FixedPoint. Т.е. множителя, на котором потеря дробной части будет минимальна для выбранного значения. Преимущество подхода очевидно - для декодирования достаточно вызвать normalize. Минус в том, что это работает только для вектора и то что надо таскать с собой эту табличку. А что если эти самые флоаты сохранить в плавающую точку величиной с байт?
Взять скажем 2 бита для мантиссы и 5 бит для экспоненты (один бит на знак уйдет). И посмотреть насколько будет гулять точность, в сравнении с тем же BFN.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192259

Старое сообщение 15-04-2020 14:38
-
ncuxonaT
каков стол, таков и стул

Группа: Опытный
Дата регистрации: Oct 2009
Проживает: город/село/деревня
Сообщений: 1626
Возраст: 33

Рейтинг



Цитата:
Дядя Миша писал:
плавающая арифметика всегда имеет большую точность, нежели фиксированная точка.

Это не правда.

Какие ты видишь сценарии использования самодельных флоатов? Мне не приходит в голову ни одного варианта применения 2битной мантиссы.

Сообщить модератору | | IP: Записан
Сообщение: 192263

Старое сообщение 15-04-2020 15:10
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
ncuxonaT писал:
Это не правда.

здрасти-приехали. На кой же тогда чёрт изобретали плавающую точку, если фиксированная лучше?

Цитата:
ncuxonaT писал:
Какие ты видишь сценарии использования самодельных флоатов?

ну вот нормали сохранить. Те же три байта, но точность должна быть выше, чем с BFN. Правда и распаковка - сложнее.

Добавлено 15-04-2020 в 18:59:

Собсно наилучший пример того, насколько губительно использование фиксированной точки отражается на точности мы все с вами долгие годы наблюдаем на халфовских модельках, у которых постоянно едут текстурные координаты. Я сперва рассудил, что раз координаты там всё равно никогда не выходят за пределы 0-1, то надо просто выбрать максимальный множитель для увеличения точности. Ну и взял 32768. Так вот - это нихрена не помогло по сути. Как оно съезжало, так и продолжило съезжать. Тогда я подумал, есть же халф-флоаты, попробую их. И да - с ними исчезли практически все проблемы. Ну кроме конечно тех случаев, когда моделлёр нарочно двигает текстуру неправильно, пытаясь компенсировать потерю точности, типо после округления, оно съедет обратно.
Фиксированная арифметика это полное днище, её вообще нельзя никак использовать. Ну разве что для квантизации пространства, да и то...

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 192267

Старое сообщение 15-04-2020 15:59
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 20:50. Новая тема    Ответить
Страницы (241): « Первая ... « 82 83 84 85 [86] 87 88 89 90 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashNT: блог разработчика
Часть I
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024