以terrain3d插件,Godot_v4.3 为例:
下载下来,先用scons编译一遍通过后,整个占用1GB,obj文件都生成在源码旁边,够乱。
scons 是跨平台的构建工具,但是需要需要写python脚本。流程比较莫名其妙,编译速度也慢,全量编译后,再次读取配置都需要8秒。
其实c++项目编译起来从来就不慢,慢是因为项目大,增量编译应该很快的。
godot插件代码很散装。godot_cpp目录是共用库,其中gen目录下的源码由python 脚本 Godot-cpp/binding_generator.py
生 成,不知道怎么生成的(为了跨平台),代码很多(13MB)。旁边src目录下面也有一小堆源码(0.5MB)。这是godot_cpp模块,所有插件应该是一样的。
cpp
/* THIS FILE IS GENERATED DO NOT EDIT */
然后有不止一个 include/godot_cpp 目录,简直了。terrain3d默认项目采用scons编译,但是是用visual studio驱动的,然而这里 visual 打了折扣,需要手动查看 vcxproj 项目文件,然后godot_cpp里的python脚本,结合才能理解具体编译过程。
godot_cpp tools py脚本根据平台环境,配置使用msvc或者mingw编译:godot-cpp/tools/windows.py
其中三行 env.append 语句。第一句定义预编译定义。第二句 cpp 编译选项,指定字符集。第三句链接选项,将警告视为错误。都可在 visual studio 的项目设置界面找到对应的开关。
最终 visual studio 项目配置如下:
三堆源码。common 对应 godot_cpp 里的 gen 和 src,vs立新建filter后,将文件夹拖对应filter即可。
记得配置生成目标类型(dll or lib),c++语言标准选 c++ 17:
下面也一样,是terrain3d插件的业务逻辑,代码其实不多:
设置好预定义,包含路径,就能编译插件本体。
预定义:WINDOWS_ENABLED;TYPED_METHOD_BIND;NOMINMAX;NDEBUG;_CONSOLE;
头文件包含路径:R:\cache\Terrain3D\src;R:\cache\Terrain3D\godot-cpp\gdextension;R:\cache\Terrain3D\godot-cpp\gen\include;R:\cache\Terrain3D\godot-cpp\include;%(AdditionalIncludeDirectories)
可以链接scons编译的godot_cpp静态库,需要静态链接(MT方式)。
也可以自行编译 godot_common,然后随便怎么链接。
- 记得关闭编译大量的类型转换warning。#pragma warning(disable:4244) 或者属性 -> c++ -> 高级 ->
并开启多线程编译。加快编译速度。
编译速度:godot_common :半小时
编译速度:terrain3d 全量30秒。
全量编译太慢。难道是大量hpp文件拖慢了编译速度?而且大小也不一样。obj大了几倍,一百行的cpp文件竟然生成几MB的.obj!
调查一番发现:
- godot_common项目忘记开启多线程/MP。
- c++选项 /Zc:inline可显著降低obj大小,参考 /Zc:inline (Remove unreferenced COMDAT) | Microsoft Learn
追加 Zc:inline 选项,大小终于和 scons 编译的一致。编译速度也加快了不少。
最终 编译速度:
godot_common :11分钟
terrain3d 全量30秒。增量5~6秒