graphics.gd:Go 语言的跨平台 2D/3D 图形运行时

graphics.gd:Go 语言的跨平台 2D/3D 图形运行时

graphics.gd:Go 语言的跨平台 2D/3D 图形运行时

Go Logo Godot Engine Logo

graphics.gd 是一个专为 Go 语言设计的跨平台 2D/3D 图形运行时,它基于 Godot Engine 和 GDExtension 构建,适用于开发原生移动应用、游戏、多媒体应用等多种场景。与传统的 Godot 脚本语言(如 GDScript)不同,graphics.gd 提供了类型安全的 API,使开发者能够使用 Go 的强大功能来构建高性能的图形应用程序。

原理与架构

graphics.gd 架构层次

应用层 (Go 代码)
graphics.gd 层 (Go 包装器)
GDExtension 层 (C 接口)
Godot Engine 层 (C++ 核心)

graphics.gd 的设计思想是将 Godot Engine 的强大功能与 Go 语言的简洁性、高效性和类型安全性相结合。它不仅仅是一个简单的 GDExtension 包装器,而是经过精心设计的工具包,为 Go 开发者提供了在 Godot 生态系统中的无缝体验。

在架构设计上,graphics.gd 采用了分层结构:

  • 应用层:开发者使用 Go 语言编写的应用程序代码,通过 graphics.gd 提供的 API 与 Godot Engine 交互。
  • graphics.gd 层:提供 Go 语言的 API 包装器,将 Godot 的功能暴露给 Go 开发者,同时保持类型安全和 Go 的编程习惯。
  • GDExtension 层:作为 Godot Engine 和 graphics.gd 之间的桥梁,提供了 C 语言接口,使得 Go 代码能够调用 Godot 的核心功能。
  • Godot Engine 层:提供底层的 2D/3D 渲染、物理模拟、音频处理等核心功能。

graphics.gd 的设计理念是让 Go 开发者能够充分利用 Godot Engine 的功能,同时保持 Go 语言的类型安全性和高性能。通过精心设计的 API,graphics.gd 将 Godot 的面向对象模型转换为 Go 的接口和结构体,使得 Go 开发者能够以自然的方式使用 Godot 的功能。

核心特性

code用 Go 编写着色器

graphics.gd 允许开发者使用熟悉的 Go 语法来编写复杂的图形逻辑,而不需要学习传统的着色器语言。这使得着色器开发更加直观和易于维护。

security类型安全优先

与 GDScript 不同,graphics.gd 中的 RIDs、Callables 和字典参数都是强类型的,这有助于在编译时捕获错误,而不是在运行时才发现问题。

speed性能导向

graphics.gd 在设计上平衡了性能和便利性,通过最小化频繁调用函数的内存分配,确保应用程序能够高效运行。

autorenew快速迭代

首次构建后,重新编译的速度非常快,提供了类似于脚本语言的开发体验,使开发者能够快速迭代和测试他们的想法。

devices跨平台支持

可以从任何开发平台交叉编译到 Windows、Linux、macOS、Android、iOS 和 Web,极大地简化了多平台开发流程。

package纯 Go 包

提供了通用的 “variant” 包,可以在游戏开发之外的任何 Go 项目中重用,增加了代码的可复用性。

使用示例

下面是一个简单的 Hello World 示例,展示了如何使用 graphics.gd 创建一个基本的图形应用程序:

go
// 这个文件是你开始一个项目所需的全部内容
// 将它保存在某处,安装 `gd` 命令并使用 `gd run` 开始
package main

import (
    "graphics.gd/startup"
    "graphics.gd/classdb/Control"
    "graphics.gd/classdb/GUI"
    "graphics.gd/classdb/Label"
    "graphics.gd/classdb/SceneTree"
)

func main() {
    startup.LoadingScene() // 设置 SceneTree 并等待直到我们可以访问引擎功能
    hello := Label.New()
    hello.AsControl().SetAnchorsPreset(Control.PresetFullRect) // 扩展标签以占据整个屏幕
    hello.SetHorizontalAlignment(GUI.HorizontalAlignmentCenter)
    hello.SetVerticalAlignment(GUI.VerticalAlignmentCenter)
    hello.SetText("Hello, World!")
    SceneTree.Add(hello)
    startup.Scene() // 启动场景并阻塞直到引擎关闭
}

graphics.gd 的 API 设计遵循 Go 的命名约定,将 Godot 的下划线命名法转换为 PascalCase。例如,Godot 中的 set_text 方法在 graphics.gd 中变为 SetText。这使得 Go 开发者能够以更自然的方式使用 API。

每个引擎类都在 classdb 下作为一个包提供。要导入 Node 类,可以导入 “graphics.gd/classdb/Node”。graphics.gd 中没有继承,所以要访问”超”类,需要在扩展类上调用 AsClassName()。所有引擎类都有方法可以转换到它们扩展的任何类,例如 AsObject()AsNode2D()

性能特点

graphics.gd 从设计之初就注重性能,通过多种策略确保应用程序能够高效运行:

  • memory零分配方法调用:使用 Advanced 实例时,Go 到引擎的方法调用实际上不分配内存,这使得频繁调用的函数能够保持高性能。
  • sync虚拟方法重写:Ready、Process 和其他虚拟方法完全避免内存分配,减少了垃圾收集的压力。
  • autorenew基于帧的内存管理:自动垃圾收集确保内存安全,无需手动管理,同时优化了内存使用模式。
  • settings细粒度控制:Advanced 实例为每个类提供更精细的内存分配控制,使开发者能够根据需要优化性能。

为了获得最佳性能,graphics.gd 推荐以下实践:

  • 尽可能使用引擎类型,而不是自定义类型
  • 在热路径中避免堆内存分配
  • 对于精细控制,优先使用 Advanced 方法
  • 使用服务器和系统而不是大量对象

平台支持

graphics.gd 支持多种主流平台,使开发者能够轻松地将应用程序部署到不同的设备和操作系统:

computer

Windows

稳定支持

desktop_linux

Linux

稳定支持

laptop_mac

macOS

稳定支持

android

Android

稳定支持

phone_iphone

iiOS

稳定支持

language

Web

稳定支持

平台限制:

  • 仅支持 64 位系统(arm64、amd64 和 wasm)
  • 目前不支持 PlayStation/Xbox/Switch 游戏主机(未来可能通过 WASI、wasm2c 或 hitsumabushi 实现)

社区与贡献

graphics.gd 是一个开源项目,欢迎社区参与和贡献。无论你是报告问题、提交代码、编写文档还是分享使用经验,你的贡献都将帮助 graphics.gd 变得更好。

参与社区的最佳方式是尝试使用 graphics.gd,并告诉我们什么有效,什么无效。任何你能贡献的示例都是受欢迎的。

如果你喜欢寻找内存安全问题,我们非常欢迎你的帮助。graphics.gd 还需要更多的测试来确保一切正常工作,你能为 graphics.gd 提供稳定性的最好方式是贡献测试,覆盖你需要的任何功能!

发表评论

Only people in my network can comment.
人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾 智柴论坛 🐾