![]() |
Страницы (255): « Первая ... « 82 83 84 85 [86] 87 88 89 90 » ... Последняя » Показать все 3825 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- XashNT: блог разработчика (https://hlfx.ru/forum/showthread.php?threadid=5297)
Папка мода уже закодирована в пути к карте. Кстати NT умеет так загружаться.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Про интерфейсы взаимодействия немного расскажу. В халфе это была основная головная боль, потому что между пользовательской дллкой и движком формировался-набирался некий уникальный интерфейс, и вот что в нём было - то и доступно пользователю. А если тот, кто формировал этот интерфейс о чём-то забывал, то всё, жопа. Или бывало так, что в интерфейс всё-таки добавлялись недостающие функции приходилось мучительно проверять их наличие по версиям, размеру апи и прочей глупости. Это дико неудобно, не говоря уже о том, что для каждой новой библиотеки надо было набивать этот интерфейс заново. Я отказался от этой порочной практики и ввёл таблицу интерфейсов. Таблицы поименованные, в имени дополнительно содержится и номер версии интерфейса. Таким образом для каждой новой пользовательской библиотеки одновременно доступен весь набор функций, достаточно просто её позвать. В обратную сторону это тоже работает, но как правило от пользовательской библиотеки достаточно одной-единственной таблицы экспорта. Но можно сделать и несколько.
То есть, все движковые функции, доступные на клиенте, будут доступны и на сервере и в меню тоже. Ну а если понадобится расширить какой-то интерфейс без потери бинарной совместимости, то от базового достаточно объявить наследный класс, добавить в него недостающие функции и дать ему новое имя в табличке. И всё, совместимость не теряется ни при каких обстоятельствах. Ну а если всё же случится беда, будет виндовая ошибка 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'
Дядя Миша
А в сорсе видел как сделано? Там каждой подсистеме при инициализации передается функция, возвращающая интерфейсы по имени. Таким образом подсистему вообще не волнует, где и как интерфейс реализован - она лишь проверяет его наличие. И еще каждая дллка экспортит такую функцию - она возвращает интерфейсы реализованные в этой дллке.
Забавно, у меня тут недавно возникла аналогичная проблема. Вообще, я стараюсь избегать использования длл - модульность на бинарном уровне как правило бывает не нужна, но тут мне понадобилась отдельная длл.
Поскольку экзешник и длл собираются отдельно, нужно было обеспечить какую-то систему версионирования. Требований к системе у меня было только два:
1. Система должна понимать, что существуют обратно совместимые интерфейсы - если в интерфейс добавилась новая функция, то старый клиент все еще может использовать новый интерфейс также как он использовал старый.
2. Система должна быть удобной для использования во время активной разработки, когда в интерфейс постоянно добавляются новые функции, а старые иногда меняются или удаляются.
Вариантов у меня было два: абстрактные классы (они же "интерфейсы") и структуры с указателями на функции - как в хл.
Соответствие абстрактных классов п.1 для меня так и осталось загадкой. В теории они ему не соответствуют - конпилятор имеет право расположить указатели в vtable так как ему удобно. А вот как обстоит дело на практике я так и не понял. Вроде как MSVC распологает их в порядке объявления и вроде как я даже где-то когда-то видел код который этот факт использовал. Но тут встает другая проблема - клиент как-то должен узнать, что поддерживаются обе версии интерфейса. Сорс (см. пред. ссылку) для этого предлагает экспозить интерфейс два раза. Для сорса это не проблема - движок уже достаточно взрослый и интерфейсы в нем меняются нечасто. Но в развивающемся коде это приведет к тому, что этих версий придется поддерживать целый список, а это противоречит п.2.
В итоге я остановился на структурах с указателями. Порядок работы следующий:
1. Новые функции добавляются в конец структуры - больше ничего делать не нужно.
2. При поломке совместимости версия увеличивается на 1.
Запрашивая интерфейс, клиент передает номер версии и размер своей структуры. Если номер версии отличается, значит интерфейс не совместим - возвращаем false. Далее, если размер интерфейса на клиенте больше, значит у клиента более новая версия - возвращаем false. Если все в порядке - копируем столько байт структуры сколько запросил клиент (у него может быть более старая версия).
Еще в моей реализации клиент вызывает все интерфейсные функции через врапперы, имя которых соответствует именам функций, реализованных в длл. Это позволило реализовать статическую сборку, при которой вместо длл используется либ и никаких интерфейсов вообще не используется - все вызовы осуществляются напрямую.
Статическую сборку я использую для финального билда.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
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; |
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; |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Может и не туда пишу, но поиск по форуму не пашет, поэтому спрошу здесь.
Кто редактировал 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?
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'
Так товарищи. По скриншотам вот какие у меня соображения назрели. На данный момент, как вы знаете есть два основных типа скриншотов.
команды 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'
Дядя Миша
Зопили скриншоты в jpg/png.
__________________
http://www.moddb.com/mods/monorail-quest
Лаг будет на таком скриншоте. Да и не хочется тащить джипегу только ради сейва скриншотов. Ну посмотрим, может STB возьму.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Дядя Миша
>Лаг будет на таком скриншоте.
Перекодировку/запись в отдельный тред?
>STB
Ух какая интересная штука. Спасибо за наводку.
__________________
http://www.moddb.com/mods/monorail-quest
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Временная зона GMT. Текущее время 15:51. | Страницы (255): « Первая ... « 82 83 84 85 [86] 87 88 89 90 » ... Последняя » Показать все 3825 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024