Golang ECS框架Arche v0.11发布——全新用户指南现已上线!
Golang ECS框架Arche v0.11发布——全新用户指南现已上线! Arche 是一个基于原型的 Go 语言实体组件系统。
Arche 的特性
- 简洁的核心 API。请参阅 API 文档。
- 可选的逻辑过滤器和类型安全的泛型 API。
- 实体关系作为一等特性。请参阅用户指南。
- 使用 arche-serde 进行世界序列化和反序列化。
- 没有系统。只有查询。使用您自己的结构(或工具)。
- 无依赖项。除了单元测试(100% 覆盖率)。
- 可能是目前最快的 Go ECS。请参阅基准测试。
版本亮点
Arche 现在拥有一个专门的文档网站,其中包含结构化的用户指南和背景信息。我们希望这将显著降低入门门槛。
此外,Arche 还获得了一些新功能:
- 添加了
Query.EntityAt用于随机访问查询实体。 - 泛型过滤器现在支持
Exclusive,就像基于 ID 的过滤器一样。 - 构建标签
debug改进了某些地方的错误消息,在这些地方我们为了性能而依赖标准库的 panic。
有关更改的完整列表,请参阅 CHANGELOG。
我们非常期待您的反馈,特别是关于新的用户指南!
更多关于Golang ECS框架Arche v0.11发布——全新用户指南现已上线!的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang ECS框架Arche v0.11发布——全新用户指南现已上线!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Arche v0.11的发布确实为Go语言的ECS开发带来了重要更新。新的用户指南和文档网站将极大提升开发者的入门体验。以下是对新特性的技术分析及示例代码:
1. Query.EntityAt 随机访问 这个新增方法允许在查询结果中进行O(1)复杂度的随机访问,特别适合需要随机选择实体的场景:
import "github.com/mlange-42/arche"
// 定义组件
type Position struct{ X, Y float64 }
type Velocity struct{ X, Y float64 }
func main() {
world := arche.NewWorld()
posID := arche.ComponentID[Position](&world)
velID := arche.ComponentID[Velocity](&world)
// 创建实体
for i := 0; i < 100; i++ {
entity := world.NewEntity(posID, velID)
// 初始化组件数据...
}
// 查询并随机访问
query := world.Query(arche.All(posID, velID))
defer query.Close()
// 获取第42个实体
if entity, ok := query.EntityAt(42); ok {
// 处理该实体
pos := (*Position)(world.Get(entity, posID))
vel := (*Velocity)(world.Get(entity, velID))
// 更新位置
pos.X += vel.X
pos.Y += vel.Y
}
}
2. 泛型过滤器 Exclusive 支持 泛型API现在支持Exclusive过滤器,提供类型安全的查询构建:
import (
"github.com/mlange-42/arche"
"github.com/mlange-42/arche/generic"
)
type Health struct{ Value int }
type Mana struct{ Value int }
type Buff struct{ Duration int }
func main() {
world := arche.NewWorld()
// 使用泛型API
mapper := generic.NewMap3[Health, Mana, Buff](&world)
filter := generic.NewFilter3[Health, Mana, Buff]()
// 创建具有不同组件组合的实体
mapper.New() // 实体有 Health, Mana, Buff
mapper.New() // 另一个实体
// 添加只有Health和Mana的实体
healthManaMapper := generic.NewMap2[Health, Mana](&world)
healthManaMapper.New()
// 使用Exclusive查询只包含Health和Mana的实体
query := filter.New(&world).Exclusive()
defer query.Close()
for query.Next() {
h, m, _ := query.Get()
// 这里h和m只来自具有Health和Mana(没有Buff)的实体
h.Value -= 10
m.Value += 5
}
}
3. 调试构建标签改进
使用debug构建标签可以获得更详细的错误信息:
# 构建时启用debug标签
go build -tags debug -o mygame .
# 运行时如果出现组件访问错误,将显示更详细的堆栈信息
# 而不是标准的panic信息
4. 实体关系示例 Arche将实体关系作为一等公民的特性:
import "github.com/mlange-42/arche"
type Owner struct{ arche.Entity }
type Owned struct{}
func main() {
world := arche.NewWorld()
ownerID := arche.ComponentID[Owner](&world)
ownedID := arche.ComponentID[Owned](&world)
// 创建拥有者实体
owner := world.NewEntity(ownerID)
// 创建被拥有的实体并建立关系
for i := 0; i < 5; i++ {
owned := world.NewEntity(ownedID)
// 设置关系
world.Relations().Set(owned, ownerID, owner)
}
// 查询特定拥有者的所有实体
filter := arche.NewRelationFilter(ownerID, owner)
query := world.Query(arche.All(ownedID), filter)
defer query.Close()
for query.Next() {
entity := query.Entity()
// 处理该拥有者的实体
}
}
这些改进使Arche在保持高性能的同时,提供了更好的开发体验和调试支持。新的文档结构特别有助于理解ECS的核心概念和Arche的具体实现方式。

