LagChunkDetection Algorithm

Last updated:October 30th 2021, 10:01

Just tell me ur idea and i will try to write it then tell u the result

Describe the problem :

The purpose of this plugin is to reduce the lag from server by unloading the lag chunk

English

I write this algorithm to integrate a feature for minecraft game server. If you know about the game, then you can easily understand what i wrote under. And if not, i will still write it as simple that everyone can still understand

This game map is splited into many section called “Chunk”, each chunk large about 16x16x256 “block” each axis (256 is the height, and “block” is the game’s unit).

When a player connect to the server, it will load an amount of chunks around the player. And whereever the player goes, it will load those chunks near by, and also chunks that dont have any player near by will be unloaded.

So here is where the problem happen. If a chunk (or an adjacent group of chunks) that has some corruption, maybe there are too many item,mob that consume a lot of work for processor. It will make the entire server very laggy.

To avoid this from happening, we just need to teleport that player, the one who is inside a lag chunk(s) to spawnpoint (where the chunk here is stable), it will make the lag chunk unloaded, and then the lag disappear

=> But i have not found any efficient algorithm for this (detect the person who is inside a lag chunk correctly, not mistaken other players)

The games’ (minecraft) API dont support getting a specific chunk delay, also not a player inside a specific chunk. If we have the api then this problem is effortless. However that is also how this algorithm should work, or something similar.

Supported API:

  • Get the delay value of the world map (it is the loading delay speed to load the datas from all the loaded chunk which is currently having a player nearby,a lag chunk will take processor a longer to execute => the main-thread will be blocked => lag)
    • you can use this api as a trigger for the code to be executed, the normal delay should be around 20ms, if it higher than, for example, > 60ms then the code will be executed
  • Teleport a specific player
  • Get a list of all online player
Chinese (Google translate, if there are anything wrong pls help me correct the transcript)

我编写这个算法是为了为我的世界游戏服务器集成一个功能。如果您了解游戏,那么您就可以轻松理解我在下面写的内容。如果没有,我还是会写得简单到大家都能看懂

这张游戏地图被分成很多部分叫做“Chunk”,每区块大大约16x16x256“区块”每个轴(256是高度,“区块”是游戏的单位)。

当玩家连接到服务器时,它会在玩家周围加载一定数量的区区块。无论玩家走到哪里,它都会加载附近的那些区块,并且附近没有任何玩家的区块也将被卸载。

所以这就是问题发生的地方。如果一个区块(或相邻的一组区块)有一些损坏,可能有太多的项目,生物消耗了处理器的大量工作。它会使整个服务器非常卡顿。

为了避免这种情况发生,我们只需要传送那个玩家,那个在延迟区块内的玩家到生成点(这里区块是稳定的),它会使延迟区块卸载,然后延迟消失

=> 但是我还没有找到任何有效的算法(正确检测滞后区块内的人,不要误会其他玩家)

游戏(我的世界)API 不支持获得特定区区块延迟,也不支持特定区区块内的玩家。如果我们有 api 那么这个问题就很容易了。然而,这也是这个算法应该如何工作,或类似的东西。

支持的API:

  • 获取世界地图的延迟值(它是从当前有玩家附近的所有已加载区块加载数据的加载延迟速度,滞后区块将花费处理器更长的时间来执行 => 主线程 将被阻止 => 滞后)
  • 你可以使用这个api作为代码执行的触发器,正常的延迟应该在20ms左右,如果高于,例如,> 60ms那么代码将被执行
  • 传送特定玩家
  • 获取所有在线玩家的列表
Vietnamese

Thuật toán này em dùng để viết thêm tính năng cho server game minecraft. Nếu anh/chị biết về game thì sẽ dễ hiểu, còn ko thì em vẫn sẽ ghi ra theo cách mà ai cũng hiểu được.

Cái map của game này được chia ra làm từng khu vực gọi là chunk, mỗi chunk có độ lớn là 16x16 ô

Khi một người chơi kết nối vào game thì sẽ load 1 lượng chunk xung quanh. Và người chơi đi đến đâu thì chunk được load đến đấy, và đồng thời chunk nào xa quá và ko có người chơi lân cận thì sẽ đc unload

Và vấn đề ở đây là nếu 1 chunk (hoặc nhiều chunk gần kề) nào đó có xung đột trong game ví dụ có quá nhiều vật phẩm, mob thì sẽ gây lag cho toàn bộ server.

Để tránh trường hợp này chỉ cần dịch chuyển người chơi về lại spawnpoint (nơi mà các chunk ở đây ổn định), sẽ khiến chunk lag unload và hết lag

=> Nhưng em ko biết thuật toán nào tối ưu cho việc này (nhận diện người chơi nào đó đang ở trong chunk lag)

API của game ko có hỗ trợ xác định cụ thể độ trễ của chunk cũng như ko lấy được người chơi đang hiện diện trong chunk, nếu có api này thì dễ (thật ra đây cũng chính là thuật toán cần viết, hoặc 1 cách tương tự)

API có hỗ trợ:

  • Lấy độ trễ của toàn bộ map (là tốc độ load dữ liệu tất cả các chunk đang có người chơi,chunk nào lag sẽ gây ra load lâu => chặn mainthread => lag)
    • Anh/chị có thể dùng api này như cách để cho code chạy, độ trễ bình thường là 20ms, nếu lớn hơn ví dụ là 60ms, thì code sẽ chạy và bắt đầu tìm kiếm người gây lag
  • Dịch chuyển người chơi cụ thể
  • Lấy ra danh sách các người chơi đang trong server

Code block diagram :

Vietnamese image

Ảnh

English image

Pic