iMoonDay
本帖最后由 tdiant 于 2023-3-31 10:52 编辑

我给自己写的一个新实体加上自己的nbt,在不退出存档的情况下这个nbt一切正常,但是一退出存档再重进这个nbt就恢复默认值了,而且好像实体没有markdirty的方法,不能像方块实体那样保存。我的nbt代码如下:
  1. @Override
  2.     public void writeCustomDataToNbt(NbtCompound nbt) {
  3.         super.writeCustomDataToNbt(nbt);
  4.         NbtList inventory = new NbtList();
  5.         IntStream.range(0, this.inventory.size()).mapToObj(i -> this.inventory.getStack(i).writeNbt(new NbtCompound())).forEach(inventory::add);
  6.         nbt.put("Inventory", inventory);
  7.         nbt.putBoolean("HasLodestone", this.hasLodestone);
  8.     }

  9.     @Override
  10.     public void readCustomDataFromNbt(NbtCompound nbt) {
  11.         super.readCustomDataFromNbt(nbt);
  12.         if (nbt.contains("Inventory")) {
  13.             Inventory inventory = new SimpleInventory(27);
  14.             nbt.getList("Inventory", NbtElement.COMPOUND_TYPE).stream().map(nbtElement -> (NbtCompound) nbtElement).forEach(nbtCompound -> IntStream.range(0, inventory.size()).forEach(i -> inventory.setStack(i, ItemStack.fromNbt(nbtCompound))));
  15.             this.inventory = inventory;
  16.         }
  17.         if (nbt.contains("HasLodestone")) {
  18.             this.hasLodestone = nbt.getBoolean("HasLodestone");
  19.         }
  20.     }
复制代码



Ph-苯
在不退出存档的情况下这个nbt一切正常
你是怎么知道的?data指令吗?

还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时间来初始化类,而相同功能的命令式代码只需要0毫秒来初始化。

iMoonDay
Ph-苯 发表于 2023-3-18 14:44
你是怎么知道的?data指令吗?

还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时 ...

已经搞定了,是我多循环了一次,导致之前的nbt被覆盖了。
你说的表达式是指foreach还是哪个地方的?

Ph-苯
iMoonDay 发表于 2023-3-18 18:11
已经搞定了,是我多循环了一次,导致之前的nbt被覆盖了。
你说的表达式是指foreach还是哪个地方的? ...

整个Stream。如果你用的是idea,可以用idea帮你把stream转换成循环。

teddyxlandlee
Ph-苯 发表于 2023-3-18 14:44
你是怎么知道的?data指令吗?

还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时 ...

Lambda的初始化时间根本不算啥,只是在加载类的时候用Core ASM 跑一遍Lambda类而已,并非每次运行的时候都要Re-initialize一遍。
Mixin 使用的Tree ASM 以及各种繁琐的 Mixin 类加载等工作也发生在类加载期间,这一耗时一定是比 LambdaMetaFactory 要长的。
所以还请抓大放小,Stream和lambda存在即合理

Ph-苯
teddyxlandlee 发表于 2023-3-19 10:58
Lambda的初始化时间根本不算啥,只是在加载类的时候用Core ASM 跑一遍Lambda类而已,并非每次运行的时候 ...

我指的就是类加载时。Mixin是没有办法替代的,但是lambda可以替代。另一方面,lambda会把调试变得非常困难,因为任何一个微小的改动都可能触及lambda表达式,从而阻止热重载。