引入计时器统计性能

This commit is contained in:
zhangyuheng 2024-08-13 14:49:56 +08:00
parent 3fe0ebfe3c
commit 0e638e00b2
6 changed files with 112 additions and 64 deletions

View File

@ -1,4 +1,4 @@
<div align="center"> <div style="text-align: center;">
<img src="https://ssl.lunadeer.cn:14437/i/2024/03/28/6604f0cec0f0e.png" alt="" width="70%"> <img src="https://ssl.lunadeer.cn:14437/i/2024/03/28/6604f0cec0f0e.png" alt="" width="70%">
@ -38,8 +38,9 @@
- 领地区域可视化; - 领地区域可视化;
- 管理员可在游戏内使用TUI配置领地系统 - 管理员可在游戏内使用TUI配置领地系统
- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据1.33.7+ - 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据1.33.7+
- 超高性能一个坐标在10127个领地内的搜索平均耗时不超过0.2ms仅占用1tick的不到0.4%时间)
<div align="center"> <div style="text-align: center;">
创建领地 创建领地
@ -53,6 +54,9 @@
<img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debec11dad.gif" alt="" width="60%"> <img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debec11dad.gif" alt="" width="60%">
高性能
<img src="https://ssl.lunadeer.cn:14437/i/2024/08/13/66bad56cc9fac.png" alt="" width="60%">
</div> </div>

View File

@ -4,7 +4,7 @@ plugins {
} }
group = "cn.lunadeer" group = "cn.lunadeer"
version = "2.1.17-beta" version = "2.1.18-beta"
java { java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21)) toolchain.languageVersion.set(JavaLanguageVersion.of(21))

View File

