Войти
ПрограммированиеФорумОбщее

Об архитектуре

Advanced: Тема повышенной сложности или важная.

#0
12:23, 12 янв. 2012

Здравствуйте!

Что можно почитать об архитектуре программного обеспечения, в частности об плагинной архитектуре? Ежели очень грубо говорить, хочу сделать так, чтобы к моей игре (c++/python/swig, linux) можно было писать ботов, не перекомпилируя саму игру. И чтобы одновременно можно было загружать сразу нескольких ботов. А в идеале - чтобы из питона можно было бы залезать в кишки каждому боту (сиречь чтобы в питон можно было бы проводить не только стандартный интерфейс, но и детали реализации конкретного бота).

Заранее благодарен.


#1
13:34, 12 янв. 2012

Я не спец. Но как устроены скрипты?  Скриптовые функции это указатели на функции написанные на с++.  Просто добавь все функции из движка в скрипт.  И всё.  Твой двиг будет полностью управляем из скрипта.

#2
0:44, 14 янв. 2012

Двиг и так управляем. Надо, чтобы и все боты были управляемы. Да, совсем забыл - надо, чтобы они связывались чисто в С++, ибо производительность важна.

#3
1:49, 14 янв. 2012

У меня есть проектик, в котором скрипт бота компилируется в динамическую библиотеку, которая линкуется во время выполнения.
Прилинкованной библиотеке доступны данные самой программы. Для этого в основной программе есть интерфейсные функции, которые вызывает бот, чтобы понять состояние мира.
Каждый такт основная программа вызывает в библиотеке функцию do, в которой бот и думает.

(на самом деле, все немного сложнее, но это в общих чертах)

#4
2:05, 14 янв. 2012

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

#5
2:12, 14 янв. 2012

> хорошую литературу
Я читал только man dlopen.

#6
18:45, 18 янв. 2012

Вот сделал приблизительно так. http://stackoverflow.com/questions/496664/c-dynamic-shared-library-on-linux Только вот там говорится о наследовании, а у меня отнаследоваться не получилось. Как это правильно сделать? То бишь чтобы классы из разных библиотек загружались бы одинаковым способом, но можно было бы обращаться к классоспецифичным полям. Пока что сделал так, что имя класса одинаковое и интерфейс тоже, а внутренности разные.

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

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

#7
9:23, 19 янв. 2012

можешь создать интерфейсы всех вариантов плагинов, используемых в системе, используя метод идентификации кастовать в нужный тип.

class MyClass
{
...
 virtual MyClassSubTypes GetType()=0;
}

class BlaBlaSubClass: public MyClass
{
...
 virtual MyClassSubTypes GetType(){return MCST_BLA_BLA_SUB_CLASS;};
 virtual void BlaBlaMethod();
}

class FooSubClass: public MyClass
{
...
 virtual MyClassSubTypes GetType(){return MCST_FOO_SUB_CLASS;};
 virtual void FooMethod(Params params);
}

...

if (myclass->GetType() == MCST_BLA_BLA_SUB_CLASS)
 BlaBlaSubClass* bla = static_cast<BlaBlaSubClass*>(myclass);
bla->BlaBlaMethod();
if (myclass->GetType() == MCST_FOO_SUB_CLASS)
 FooSubClass* foo= static_cast<FooSubClass*>(myclass);
foo->FooMethod(params);

#8
10:08, 19 янв. 2012

А зачем нужно писатьботов, не перекомпилируя игру? Я когда-то тоже такое делал (С++, отдельно подключалась .dll), но потом оказалось что в этом нет смысла, и только замедляется отладка.

#9
10:31, 19 янв. 2012

TorpedO.vrn
> А зачем нужно писатьботов, не перекомпилируя игру

При отладке никаких проблем не возникало, наоборот, при пере-сборке модуля тратится меньше времени.

#10
12:03, 19 янв. 2012

sildc
> можешь создать интерфейсы всех вариантов плагинов, используемых в системе,
> используя метод идентификации кастовать в нужный тип.

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

TorpedO.vrn
> А зачем нужно писатьботов, не перекомпилируя игру?

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

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

#11
13:01, 19 янв. 2012

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

Ядро является связующим элементом, модули загружаются ядром, ядро знает о модулях, но не знает о содержимом этих модулей.
Модули через ядро имеют доступ к иным модулям (например, по id или именам). Если заданный модуль работает с модулем определенного типа, то в заданном модуле подключается заголовок интерфейса того типа модуля, с которым он работает.

#12
14:29, 19 янв. 2012

Adler
Сделай модуль менеджмента и управляй через него.

ПрограммированиеФорумОбщее

Тема в архиве.