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

1 回复

更多关于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的具体实现方式。

回到顶部