异步预制体

异步预制体

非阻塞预制件加载和批量异步粘贴,适用于Hytale。粘贴数百万个方块,不会冻结服务器或导致客户端崩溃。

实用

AsyncPrefab

AsyncPrefab 是一款服务端 Hytale 插件,可让大型预制建筑的加载和粘贴完全非阻塞。

无需冻结服务器或导致客户端崩溃,即可粘贴数百万个方块。


问题

Hytale 内置的预制建筑系统完全运行在世界线程上。

对于大型预制建筑(超过 400 万个方块),可能导致:

  • 选择预制建筑时服务器冻结 7 秒以上
  • 客户端因过大的 EditorBlocksChange 数据包而崩溃
  • 放置数百万个方块时服务器完全挂起
  • 粘贴完成后内存长时间占用

大规模世界编辑变得不稳定且充满风险。


解决方案

AsyncPrefab 拦截预制建筑管道,使所有操作异步化并分批处理。

后台预制建筑加载

当选择 .prefab.json 文件时,文件会在后台线程而非世界线程上加载。

  • 无服务器冻结
  • 菜单立即关闭
  • 聊天中显示实时进度更新

过大数据包保护

超过约 400 万个方块的预制建筑可能生成对客户端来说过大的数据包。

AsyncPrefab 会安全地阻止这些数据包,防止崩溃。

异步分批粘贴

方块放置被拆分为可配置的批次(默认:每 200 毫秒 50,000 个方块)。

  • 服务器保持响应
  • 无世界线程锁定
  • 无多秒冻结

异步撤销 / 重做

每次异步粘贴都会捕获原始方块。

  • /asyncundo
  • /asyncredo

撤销和重做同样分批处理——无冻结。

自动内存清理

粘贴完成后,缓存的预制建筑数据和选择将被清除以释放内存。


命令

命令 描述 权限
/paste 内置粘贴命令的异步替代 hytale.editor.selection.clipboard
/asyncpaste <prefab> [x y z] [batchSize] [batchDelay] 异步加载并粘贴一个预制建筑 asyncprefab.paste
/asyncundo 撤销上一次异步粘贴 asyncprefab.undo
/asyncredo 重做上一次撤销的异步粘贴 asyncprefab.redo

所有命令都需要创造模式。


粘贴工具集成

AsyncPrefab 会自动拦截内置的粘贴工具

像往常一样点击粘贴——放置操作会自动重定向到异步分批处理。

无需配置。


安装

  1. .jar 文件放入服务器 mods/ 文件夹
  2. 重启服务器
  3. 完成

开箱即用。


要求


性能示例

使用一个 820 万个方块的预制建筑进行测试:

操作 原版 AsyncPrefab
预制建筑选择 冻结 8 秒以上 0 秒冻结
方块粘贴 服务器挂起 / 客户端崩溃 分批且非阻塞
内存保留 无限期缓存 自动清理

面向开发者

AsyncPrefab 为其他插件暴露了一个服务 API。

示例:

AsyncPrefabService service = Asyncprefab.getService();
service.paste(world, "my_prefab.prefab.json", position, PasteOptions.defaults());

自定义批次大小和延迟可通过 PasteOptions 配置。


🆘 支持

Discord: https://discord.gg/KPzSCm83Km


许可证

MIT


作者: IPv5