Home

Awesome

1、AOI库介绍

  1. 使用跳跃表+十字链方式实现的一个AOI库。
  2. 可做简单的碰撞检测、客户端资源、服务器AOI。
  3. 测试效率插入、移动、查找均到毫秒一下。

1.1 一个简单的Demo

// 创建一个AOI区域、如果地图过大可以定义多个区域

var zone = new AoiZone();

// AOI的显示区域、每个客户端都可以单独定义区域、这样可以更好的适用于不同的分辨率。

var area = new Vector2(3, 3);

// 添加50个玩家。

for (var i = 1; i <= 50; i++) zone.Enter(i, i, i);

// 刷新key为3的信息。

zone.Refresh(3, area, out var enters);

Console.WriteLine("---------------加入玩家范围的玩家列表--------------");

foreach (var aoiKey in enters)
{
    var findEntity = zone[aoiKey];
    Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}

// 更新key为3的坐标。

var entity = zone.Refresh(3, 20, 20, new Vector2(3, 3), out enters);

Console.WriteLine("---------------离开玩家范围的玩家列表--------------");

foreach (var aoiKey in entity.Leave)
{
    var findEntity = zone[aoiKey];
    Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}

Console.WriteLine("---------------key为3移动后加入玩家范围的玩家列表--------------");

foreach (var aoiKey in enters)
{
    var findEntity = zone[aoiKey];
    Console.WriteLine($"X:{findEntity.X.Value} Y:{findEntity.Y.Value}");
}

// 离开当前AOI

zone.Exit(50);

2、博客文章

AOI算法实现和原理(一) AOI算法实现和原理(二)