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秒

相关推荐
DoomGT1 小时前
Physics Simulation - UE中Projectile相关事项
ue5·游戏引擎·虚幻·虚幻引擎·unreal engine
污领巾6 小时前
虚幻GAS底层原理解剖一(开篇)
游戏引擎·虚幻
污领巾6 小时前
虚幻GAS底层原理解剖三 (GA)
java·游戏引擎·虚幻
伽蓝_游戏11 小时前
Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(7)
游戏·ui·unity·架构·c#·游戏引擎·.net
BuHuaX1 天前
Unity_数据持久化_IXmlSerializable接口
xml·unity·c#·游戏引擎·游戏策划
lihongli0001 天前
消息系统技术文档
网络·unity·游戏引擎
Edision_li1 天前
基于Mediapipe_Unity_Plugin实现手势识别
unity·游戏引擎·unity 手势识别
与火星的孩子对话1 天前
Unity Shader编程完全入门指南:从零到实战 C# 实战案例
unity·c#·游戏引擎
深海潜水员2 天前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
伽蓝_游戏2 天前
Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)
游戏·ui·unity·架构·c#·游戏引擎·.net