GODOT 4 不用scons编译cpp扩展的方法

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!

调查一番发现:

  1. godot_common项目忘记开启多线程/MP。
  2. c++选项 /Zc:inline可显著降低obj大小,参考 /Zc:inline (Remove unreferenced COMDAT) | Microsoft Learn

追加 Zc:inline 选项,大小终于和 scons 编译的一致。编译速度也加快了不少。

最终 编译速度:

godot_common :11分钟

terrain3d 全量30秒。增量5~6秒

相关推荐
fqbqrr2 小时前
2606d,用d语言构建游戏引擎
游戏引擎·d
TO_ZRG15 小时前
Unity 证书校验
unity·游戏引擎
mxwin16 小时前
Unity Shader 切线空间数据是如何计算出来的
unity·游戏引擎·shader
mxwin20 小时前
Unity Shader 法线贴图跟切线空间有什么关系
unity·游戏引擎·贴图·shader
mxwin20 小时前
Unity Shader 贴图和采样的关系 如何保证贴图清晰
unity·游戏引擎·贴图·shader
心前阳光1 天前
Unity之使用火山引擎实现文字提问流式回复
unity·游戏引擎·火山引擎
mxwin1 天前
Unity Shader 什么是球谐光照 原理是什么
unity·游戏引擎·shader
心前阳光1 天前
Unity之使用火山引擎实现流式语音合成
unity·游戏引擎·火山引擎
心前阳光1 天前
Unity之音频剪辑提问,流式语音回复使用示例
unity·游戏引擎·音视频