From f9d9cbd0f6fc0bf0bfbeb7c38fc919036e7025ea Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 3 May 2023 23:14:53 +0100 Subject: [PATCH] BlockStateDictionary: slash another 14% off memory usage by deduplicating block type names perhaps we could construct a dictionary from BlockTypeNames reflection?? --- src/network/mcpe/convert/BlockStateDictionary.php | 4 +++- src/network/mcpe/convert/BlockStateDictionaryEntry.php | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/mcpe/convert/BlockStateDictionary.php b/src/network/mcpe/convert/BlockStateDictionary.php index b70038220..55dcd2210 100644 --- a/src/network/mcpe/convert/BlockStateDictionary.php +++ b/src/network/mcpe/convert/BlockStateDictionary.php @@ -130,6 +130,7 @@ final class BlockStateDictionary{ $entries = []; + $uniqueNames = []; foreach(self::loadPaletteFromString($blockPaletteContents) as $i => $state){ $meta = $metaMap[$i] ?? null; if($meta === null){ @@ -138,7 +139,8 @@ final class BlockStateDictionary{ if(!is_int($meta)){ throw new \InvalidArgumentException("Invalid metaMap offset $i, expected int, got " . get_debug_type($meta)); } - $entries[$i] = new BlockStateDictionaryEntry($state, $meta); + $uniqueName = $uniqueNames[$state->getName()] ??= $state->getName(); + $entries[$i] = new BlockStateDictionaryEntry($uniqueName, $state->getStates(), $meta); } return new self($entries); diff --git a/src/network/mcpe/convert/BlockStateDictionaryEntry.php b/src/network/mcpe/convert/BlockStateDictionaryEntry.php index 746e93977..994695df2 100644 --- a/src/network/mcpe/convert/BlockStateDictionaryEntry.php +++ b/src/network/mcpe/convert/BlockStateDictionaryEntry.php @@ -34,15 +34,17 @@ use const SORT_STRING; final class BlockStateDictionaryEntry{ - private string $stateName; private string $rawStateProperties; + /** + * @param Tag[] $stateProperties + */ public function __construct( - BlockStateData $stateData, + private string $stateName, + array $stateProperties, private int $meta ){ - $this->stateName = $stateData->getName(); - $this->rawStateProperties = self::encodeStateProperties($stateData->getStates()); + $this->rawStateProperties = self::encodeStateProperties($stateProperties); } public function getStateName() : string{ return $this->stateName; }