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秒

相关推荐
傻欣8 小时前
第五天 开始Unity Shader的学习之旅之Unity中的基础光照之漫反射光照模型
学习·unity·游戏引擎
虾球xz14 小时前
游戏引擎学习第183天
c++·学习·游戏引擎
心之所向,自强不息21 小时前
【Unity Shader编程】之透明物体渲染
unity·游戏引擎·shader
大模型铲屎官2 天前
如何用C#继承提升游戏开发效率?Enemy与Boss案例解析
开发语言·unity·c#·游戏引擎·游戏开发·boss·enemy
贪小心2 天前
Unity 使用 Protobuf(Pb2)二进制数据全流程工具详解
unity·游戏引擎
GFCGUO2 天前
虚幻引擎设置复杂碰撞体
游戏引擎·虚幻
Yuze_Neko2 天前
【Unity】合批处理和GPU实例化的底层优化原理(完)
unity·游戏引擎
Clank的游戏栈3 天前
Unity开放世界实时GI分块烘焙策略技术详解
unity·游戏引擎
tobybo3 天前
[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
unity·游戏引擎
托塔13 天前
Unity跨平台构建快速回顾
unity·游戏引擎