Создание dll-оболочки, позволяющей Gamemaker обрабатывать стандартные библиотеки C++.

Gamemaker — это аккуратный инструмент, который позволяет получить хороший RAD. Однако у него довольно много недостатков. Одним из них является отсутствие хорошей стандартной библиотеки.
Да, у вас есть члены типа "ds_*", но их явно не хватает. Например, приоритетная очередь имеет тип только для однократного чтения (в процессе она уничтожается). Функция сортировки списков использует ужасно медленный метод. (Хотя официально это не заявлено, я подозреваю, что он использует пузырьковую сортировку). И просто нет встроенного метода для связанных списков. Вдобавок к этому простой доступ к членам медленнее, чем должен быть.

Теперь можно было создавать эти вещи на родном языке. Однако это становится довольно медленным (поскольку интерпретатор медленный). т.е. написание быстрой/кучной сортировки во многих случаях было медленнее, чем встроенная сортировка. Написание моих собственных «связанных списков» с использованием специальных объектов для каждого узла требовало слишком больших накладных расходов. (каждый объект в Gamemaker делает множество вещей на каждом этапе).

Итак, теперь я собираюсь написать слой C++ для стандартной библиотеки. Я надеюсь добавить дополнительную функциональность (основной целью являются хеш-таблицы и связанные списки), а также улучшить алгоритмы. Для большинства проблем у меня уже есть идея, как с этим справиться, за исключением 1 большой проблемы:

Все библиотеки C++ используют "итераторы" для идентификации элемента. Gamemaker позволяет передавать только двойные числа (или массивы символов в стиле C) в dll и из них.
Как мне обойти это? Не возвращать индекс элемента довольно глупо, поэтому мне нужно найти способ сопоставить эти итераторы с двойными значениями.

Что является хорошей идеей для этого? Лучше ли мне просто переписать все структуры данных, чтобы итераторы гарантированно имели карту 1 на 1 для двойного (или фактически двойного + индекса структуры данных)? Или есть лучшие методы?

P.S. почему до сих пор нет тега Gamemaker?


person paul23    schedule 09.03.2011    source источник


Ответы (1)


Единственный способ «сохранить» структуру данных в переменной в Game Maker — использовать дескриптор или идентификатор. Вы заметите, что использование встроенных структур данных делает то же самое, используя целые числа.

Я бы попробовал сохранить все указатели на ваши структуры данных вместе с их идентификаторами в хеш-таблице. Затем вы передаете идентификатор между GM и DLL, так как Game Maker не нужно знать состояние структуры данных, если вы не запросите его.

person jmegaffin    schedule 27.02.2012