godot是一个开源引擎,除了做游戏,也可以做一些应用,本次探究在仪表hmi上一些使用技术。
1. 集成c++
godot GDExtension插件-实现c++接口


2. 状态机
godot没有kanzi那么好用的状态机组件
2.1 用脚本实现
简单的说就是一个节点下建立多个子节点,每个子节点代表一个状态,纯脚本实现状态迁移
2.2 封装状态机
封装原理,借助godot独有的资源+脚本方案,可视化配置状态属性

3. gd动态加载pck

运行时挂载只做一件事:把 pck 的文件索引塞进 PackedData,之后 res:// 就能按路径读到里面的资源。
project settings / autoload / 输入映射 / 语言翻译都不会生效,需要你在脚本里自己处理
4. 修改引擎支持多窗口
- win上只需要关闭项目设置-嵌入式子窗口,就可以实现多窗口
- linux weston上需要修改引擎源码,然后就可以在脚本里面使用
win.ivi_surface_id = xxxx
一个进程 / 一个 SceneTree
一个 RenderingServer、一个 EGLContext、一条 Wayland 连接
│
├─ 主窗口 Window ── 自己的 Viewport RID + 自己的渲染目标 ── wl_surface + EGLSurface ── IVI xxxx
│ └─ 场景内容(各自独立的 Viewport 树)
│
└─ 副窗口 Window ── 自己的 Viewport RID + 自己的渲染目标 ── wl_surface + EGLSurface ── IVI xxxx
└─ 场景内容(各自独立的 Viewport 树)
共享的是进程、SceneTree、RenderingServer、GL 上下文、Wayland 连接;
不共享的是渲染树、渲染目标、surface。
5. 同一场景,多屏显示
SubViewport实现了渲染一次,多窗口共用同一份渲染结果
在4基础上
win.get_node("TextureRect").texture =$SubViewport.get_texture()