@ -4,6 +4,7 @@ import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.utils.MapRender; import cn.lunadeer.dominion.utils.MapRender;
import cn.lunadeer.dominion.utils.Particle; import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.dominion.utils.ResMigration; import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.AutoTimer;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
@ -213,13 +214,14 @@ public class Cache {
* @return 玩家当前所在领地 * @return 玩家当前所在领地
*/ */
public DominionDTO getPlayerCurrentDominion(Player player) { public DominionDTO getPlayerCurrentDominion(Player player) {
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId()); Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
DominionDTO last_dominion = null; DominionDTO last_dominion = null;
if (last_in_dom_id != null) { if (last_in_dom_id != null) {
last_dominion = id_dominions.get(last_in_dom_id); last_dominion = id_dominions.get(last_in_dom_id);
} }
if (isInDominion(last_dominion, player.getLocation())) { if (isInDominion(last_dominion, player.getLocation())) {
if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).size() == 0) { if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).isEmpty()) {
// 如果玩家仍在领地内且领地没有子领地则直接返回 // 如果玩家仍在领地内且领地没有子领地则直接返回
if (recheckPlayerState) { if (recheckPlayerState) {
lightOrNot(player, last_dominion); lightOrNot(player, last_dominion);
@ -259,6 +261,7 @@ public class Cache {
} }
return current_dominion; return current_dominion;
} }
}
/** /**
* 玩家退出时调用 用于清除玩家当前所在领地 * 玩家退出时调用 用于清除玩家当前所在领地
@ -466,12 +469,14 @@ public class Cache {
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_d; // x <= 0, z <= 0 private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_d; // x <= 0, z <= 0
public DominionDTO getLocInDominionDTO(@NotNull Location loc) { public DominionDTO getLocInDominionDTO(@NotNull Location loc) {
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
List<DominionNode> nodes = getNodes(loc); List<DominionNode> nodes = getNodes(loc);
if (nodes == null) return null; if (nodes == null) return null;
if (nodes.isEmpty()) return null; if (nodes.isEmpty()) return null;
DominionNode dominionNode = getLocInDominionNode(nodes, loc); DominionNode dominionNode = getLocInDominionNode(nodes, loc);
return dominionNode == null ? null : dominionNode.getDominion(); return dominionNode == null ? null : dominionNode.getDominion();
} }
}
public List<DominionNode> getNodes(Location loc) { public List<DominionNode> getNodes(Location loc) {

View File

@ -85,8 +85,8 @@ public class DominionDTO {
} }
String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;"; String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, id); List<DominionDTO> dominions = query(sql, id);
if (dominions.size() == 0) return null; if (dominions.isEmpty()) return null;
return dominions.get(0); return dominions.getFirst();
} }
public static List<DominionDTO> selectByParentId(String world, Integer parentId) { public static List<DominionDTO> selectByParentId(String world, Integer parentId) {
@ -105,8 +105,8 @@ public class DominionDTO {
public static DominionDTO select(String name) { public static DominionDTO select(String name) {
String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;"; String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, name); List<DominionDTO> dominions = query(sql, name);
if (dominions.size() == 0) return null; if (dominions.isEmpty()) return null;
return dominions.get(0); return dominions.getFirst();
} }
public static DominionDTO insert(DominionDTO dominion) { public static DominionDTO insert(DominionDTO dominion) {
@ -125,8 +125,8 @@ public class DominionDTO {
try (ResultSet rs = insert.execute()) { try (ResultSet rs = insert.execute()) {
Cache.instance.loadDominions(); Cache.instance.loadDominions();
List<DominionDTO> dominions = getDTOFromRS(rs); List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null; if (dominions.isEmpty()) return null;
return dominions.get(0); return dominions.getFirst();
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString()); DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString());
return null; return null;
@ -224,9 +224,9 @@ public class DominionDTO {
.where("id = ?", id.value); .where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) { try (ResultSet rs = updateRow.execute()) {
List<DominionDTO> dominions = getDTOFromRS(rs); List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null; if (dominions.isEmpty()) return null;
Cache.instance.loadDominions((Integer) id.value); Cache.instance.loadDominions((Integer) id.value);
return dominions.get(0); return dominions.getFirst();
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString()); DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString());
return null; return null;

View File

@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import java.io.File;
import java.util.List; import java.util.List;
public class ConfigManager { public class ConfigManager {
@ -21,6 +22,7 @@ public class ConfigManager {
_plugin.reloadConfig(); _plugin.reloadConfig();
_file = _plugin.getConfig(); _file = _plugin.getConfig();
_debug = _file.getBoolean("Debug", false); _debug = _file.getBoolean("Debug", false);
_timer = _file.getBoolean("Timer", false);
XLogger.setDebug(_debug); XLogger.setDebug(_debug);
_db_type = _file.getString("Database.Type", "sqlite"); _db_type = _file.getString("Database.Type", "sqlite");
_db_host = _file.getString("Database.Host", "localhost"); _db_host = _file.getString("Database.Host", "localhost");
@ -98,35 +100,65 @@ public class ConfigManager {
} }
public void saveAll() { public void saveAll() {
// 删除旧文件
new File(_plugin.getDataFolder(), "config.yml").delete();
// 保存新文件
_plugin.saveDefaultConfig();
// 重新加载
_plugin.reloadConfig();
_file = _plugin.getConfig();
// 保存配置
_file.set("Database.Type", _db_type);
_file.set("Database.Host", _db_host);
_file.set("Database.Port", _db_port);
_file.set("Database.Name", _db_name);
_file.set("Database.User", _db_user);
_file.set("Database.Pass", _db_pass);
_file.set("AutoCreateRadius", _auto_create_radius); _file.set("AutoCreateRadius", _auto_create_radius);
_file.set("Limit.SpawnProtection", _spawn_protection); _file.set("Limit.SpawnProtection", _spawn_protection);
_file.set("Limit.MinY", _limit_min_y);
_file.set("Limit.MaxY", _limit_max_y);
_file.set("Limit.SizeX", _limit_size_x); _file.set("Limit.SizeX", _limit_size_x);
_file.set("Limit.SizeY", _limit_size_y); _file.set("Limit.SizeY", _limit_size_y);
_file.set("Limit.SizeZ", _limit_size_z); _file.set("Limit.SizeZ", _limit_size_z);
_file.set("BlueMap", _blue_map);
_file.set("Dynmap", _dynmap);
_file.set("AutoCleanAfterDays", _auto_clean_after_days);
_file.set("Limit.MinY", _limit_min_y);
_file.set("Limit.MaxY", _limit_max_y);
_file.set("Limit.Amount", _limit_amount); _file.set("Limit.Amount", _limit_amount);
_file.set("Limit.Depth", _limit_depth); _file.set("Limit.Depth", _limit_depth);
_file.set("Limit.Vert", _limit_vert); _file.set("Limit.Vert", _limit_vert);
_file.set("Limit.OpByPass", _limit_op_bypass);
_file.set("Limit.WorldBlackList", _world_black_list); _file.set("Limit.WorldBlackList", _world_black_list);
_file.set("CheckUpdate", _check_update); _file.set("Limit.OpByPass", _limit_op_bypass);
_file.set("Teleport.Enable", _tp_enable); _file.set("Teleport.Enable", _tp_enable);
_file.set("Teleport.Delay", _tp_delay); _file.set("Teleport.Delay", _tp_delay);
_file.set("Teleport.CoolDown", _tp_cool_down); _file.set("Teleport.CoolDown", _tp_cool_down);
_file.set("AutoCleanAfterDays", _auto_clean_after_days);
_file.set("Tool", _tool); _file.set("Tool", _tool);
_file.set("Economy.Enable", _economy_enable); _file.set("Economy.Enable", _economy_enable);
_file.set("Economy.Price", _economy_price); _file.set("Economy.Price", _economy_price);
_file.set("Economy.OnlyXZ", _economy_only_xz); _file.set("Economy.OnlyXZ", _economy_only_xz);
_file.set("Economy.Refund", _economy_refund); _file.set("Economy.Refund", _economy_refund);
_file.set("FlyPermissionNodes", _fly_permission_nodes); _file.set("FlyPermissionNodes", _fly_permission_nodes);
_file.set("ResidenceMigration", _residence_migration); _file.set("ResidenceMigration", _residence_migration);
_file.set("GroupTitle.Enable", _group_title_enable); _file.set("GroupTitle.Enable", _group_title_enable);
_file.set("GroupTitle.Prefix", _group_title_prefix); _file.set("GroupTitle.Prefix", _group_title_prefix);
_file.set("GroupTitle.Suffix", _group_title_suffix); _file.set("GroupTitle.Suffix", _group_title_suffix);
_file.set("BlueMap", _blue_map);
_file.set("Dynmap", _dynmap);
_file.set("CheckUpdate", _check_update);
_file.set("Debug", _debug);
_file.set("Timer", _timer);
_plugin.saveConfig(); _plugin.saveConfig();
} }
@ -141,6 +173,10 @@ public class ConfigManager {
XLogger.setDebug(debug); XLogger.setDebug(debug);
} }
public Boolean TimerEnabled() {
return _timer;
}
public String getDbType() { public String getDbType() {
return _db_type; return _db_type;
} }
@ -455,6 +491,7 @@ public class ConfigManager {
private final Dominion _plugin; private final Dominion _plugin;
private FileConfiguration _file; private FileConfiguration _file;
private Boolean _debug; private Boolean _debug;
private Boolean _timer;
private String _db_type; private String _db_type;
private String _db_host; private String _db_host;

View File

@ -67,3 +67,5 @@ Dynmap: false
CheckUpdate: true CheckUpdate: true
Debug: false Debug: false
Timer: false # 性能测试计时器