GM 中导入 C++ dll 文件有两种方式
使用 Extensions (推荐)
使用 external_define 定义C++函数签名,之后用 external_call 调用本地方法
坑
GM 支持的外部函数参数及返回类型支持 string 和 double 两种
新版 GM 不支持 32 位的 dll,必须使用 64 位
想让GM成功调用 dll,必须要安装 dll 的运行依赖 例如 C++ Redistributable,此类运行依赖库可以在steam第一次启动游戏的时候自动安装。
当函数返回 double 的时候在GM里使用 string_format 来获得一定精度的字符串,用于输出调试
dll中需要外部程序调用的函数必须要导出(export)
在C++ 使用 extern "C" __declspec(dllexport)
作为函数前缀来告诉编译器此函数需要被导出,下方例子
extern "C" __declspec(dllexport) double test(double a, double b)
{
double res = a * b;
int value = (int)(res * 100 + .5);
double rounded = (double)value / 100;
return rounded;
}
使用DLL最主要的目的是提高性能,下方例子
// C++
float start = 10001.01;
float inc = 0.1;
std::vector<float> v;
for (size_t i = 0; i < 1000000; i++)
{
v.push_back(noise1(start));
start += inc;
}
// 用时: 13.41 ms
// GML
var start = 10001.01;
var inc = .1;
var v = array_create(1000000)
for (var i = 0; i < 1000000; i++) {
// calling noise1 from dll
v[i] = noise1(start);
start += inc;
}
// 用时: 178.05 ms 从GM中调用 dll 函数
// 用时: 9975.96 ms 调用GML中的原生函数