制作一个包装器DLL让游戏制作者处理C ++标准库

时间:2011-03-09 13:09:43

标签: c++ types iterator game-maker

Gamemaker是一个很好的工具,可以提供一些优秀的RAD。但是它有很多缺点。其中之一就是缺乏一个好的标准库 是的,你有“ds_ *”类型的成员,但那些是非常缺乏的。例如,优先级队列只是一次性读取类型(它在进程中被销毁)。列表的排序功能使用了一种可怕的慢速方法。 (虽然从未正式声明,但我怀疑它使用冒泡排序)。根本没有构建链表的方法。除此之外,简单的成员访问速度比它应该更慢。

现在可以用母语创建这些东西。然而它变得非常慢(因为解释器很慢)。即写一个quicksort / heapsort在许多情况下比内置排序慢。编写我自己的“链表” - 使用每个节点的特殊对象 - 有太多的开销。 (游戏制作者中的每个对象每一步都会做很多事情。)

所以现在我正在为标准库编写C ++层。我希望添加一些额外的功能(哈希表和链表是主要目标),并允许更好的算法。对于大多数问题,我已经知道如何解决它,除了一个大问题:

所有C ++库都使用“迭代器”来标识项目。 Gamemaker只允许将双打(或c风格的字符数组)传递给dll 我该怎样绕过这个?不返回项目的索引是非常愚蠢的,所以我必须找到一种方法将这些迭代器映射到双精度。

这有什么好主意?我最好只是重写所有数据结构,以便迭代器保证1对1的地图加倍(或实际加倍+数据结构索引)?或者有更好的方法吗?

P.S。为什么不是那里的游戏制作者标签?

1 个答案:

答案 0 :(得分:2)

在Game Maker中将数据结构“存储”在变量中的唯一方法是使用句柄或ID。你会注意到使用内置数据结构使用整数做同样的事情。

我尝试的方法是将所有指向数据结构的指针及其ID存储在哈希表中。然后,您在GM和DLL之间传递ID,因为除非您要求,否则Game Maker不需要知道数据结构的状态。