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秒

相关推荐
Leoysq8 小时前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
PandaQue10 小时前
《潜行者2切尔诺贝利之心》游戏引擎介绍
游戏引擎
_oP_i12 小时前
unity中 骨骼、纹理和材质关系
unity·游戏引擎·材质
Padid1 天前
Unity SRP学习笔记(二)
笔记·学习·unity·游戏引擎·图形渲染·着色器
dangoxiba1 天前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule
游戏·unity·c#·游戏引擎·playmaker
无敌最俊朗@1 天前
unity3d————屏幕坐标,GUI坐标,世界坐标的基础注意点
开发语言·学习·unity·c#·游戏引擎
异次元的归来1 天前
UE5相机系统初探(一)
ue5·游戏引擎·camera
司军礼2 天前
Unity自动打包——Shell交互
unity·游戏引擎·交互
无敌最俊朗@2 天前
unity3d————球形插值知识点
开发语言·学习·unity·c#·游戏引擎