From e3700cab50555984d50356ffd9fdba41ed521766 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 9 Nov 2023 18:05:07 +0000 Subject: [PATCH] ZlibCompressor: use libdeflate for level 0 compression this is supported since libdeflate 1.15 and ext-libdeflate 0.2.0. Everyone should be using these versions by now anyway, and if they aren't, they should update. libdeflate's level 0 compression is over 20 times faster than zlib, so this is a nice performance improvement. --- src/PocketMine.php | 7 +++++++ src/network/mcpe/compression/ZlibCompressor.php | 15 +++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/PocketMine.php b/src/PocketMine.php index 4c2ff32a7..296c21a89 100644 --- a/src/PocketMine.php +++ b/src/PocketMine.php @@ -144,6 +144,13 @@ namespace pocketmine { $messages[] = "chunkutils2 ^$wantedVersionMin is required, while you have $chunkutils2_version."; } + if(($libdeflate_version = phpversion("libdeflate")) !== false){ + //make sure level 0 compression is available + if(version_compare($libdeflate_version, "0.2.0") < 0 || version_compare($libdeflate_version, "0.3.0") >= 0){ + $messages[] = "php-libdeflate ^0.2.0 is required, while you have $libdeflate_version."; + } + } + if(extension_loaded("pocketmine")){ $messages[] = "The native PocketMine extension is no longer supported."; } diff --git a/src/network/mcpe/compression/ZlibCompressor.php b/src/network/mcpe/compression/ZlibCompressor.php index 317a64451..066ba876a 100644 --- a/src/network/mcpe/compression/ZlibCompressor.php +++ b/src/network/mcpe/compression/ZlibCompressor.php @@ -67,17 +67,12 @@ final class ZlibCompressor implements Compressor{ return $result; } - private static function zlib_encode(string $data, int $level) : string{ - return Utils::assumeNotFalse(zlib_encode($data, ZLIB_ENCODING_RAW, $level), "ZLIB compression failed"); - } - public function compress(string $payload) : string{ $compressible = $this->minCompressionSize !== null && strlen($payload) >= $this->minCompressionSize; - if(function_exists('libdeflate_deflate_compress')){ - return $compressible ? - libdeflate_deflate_compress($payload, $this->level) : - self::zlib_encode($payload, 0); - } - return self::zlib_encode($payload, $compressible ? $this->level : 0); + $level = $compressible ? $this->level : 0; + + return function_exists('libdeflate_deflate_compress') ? + libdeflate_deflate_compress($payload, $level) : + Utils::assumeNotFalse(zlib_encode($payload, ZLIB_ENCODING_RAW, $level), "ZLIB compression failed"); } }