Создание оболочки dll, позволяющей Gamemaker обрабатывать стандартные библиотеки C ++ - PullRequest
2 голосов
/ 09 марта 2011

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

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

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

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

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

P.s. почему там еще нет тега gamemaker?

1 Ответ

2 голосов
/ 28 февраля 2012

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

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

...