Zero pad chunks before saving them to the disk

This makes the unused data inside region files more repeatable.
Which will result in better compression in case the entire world directory
is compressed (like in backups). Which will naturally result in smaller backups.
This commit is contained in:
Toon Schoenmakers 2020-10-12 20:34:30 +02:00 committed by MiniDigger
parent 73fc96669d
commit 4ba3c0542f

View file

@ -0,0 +1,47 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Toon Schoenmakers <nighteyes1993@gmail.com>
Date: Mon, 12 Oct 2020 18:59:12 +0200
Subject: [PATCH] Zero pad chunks before saving them to the disk
This makes the unused data inside region files more repeatable.
Which will result in better compression in case the entire world directory
is compressed (like in backups). Which will naturally result in smaller backups.
diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java
index 1751fb6934d9242e475c1a44b2a4a1ade6987766..e969625d246f4657b4e802ac6a9d11e5c3b2e8c3 100644
--- a/src/main/java/net/minecraft/server/RegionFile.java
+++ b/src/main/java/net/minecraft/server/RegionFile.java
@@ -513,13 +513,14 @@ public class RegionFile implements AutoCloseable {
}
}
+ private static final ByteBuffer zero = ByteBuffer.allocateDirect(4096);
// Paper end
class ChunkBuffer extends ByteArrayOutputStream {
private final ChunkCoordIntPair b;
public ChunkBuffer(ChunkCoordIntPair chunkcoordintpair) {
- super(8096);
+ super(8192); // Paper
super.write(0);
super.write(0);
super.write(0);
@@ -532,6 +533,17 @@ public class RegionFile implements AutoCloseable {
ByteBuffer bytebuffer = ByteBuffer.wrap(this.buf, 0, this.count);
bytebuffer.putInt(0, this.count - 5 + 1);
+
+ // Paper start
+ int size = (this.count + 4095) & ~4095;
+
+ // increase the limit to be the next chunk of 4096
+ bytebuffer.limit(size);
+
+ // now just fill the rest with zeros from our static buffer
+ bytebuffer.put(zero);
+ // Paper end
+
RegionFile.this.a(this.b, bytebuffer);
}
}