vRp.CD2g_test/utils/aoi/README.md

3.8 KiB
Raw Blame History

Aoi

Go doc

aoi 提供了一种有效的方法来处理 AOIArea of Interest问题。

AOI 问题是在大规模多人在线游戏中常见的问题,它涉及到确定哪些对象对玩家来说是“感兴趣的”, 也就是说,哪些对象在玩家的视野范围内。

这个包提供了一种数据结构和一些方法来有效地解决这个问题。

目录导航

列出了该 package 下所有的函数及类型定义,可通过目录导航进行快捷跳转 ❤️

展开 / 折叠目录导航

包级函数定义

函数名称 描述
NewTwoDimensional 暂无描述...

类型定义

类型 名称 描述
STRUCT TwoDimensional 暂无描述...
INTERFACE TwoDimensionalEntity 基于2D定义的AOI对象功能接口
STRUCT EntityJoinVisionEventHandle 暂无描述...

详情信息

func NewTwoDimensional[EID generic.Basic, PosType generic.SignedNumber, E TwoDimensionalEntity[EID, PosType]](width int, height int, areaWidth int, areaHeight int) *TwoDimensional[EID, PosType, E]

查看 / 收起单元测试

func TestNewTwoDimensional(t *testing.T) {
	aoiTW := aoi.NewTwoDimensional[int64, float64, *Ent](10000, 10000, 100, 100)
	start := time.Now()
	for i := 0; i < 50000; i++ {
		aoiTW.AddEntity(&Ent{guid: int64(i), pos: geometry.NewPoint[float64](float64(random.Int64(0, 10000)), float64(random.Int64(0, 10000))), vision: 200})
	}
	fmt.Println("添加耗时:", time.Since(start))
	start = time.Now()
	aoiTW.SetSize(10100, 10100)
	fmt.Println("重设大小耗时:", time.Since(start))
}


TwoDimensional STRUCT

type TwoDimensional[EID generic.Basic, PosType generic.SignedNumber, E TwoDimensionalEntity[EID, PosType]] struct {
	*event[EID, PosType, E]
	rw               sync.RWMutex
	width            float64
	height           float64
	areaWidth        float64
	areaHeight       float64
	areaWidthLimit   int
	areaHeightLimit  int
	areas            [][]map[EID]E
	focus            map[EID]map[EID]E
	repartitionQueue []func()
}

func (*TwoDimensional) AddEntity(entity E)


func (*TwoDimensional) DeleteEntity(entity E)


func (*TwoDimensional) Refresh(entity E)


func (*TwoDimensional) GetFocus(id EID) map[EID]E


func (*TwoDimensional) SetSize(width int, height int)


func (*TwoDimensional) SetAreaSize(width int, height int)


TwoDimensionalEntity INTERFACE

基于2D定义的AOI对象功能接口

  • AOI 对象提供了 AOI 系统中常用的属性,诸如位置坐标和视野范围等
type TwoDimensionalEntity[EID generic.Basic, PosType generic.SignedNumber] interface {
	GetTwoDimensionalEntityID() EID
	GetVision() float64
	GetPosition() geometry.Point[PosType]
}

EntityJoinVisionEventHandle STRUCT

type EntityJoinVisionEventHandle[EID generic.Basic, PosType generic.SignedNumber, E TwoDimensionalEntity[EID, PosType]] func(entity E)