From 95df70c448adb01a9628f94aa732fd86a277bf62 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sat, 25 Apr 2026 15:33:11 +0200 Subject: [PATCH] perf: chunks should be faster now --- Cargo.lock | 378 +++++++----------- Cargo.toml | 7 +- pumpkin-config/src/chunk.rs | 20 +- pumpkin-nbt/src/tag.rs | 8 +- pumpkin-world/Cargo.toml | 1 - pumpkin-world/src/chunk/format/anvil.rs | 78 ++-- pumpkin-world/src/chunk/format/linear.rs | 3 +- pumpkin-world/src/chunk/format/mod.rs | 117 +++--- pumpkin-world/src/chunk_system/schedule.rs | 5 +- .../src/chunk_system/worker_logic.rs | 7 +- .../src/generation/noise/aquifer_sampler.rs | 50 +-- pumpkin-world/src/generation/noise/mod.rs | 6 +- pumpkin-world/src/generation/proto_chunk.rs | 8 +- pumpkin-world/src/level.rs | 16 +- pumpkin-world/src/lib.rs | 13 +- pumpkin/Cargo.toml | 1 - pumpkin/src/server/mod.rs | 2 - 17 files changed, 289 insertions(+), 431 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c45a1ca1b..2de003d04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -102,9 +102,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" dependencies = [ "compression-codecs", "compression-core", @@ -229,15 +229,6 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -326,7 +317,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8144c22e24bbcf26ade86cb6501a0916c46b7e4787abdb0045a467eb1645a1d" dependencies = [ "ambient-authority", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -363,9 +354,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -508,9 +499,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ "compression-core", "flate2", @@ -518,9 +509,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "console-api" @@ -644,27 +635,27 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046d4b584c3bb9b5eb500c8f29549bec36be11000f1ba2a927cef3d1a9875691" +checksum = "6edb5bdd1af46714e3224a017fabbbd57f70df4e840eb5ad6a7429dc456119d6" dependencies = [ "cranelift-assembler-x64-meta", ] [[package]] name = "cranelift-assembler-x64-meta" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b194a7870becb1490366fc0ae392ccd188065ff35f8391e77ac659db6fb977" +checksum = "a819599186e1b1a1f88d464e06045696afc7aa3e0cc018aa0b2999cb63d1d088" dependencies = [ "cranelift-srcgen", ] [[package]] name = "cranelift-bforest" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6a4ab44c6b371e661846b97dab687387a60ac4e2f864e2d4257284aad9e889" +checksum = "36e2c152d488e03c87b913bc2ed3414416eb1e0d66d61b49af60bf456a9665c7" dependencies = [ "cranelift-entity", "wasmtime-internal-core", @@ -672,9 +663,9 @@ dependencies = [ [[package]] name = "cranelift-bitset" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b7a44150c2f471a94023482bda1902710746e4bed9f9973d60c5a94319b06d" +checksum = "b6559d4fbc253d1396e1f6beeae57fa88a244f02aaf0cde2a735afd3492d9b2e" dependencies = [ "serde", "serde_derive", @@ -683,9 +674,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b06598133b1dd76758b8b95f8d6747c124124aade50cea96a3d88b962da9fa" +checksum = "96d9315d98d6e0a64454d4c83be2ee0e8055c3f80c3b2d7bcad7079f281a06ff" dependencies = [ "bumpalo", "cranelift-assembler-x64", @@ -711,9 +702,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6190e2e7bcf0a678da2f715363d34ed530fedf7a2f0ab75edaefef72a70465ff" +checksum = "d89c00a88081c55e3087c45bebc77e0cc973de2d7b44ef6a943c7122647b89f5" dependencies = [ "cranelift-assembler-x64-meta", "cranelift-codegen-shared", @@ -724,24 +715,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f583cf203d1aa8b79560e3b01f929bdacf9070b015eec4ea9c46e22a3f83e4a0" +checksum = "879f77c497a1eb6273482aa1ac3b23cb8563ff04edb39ed5dfcfd28c8deff8f5" [[package]] name = "cranelift-control" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803159df35cc398ae54473c150b16d6c77e92ab2948be638488de126a3328fbc" +checksum = "498dc1f17a6910c88316d49c7176d8fa97cf10c30859c32a266040449317f963" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3109e417257082d88087f5bcce677525bdaa8322b88dd7f175ed1a1fd41d546c" +checksum = "c2acba797f6a46042ce82aaf7680d0c3567fe2001e238db9df649fd104a2727f" dependencies = [ "cranelift-bitset", "serde", @@ -751,9 +742,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14db6b0e0e4994c581092df78d837be2072578f7cb2528f96a6cf895e56dee63" +checksum = "4dca3df1d107d98d88f159ad1d5eaa2d5cdb678b3d5bcfadc6fc83d8ebb448ea" dependencies = [ "cranelift-codegen", "log", @@ -763,15 +754,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec66ea5025c7317383699778282ac98741d68444f956e3b1d7b62f12b7216e67" +checksum = "f62dd18116d88bed649871feceda79dad7b59cc685ea8998c2b3e64d0e689602" [[package]] name = "cranelift-native" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373ade56438e6232619d85678477d0a88a31b3581936e0503e61e96b546b0800" +checksum = "f843b80360d7fdf61a6124642af7597f6d55724cf521210c34af8a1c66daca6e" dependencies = [ "cranelift-codegen", "libc", @@ -780,9 +771,9 @@ dependencies = [ [[package]] name = "cranelift-srcgen" -version = "0.130.1" +version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53619d3cd5c78fd998c6d9420547af26b72e6456f94c2a8a2334cb76b42baa" +checksum = "090ee5de58c6f17eb5e3a5ae8cf1695c7efea04ec4dd0ecba6a5b996c9bad7dc" [[package]] name = "crc-fast" @@ -1581,12 +1572,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hkdf" version = "0.12.4" @@ -1676,9 +1661,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" dependencies = [ "typenum", ] @@ -1871,20 +1856,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "im-rc" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" -dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - [[package]] name = "indexmap" version = "2.14.0" @@ -2040,9 +2011,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "leb128" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +checksum = "6cc46bac87ef8093eed6f272babb833b6443374399985ac8ed28471ee0918545" [[package]] name = "leb128fmt" @@ -2052,9 +2023,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -2363,16 +2334,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_threads" version = "0.1.7" @@ -2403,12 +2364,12 @@ dependencies = [ [[package]] name = "object" -version = "0.38.1" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" dependencies = [ "crc32fast", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "indexmap", "memchr", ] @@ -2803,9 +2764,9 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "010dec3755eb61b2f1051ecb3611b718460b7a74c131e474de2af20a845938af" +checksum = "df866b7fd522992ccc6682e58b2741cc7972b163b661db24c4328f4c914cb09d" dependencies = [ "cranelift-bitset", "log", @@ -2815,9 +2776,9 @@ dependencies = [ [[package]] name = "pulley-macros" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad360c32e85ca4b083ac0e2b6856e8f11c3d5060dafa7d5dc57b370857fa3018" +checksum = "f7dfa8354acc622b3857e1bb1a4e4315d3bc1a44ad31d5653c3e87c0da9306d7" dependencies = [ "proc-macro2", "quote", @@ -2840,7 +2801,6 @@ dependencies = [ "libloading", "notify", "num-bigint", - "num_cpus", "ordered-float", "pkcs8 0.11.0-rc.11", "postcard", @@ -3033,7 +2993,6 @@ dependencies = [ "futures", "itertools 0.14.0", "lz4-java-wrc", - "num_cpus", "pumpkin-config", "pumpkin-data", "pumpkin-nbt", @@ -3088,9 +3047,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha", @@ -3133,15 +3092,6 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "rayon" version = "1.12.0" @@ -3336,9 +3286,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.38" +version = "0.23.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e" dependencies = [ "log", "once_cell", @@ -3351,18 +3301,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -3405,12 +3355,6 @@ dependencies = [ "twox-hash 2.1.2", ] -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - [[package]] name = "same-file" version = "1.0.6" @@ -3513,19 +3457,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "serdect" version = "0.4.2" @@ -3626,16 +3557,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - [[package]] name = "slab" version = "0.4.12" @@ -3925,9 +3846,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.52.0" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -4003,7 +3924,7 @@ dependencies = [ "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -4030,7 +3951,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -4209,9 +4130,9 @@ checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -4243,12 +4164,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "untrusted" version = "0.9.0" @@ -4369,11 +4284,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen 0.57.1", ] [[package]] @@ -4432,22 +4347,18 @@ dependencies = [ [[package]] name = "wasm-compose" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd23d12cc95c451c1306db5bc63075fbebb612bb70c53b4237b1ce5bc178343" +checksum = "f05a2b3bad87cc1ce45b63425ec09a854cc4cb369231c9fed1fee31538103efb" dependencies = [ "anyhow", "heck", - "im-rc", "indexmap", "log", "petgraph", - "serde", - "serde_derive", - "serde_yaml", "smallvec", - "wasm-encoder 0.245.1", - "wasmparser 0.245.1", + "wasm-encoder 0.246.2", + "wasmparser 0.246.2", "wat", ] @@ -4461,16 +4372,6 @@ dependencies = [ "wasmparser 0.244.0", ] -[[package]] -name = "wasm-encoder" -version = "0.245.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" -dependencies = [ - "leb128fmt", - "wasmparser 0.245.1", -] - [[package]] name = "wasm-encoder" version = "0.246.2" @@ -4529,9 +4430,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" dependencies = [ "bitflags 2.11.1", "hashbrown 0.16.1", @@ -4540,17 +4441,6 @@ dependencies = [ "serde", ] -[[package]] -name = "wasmparser" -version = "0.246.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" -dependencies = [ - "bitflags 2.11.1", - "indexmap", - "semver", -] - [[package]] name = "wasmparser" version = "0.247.0" @@ -4566,20 +4456,20 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41517a3716fbb8ccf46daa9c1325f760fcbff5168e75c7392288e410b91ac8" +checksum = "6e41f7493ba994b8a779430a4c25ff550fd5a40d291693af43a6ef48688f00e3" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.245.1", + "wasmparser 0.246.2", ] [[package]] name = "wasmtime" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce205cd643d661b5ba5ba4717e13730262e8cdbc8f2eacbc7b906d45c1a74026" +checksum = "fca3f777dfb4db45915f95eeb25cac7f2eeb268797a27e5eb78b072618135c7f" dependencies = [ "addr2line", "async-trait", @@ -4610,8 +4500,8 @@ dependencies = [ "target-lexicon", "tempfile", "wasm-compose", - "wasm-encoder 0.245.1", - "wasmparser 0.245.1", + "wasm-encoder 0.246.2", + "wasmparser 0.246.2", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -4630,9 +4520,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8b78abf3677d4a0a5db82e5015b4d085ff3a1b8b472cbb8c70d4b769f019ce" +checksum = "7c5ca1af838cec374931242d07af5d354aedf63f297f95b3625ac863e516ef67" dependencies = [ "anyhow", "cpp_demangle", @@ -4652,8 +4542,8 @@ dependencies = [ "sha2 0.10.9", "smallvec", "target-lexicon", - "wasm-encoder 0.245.1", - "wasmparser 0.245.1", + "wasm-encoder 0.246.2", + "wasmparser 0.246.2", "wasmprinter", "wasmtime-internal-component-util", "wasmtime-internal-core", @@ -4661,9 +4551,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-cache" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e4fd4103ba413c0da2e636f73490c6c8e446d708cbde7573703941bc3d6a448" +checksum = "b2004f7c86ebeb116550655377cdf16dbf7b03ae5aa6b4b1c1458cfa23aaa306" dependencies = [ "base64 0.22.1", "directories-next", @@ -4681,9 +4571,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-component-macro" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3d6914f34be2f9d78d8ee9f422e834dfc204e71ccce697205fae95fed87892" +checksum = "58b31927f7b613d8fe019609744e226f6458d8aa5e6289e92fbbc60e521cd026" dependencies = [ "anyhow", "proc-macro2", @@ -4691,20 +4581,20 @@ dependencies = [ "syn", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.245.1", + "wit-parser 0.246.2", ] [[package]] name = "wasmtime-internal-component-util" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3751b0616b914fdd87fe1bf804694a078f321b000338e6476bc48a4d6e454f21" +checksum = "dc29e3478928b93979831ba02a997ce7f707c673ce47180d643091cf4fa4f561" [[package]] name = "wasmtime-internal-core" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22632b187e1b0716f1b9ac57ad29013bed33175fcb19e10bb6896126f82fac67" +checksum = "816a61a75275c6be435131fc625a4f5956daf24d9f9f59443e81cbef228929b3" dependencies = [ "anyhow", "hashbrown 0.16.1", @@ -4714,9 +4604,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-cranelift" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3ca07b3e0bb3429674b173b5800577719d600774dd81bff58f775c0aaa64ee" +checksum = "69ceb5e079877e7e4565c1e2d86d9db889175d55f7ca0001315576d08c71e634" dependencies = [ "cfg-if", "cranelift-codegen", @@ -4732,7 +4622,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser 0.245.1", + "wasmparser 0.246.2", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -4741,9 +4631,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-fiber" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c8b2c9704eb1f33ead025ec16038277ccb63d0a14c31e99d5b765d7c36da55" +checksum = "e18f8bb05d25e0d4cca7278147c9f9e2f26f66886ef754b562bf729128f1e537" dependencies = [ "cc", "cfg-if", @@ -4756,9 +4646,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-debug" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d950310d07391d34369f62c48336ebb14eacbd4d6f772bb5f349c24e838e0664" +checksum = "357f1070b31154ee463937b477ca0b2962bf450b40fc59799bef2f656b15da73" dependencies = [ "cc", "object", @@ -4768,9 +4658,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-jit-icache-coherence" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3606662c156962d096be3127b8b8ae8ee2f8be3f896dad29259ff01ddb64abfd" +checksum = "2fd683a94490bf755d016a09697b0955602c50106b1ded97d16983ab2ded9fed" dependencies = [ "cfg-if", "libc", @@ -4780,9 +4670,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-unwinder" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75eef0747e52dc545b075f64fd0e0cc237ae738e641266b1970e07e2d744bc32" +checksum = "4471746ce113c3c1862ce2c0674acb35399a4b3ed3ef4531dc087f333c74f064" dependencies = [ "cfg-if", "cranelift-codegen", @@ -4793,9 +4683,9 @@ dependencies = [ [[package]] name = "wasmtime-internal-versioned-export-macros" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b0a5dab02a8fb527f547855ecc0e05f9fdc3d5bd57b8b080349408f9a6cece" +checksum = "d6af582ec18b674bf7a17775d6fbfbddfcc143f0edbd89c9c1778239c8aa92ed" dependencies = [ "proc-macro2", "quote", @@ -4804,16 +4694,16 @@ dependencies = [ [[package]] name = "wasmtime-internal-winch" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8007342bd12ff400293a817973f7ecd6f1d9a8549a53369a9c1af357166f1f1e" +checksum = "d31be8916bb60ea756d2f0ae1f634d9258442aa71e773c893e2f4cead30501b5" dependencies = [ "cranelift-codegen", "gimli", "log", "object", "target-lexicon", - "wasmparser 0.245.1", + "wasmparser 0.246.2", "wasmtime-environ", "wasmtime-internal-cranelift", "winch-codegen", @@ -4821,22 +4711,22 @@ dependencies = [ [[package]] name = "wasmtime-internal-wit-bindgen" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7900c3e3c1d6e475bc225d73b02d6d5484815f260022e6964dca9558e50dd01a" +checksum = "e2150e63d502ab2d64754e5abe8eb737ae674b7dd4ad53144fd16bbeceaf4a19" dependencies = [ "anyhow", "bitflags 2.11.1", "heck", "indexmap", - "wit-parser 0.245.1", + "wit-parser 0.246.2", ] [[package]] name = "wasmtime-wasi" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3e3ddcfad69e9eb025bd19bff70dad45bafe1d6eacd134c0ffdfc4c161d045" +checksum = "83f5109b4fd619b9796b9c9901de59d83e3575cd1226c1a36d1901371f43db28" dependencies = [ "async-trait", "bitflags 2.11.1", @@ -4864,9 +4754,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi-io" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ca5dd3b9f04a851c422d05f333366722742da46bff9369ae0191f32cf83565a" +checksum = "74ebe14c586e98d2fdc32c76ca0005ef28348e98ed737e776d378b3b0cc2afd0" dependencies = [ "async-trait", "bytes", @@ -4886,24 +4776,24 @@ dependencies = [ [[package]] name = "wast" -version = "246.0.2" +version = "247.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe3fe8e3bf88ad96d031b4181ddbd64634b17cb0d06dfc3de589ef43591a9a62" +checksum = "579d2d47eb33b0cdf9b14723cb115f1e1b7d6e77aac6f0816e5b7c7aeaa418ff" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width", - "wasm-encoder 0.246.2", + "wasm-encoder 0.247.0", ] [[package]] name = "wat" -version = "1.246.2" +version = "1.247.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd7fda1199b94fff395c2d19a153f05dbe7807630316fa9673367666fd2ad8c" +checksum = "f3f4091c56437e86f2b57fa2fac72c4f528957a605b3f44f7c0b3b19a17ac5ee" dependencies = [ - "wast 246.0.2", + "wast 247.0.0", ] [[package]] @@ -4917,9 +4807,9 @@ dependencies = [ [[package]] name = "wiggle" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1b1135efc8e5a008971897bea8d41ca56d8d501d4efb807842ae0a1c78f639" +checksum = "89cff414ef7dce0cc1cf8a033ff80d3f38e3987c37e3efeec7926ecb5ffaaae6" dependencies = [ "bitflags 2.11.1", "thiserror 2.0.18", @@ -4931,9 +4821,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7bc2b0d50ec8773b44fbfe1da6cb5cc44a92deaf8483233dcf0831e6db33172" +checksum = "ccf9dc7272b151a9616a2699e7f94ea1d4ae253b47b63a79fbc8f38e2cca5fa6" dependencies = [ "heck", "proc-macro2", @@ -4945,9 +4835,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6c7d44ea552e1fbfdcd7a2cd83f5c2d1e803d5b1a11e3462c06888b77f455f" +checksum = "aa7c29fcf738630cba4e35f1805da5e42dde20ee9809ee9202b0648ae671602f" dependencies = [ "proc-macro2", "quote", @@ -4988,9 +4878,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "43.0.1" +version = "44.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f45f7172a2628c8317766e427babc0a400f9d10b1c0f0b0617c5ed5b79de6" +checksum = "9339858ad222412200fd8b1af9e270712201aaec440c7618991443af3446481f" dependencies = [ "cranelift-assembler-x64", "cranelift-codegen", @@ -4999,7 +4889,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 2.0.18", - "wasmparser 0.245.1", + "wasmparser 0.246.2", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-cranelift", @@ -5288,9 +5178,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" [[package]] name = "winx" @@ -5464,9 +5354,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" +checksum = "fd979042b5ff288607ccf3b314145435453f20fc67173195f91062d2289b204d" dependencies = [ "anyhow", "hashbrown 0.16.1", @@ -5478,7 +5368,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.245.1", + "wasmparser 0.246.2", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 57e4e682d..9ff1eda79 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -109,7 +109,7 @@ serde_json = "1.0" tempfile = { version = "3.27.0", default-features = false } proc-macro-error2 = "2" aes = "0.9" -async-compression = "0.4.41" +async-compression = "0.4.42" base64 = "0.22.1" bitflags = "2.11.1" cesu8 = "1.1" @@ -136,7 +136,6 @@ md5 = "0.8" num-bigint = "0.4" num-derive = "0.4" num-traits = "0.2" -num_cpus = "1.17.0" p384 = "0.13.1" phf = "0.13.1" pkcs8 = "=0.11.0-rc.11" @@ -178,8 +177,8 @@ toml = "1.1" ureq = "3.3.0" notify = "8.2.0" -wasmtime = "43.0" -wasmtime-wasi = "43.0" +wasmtime = "44.0" +wasmtime-wasi = "44.0" wit-bindgen = "0.57" wasmparser = "0.247" diff --git a/pumpkin-config/src/chunk.rs b/pumpkin-config/src/chunk.rs index 6d6c697b0..2682539c2 100644 --- a/pumpkin-config/src/chunk.rs +++ b/pumpkin-config/src/chunk.rs @@ -13,12 +13,12 @@ pub enum ChunkConfig { Anvil(AnvilChunkConfig), /// Linear chunk storage format. #[serde(rename = "linear")] - Linear(LinearChunkConfig), + Linear, } impl Default for ChunkConfig { fn default() -> Self { - Self::Linear(LinearChunkConfig::default()) + Self::Anvil(AnvilChunkConfig::default()) } } @@ -61,19 +61,3 @@ pub enum Compression { /// Custom compression algorithm (since 24w05a). Custom, } - -/// Configuration for Linear chunk storage. -#[derive(Deserialize, Serialize, Default, Clone)] -pub struct LinearChunkConfig { - /// Version of the Linear format to use. - pub linear_version: LinearVersion, -} - -/// Versions of the Linear chunk format. -#[derive(Deserialize, Serialize, Default, Clone)] -pub enum LinearVersion { - /// Version 1 (default). - #[default] - V1, - // TODO: V2, -} diff --git a/pumpkin-nbt/src/tag.rs b/pumpkin-nbt/src/tag.rs index ec352a1c8..e38700bd6 100644 --- a/pumpkin-nbt/src/tag.rs +++ b/pumpkin-nbt/src/tag.rs @@ -59,10 +59,10 @@ impl NbtTag { /// represents. If any elements in the `Vec` are found to be of /// different types, this returns [`COMPOUND_ID`]. #[must_use] - fn get_list_element_type_id(vec: &Vec) -> u8 { + fn get_list_element_type_id(list: &[Self]) -> u8 { let mut element_id = END_ID; - for tag in vec { + for tag in list { let id = tag.get_type_id(); if element_id == END_ID { element_id = id; @@ -449,9 +449,7 @@ impl From<&str> for NbtTag { impl From<&[u8]> for NbtTag { fn from(value: &[u8]) -> Self { - let mut cloned = Vec::with_capacity(value.len()); - cloned.copy_from_slice(value); - Self::ByteArray(cloned.into_boxed_slice()) + Self::ByteArray(value.into()) } } diff --git a/pumpkin-world/Cargo.toml b/pumpkin-world/Cargo.toml index ea9e30d3b..2785ed6d2 100644 --- a/pumpkin-world/Cargo.toml +++ b/pumpkin-world/Cargo.toml @@ -52,7 +52,6 @@ rayon.workspace = true tokio-util = { workspace = true, features = ["rt"] } rand.workspace = true -num_cpus.workspace = true rustc-hash.workspace = true slotmap.workspace = true crossfire.workspace = true diff --git a/pumpkin-world/src/chunk/format/anvil.rs b/pumpkin-world/src/chunk/format/anvil.rs index c45827c1f..b02b820f3 100644 --- a/pumpkin-world/src/chunk/format/anvil.rs +++ b/pumpkin-world/src/chunk/format/anvil.rs @@ -1,11 +1,10 @@ -use bytes::{Buf, Bytes}; +use bytes::{Buf, BufMut, Bytes}; use flate2::read::{GzDecoder, GzEncoder, ZlibDecoder, ZlibEncoder}; use itertools::Itertools; use lz4_java_wrc::Context; use pumpkin_config::chunk::AnvilChunkConfig; use pumpkin_util::math::vector2::Vector2; use std::{ - collections::HashSet, io::{Read, SeekFrom, Write}, marker::PhantomData, path::{Path, PathBuf}, @@ -82,7 +81,7 @@ enum WriteAction { // Write the entire file All, // Only write certain indices - Parts(HashSet), + Parts(Vec), } impl WriteAction { @@ -91,9 +90,11 @@ impl WriteAction { /// If we have All enum, do nothing fn maybe_update_chunk_index(&mut self, index: usize) { match self { - Self::Pass => *self = Self::Parts(HashSet::from_iter([index])), + Self::Pass => *self = Self::Parts(vec![index]), Self::Parts(parts) => { - let _ = parts.insert(index); + if !parts.contains(&index) { + parts.push(index); + } } Self::All => {} } @@ -142,7 +143,7 @@ impl Compression { initial_capacity, ) .map_err(CompressionError::LZ4Error), - Self::Custom => todo!(), + Self::Custom => Err(CompressionError::UnknownCompression), } } @@ -281,8 +282,11 @@ impl AnvilChunkData { .await?; w.write_all(&self.compressed_data).await?; - for _ in 0..(padded_size - self.raw_write_size()) { - w.write_u8(0).await?; + + let padding_len = padded_size - self.raw_write_size(); + if padding_len > 0 { + static PADDING: [u8; SECTOR_BYTES] = [0; SECTOR_BYTES]; + w.write_all(&PADDING[..padding_len]).await?; } Ok(()) @@ -361,32 +365,30 @@ impl AnvilChunkFile { let mut write = BufWriter::new(file); // The first two sectors are reserved for the location table - for (index, metadata) in self.chunks_data.iter().enumerate() { + let mut header = Vec::with_capacity(SECTOR_BYTES * 2); + + // Location Table + for metadata in &self.chunks_data { if let Some(chunk) = metadata { - let chunk_data = &chunk.serialized_data; - let sector_count = chunk_data.sector_count(); - trace!( - "Writing position for chunk {} - {}:{}", - index, chunk.file_sector_offset, sector_count - ); - write - .write_u32((chunk.file_sector_offset << 8) | sector_count) - .await?; + let sector_count = chunk.serialized_data.sector_count(); + header.put_u32((chunk.file_sector_offset << 8) | sector_count); } else { - // If the chunk is not present, we write 0 to the location and timestamp tables - write.write_u32(0).await?; + header.put_u32(0); } } + // Timestamp Table for metadata in &self.chunks_data { if let Some(chunk) = metadata { - write.write_u32(chunk.timestamp).await?; + header.put_u32(chunk.timestamp); } else { - // If the chunk is not present, we write 0 to the location and timestamp tables - write.write_u32(0).await?; + header.put_u32(0); } } + // Write all 8 KiB in a single async call + write.write_all(&header).await?; + let mut chunks = indices .into_iter() .map(|index| { @@ -449,44 +451,42 @@ impl AnvilChunkFile { trace!("Writing tmp file to disk: {temp_path:?}"); let file = tokio::fs::File::create(&temp_path).await?; - let mut write = BufWriter::new(file); - // The first two sectors are reserved for the location table + // Build the 8 KiB header in memory + let mut header = Vec::with_capacity(SECTOR_BYTES * 2); let mut current_sector: u32 = 2; + + // Location Table for metadata in &self.chunks_data { if let Some(chunk) = metadata { - let chunk = &chunk.serialized_data; - let sector_count = chunk.sector_count(); - write - .write_u32((current_sector << 8) | sector_count) - .await?; + let sector_count = chunk.serialized_data.sector_count(); + header.put_u32((current_sector << 8) | sector_count); current_sector += sector_count; } else { - // If the chunk is not present, we write 0 to the location and timestamp tables - write.write_u32(0).await?; + header.put_u32(0); } } + // Timestamp Table for metadata in &self.chunks_data { if let Some(chunk) = metadata { - write.write_u32(chunk.timestamp).await?; + header.put_u32(chunk.timestamp); } else { - // If the chunk is not present, we write 0 to the location and timestamp tables - write.write_u32(0).await?; + header.put_u32(0); } } + // Write all 8 KiB in a single async call + write.write_all(&header).await?; + + // Write chunk data for chunk in self.chunks_data.iter().flatten() { chunk.serialized_data.write(&mut write).await?; } write.flush().await?; - // The rename of the file works like an atomic operation ensuring - // that the data is not corrupted before the rename is completed tokio::fs::rename(temp_path, path).await?; - - trace!("Wrote file to Disk: {}", path.display()); Ok(()) } } diff --git a/pumpkin-world/src/chunk/format/linear.rs b/pumpkin-world/src/chunk/format/linear.rs index 2166218a8..6dd0a880b 100644 --- a/pumpkin-world/src/chunk/format/linear.rs +++ b/pumpkin-world/src/chunk/format/linear.rs @@ -8,7 +8,6 @@ use crate::chunk::format::anvil::{AnvilChunkFile, SingleChunkDataSerializer}; use crate::chunk::io::{ChunkSerializer, LoadedData}; use crate::chunk::{ChunkReadingError, ChunkWritingError}; use bytes::{Buf, BufMut, Bytes}; -use pumpkin_config::chunk::LinearChunkConfig; use pumpkin_util::math::vector2::Vector2; use ruzstd::decoding::StreamingDecoder; use ruzstd::encoding::{CompressionLevel, compress_to_vec}; @@ -368,7 +367,7 @@ impl LinearV2File { impl ChunkSerializer for LinearV2File { type Data = S; type WriteBackend = PathBuf; - type ChunkConfig = LinearChunkConfig; + type ChunkConfig = (); fn should_write(&self, is_watched: bool) -> bool { !is_watched diff --git a/pumpkin-world/src/chunk/format/mod.rs b/pumpkin-world/src/chunk/format/mod.rs index 289acf6cd..4c40d11d3 100644 --- a/pumpkin-world/src/chunk/format/mod.rs +++ b/pumpkin-world/src/chunk/format/mod.rs @@ -194,44 +194,6 @@ impl ChunkData { .light_populated .load(std::sync::atomic::Ordering::Relaxed); - let sections = { - let light_lock = self.light_engine.lock().unwrap(); - let block_lock = self.section.block_sections.read().unwrap(); - let biome_lock = self.section.biome_sections.read().unwrap(); - let min_section_y = (self.section.min_y >> 4) as i8; - - (0..self.section.count) - .map(|i| ChunkSectionNBT { - y: i as i8 + min_section_y, - block_states: Some(block_lock[i].to_disk_nbt()), - biomes: Some(biome_lock[i].to_disk_nbt()), - - block_light: match light_lock.block_light.get(i) { - Some(LightContainer::Empty(default)) if *default == 0 => None, - Some(LightContainer::Empty(default)) => { - let value = (*default << 4) | *default; - Some(vec![value; LightContainer::ARRAY_SIZE].into_boxed_slice()) - } - Some(LightContainer::Full(data)) => Some(data.clone()), - None => None, - }, - sky_light: match light_lock.sky_light.get(i) { - Some(LightContainer::Empty(default)) if *default == 0 => None, - Some(LightContainer::Empty(default)) => { - let value = (*default << 4) | *default; - Some(vec![value; LightContainer::ARRAY_SIZE].into_boxed_slice()) - } - Some(LightContainer::Full(data)) => Some(data.clone()), - None => None, - }, - }) - .collect::>() - }; - - // Lock and clone heightmaps - let heightmaps = self.heightmap.lock().unwrap().clone(); - - // Lock and clone entities let entities_to_serialize = { let entities_guard = self.block_entities.lock().unwrap(); entities_guard.values().cloned().collect::>() @@ -246,23 +208,47 @@ impl ChunkData { )) .await; - // Build the final NBT - let nbt = ChunkNbt { + fn extract_light_ref(light: Option<&LightContainer>) -> Option<&[u8]> { + match light { + Some(LightContainer::Full(data)) => Some(data.as_ref()), + _ => None, + } + } + + let light_lock = self.light_engine.lock().unwrap(); + let heightmap_lock = self.heightmap.lock().unwrap(); + let block_lock = self.section.block_sections.read().unwrap(); + let biome_lock = self.section.biome_sections.read().unwrap(); + + let min_section_y = (self.section.min_y >> 4) as i8; + + let sections = (0..self.section.count) + .map(|i| ChunkSectionNbtRef { + y: i as i8 + min_section_y, + block_states: Some(block_lock[i].to_disk_nbt()), + biomes: Some(biome_lock[i].to_disk_nbt()), + block_light: extract_light_ref(light_lock.block_light.get(i)), + sky_light: extract_light_ref(light_lock.sky_light.get(i)), + }) + .collect::>(); + + let nbt_ref = ChunkNbtRef { data_version: WORLD_DATA_VERSION, x_pos: self.x, z_pos: self.z, min_y_section: section_coords::block_to_section(self.section.min_y), - status: self.status, - heightmaps, + status: &self.status, + heightmaps: &heightmap_lock, sections, - block_ticks: self.block_ticks.to_vec(), - fluid_ticks: self.fluid_ticks.to_vec(), - block_entities: block_entities_nbt, + block_ticks: &self.block_ticks.to_vec(), + fluid_ticks: &self.fluid_ticks.to_vec(), + block_entities: &block_entities_nbt, light_correct: is_light_correct, }; let result = - pumpkin_nbt::to_pnbt(&nbt).map_err(ChunkSerializingError::ErrorSerializingChunk)?; + pumpkin_nbt::to_pnbt(&nbt_ref).map_err(ChunkSerializingError::ErrorSerializingChunk)?; + Ok(result.into()) } } @@ -378,6 +364,20 @@ struct ChunkSectionNBT { y: i8, } +#[derive(Serialize)] +#[serde(rename_all = "PascalCase")] +struct ChunkSectionNbtRef<'a> { + #[serde(skip_serializing_if = "Option::is_none")] + block_states: Option, + #[serde(skip_serializing_if = "Option::is_none")] + biomes: Option, + #[serde(skip_serializing_if = "Option::is_none")] + block_light: Option<&'a [u8]>, + #[serde(skip_serializing_if = "Option::is_none")] + sky_light: Option<&'a [u8]>, + y: i8, +} + #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ChunkSectionBiomes { #[serde( @@ -503,6 +503,31 @@ struct ChunkNbt { light_correct: bool, } +// Used ONLY for saving (to_bytes). Borrows data, zero clones. +#[derive(Serialize)] +#[serde(rename_all = "PascalCase")] +struct ChunkNbtRef<'a> { + data_version: i32, + #[serde(rename = "xPos")] + x_pos: i32, + #[serde(rename = "zPos")] + z_pos: i32, + #[serde(rename = "yPos")] + min_y_section: i32, + status: &'a ChunkStatus, + #[serde(rename = "sections")] + sections: Vec>, + heightmaps: &'a ChunkHeightmaps, + #[serde(rename = "block_ticks")] + block_ticks: &'a [ScheduledTick<&'static Block>], + #[serde(rename = "fluid_ticks")] + fluid_ticks: &'a [ScheduledTick<&'static Fluid>], + #[serde(rename = "block_entities")] + block_entities: &'a [NbtCompound], + #[serde(rename = "isLightOn", default)] + light_correct: bool, +} + use pumpkin_nbt::pnbt::PNbtCompound; #[derive(Serialize, Deserialize)] diff --git a/pumpkin-world/src/chunk_system/schedule.rs b/pumpkin-world/src/chunk_system/schedule.rs index 8114e00f7..0a016a2e4 100644 --- a/pumpkin-world/src/chunk_system/schedule.rs +++ b/pumpkin-world/src/chunk_system/schedule.rs @@ -134,7 +134,10 @@ impl GenerationSchedule { } let max_in_flight = if gen_pool.is_some() { - (num_cpus::get() * 4) as u16 + (thread::available_parallelism() + .map(|n| n.get()) + .unwrap_or(1) + * 4) as u16 } else { gen_thread_count as u16 }; diff --git a/pumpkin-world/src/chunk_system/worker_logic.rs b/pumpkin-world/src/chunk_system/worker_logic.rs index 31f629fc5..fe11e8c1d 100644 --- a/pumpkin-world/src/chunk_system/worker_logic.rs +++ b/pumpkin-world/src/chunk_system/worker_logic.rs @@ -7,7 +7,6 @@ use crate::chunk::io::LoadedData; use crate::chunk::io::LoadedData::Loaded; use crate::level::Level; use crossfire::compat::AsyncRx; -use itertools::Itertools; use pumpkin_config::lighting::LightingEngineConfig; use pumpkin_data::chunk::ChunkStatus; use pumpkin_data::chunk_gen_settings::GenerationSettings; @@ -182,7 +181,10 @@ pub async fn io_write_work(recv: AsyncRx>, level: Arc vec.push((pos, chunk)), Chunk::Proto(chunk) => { @@ -193,7 +195,6 @@ pub async fn io_write_work(recv: AsyncRx>, level: Arc>, level: Arc { diff --git a/pumpkin-world/src/generation/noise/aquifer_sampler.rs b/pumpkin-world/src/generation/noise/aquifer_sampler.rs index 3b2df10b5..87e18084f 100644 --- a/pumpkin-world/src/generation/noise/aquifer_sampler.rs +++ b/pumpkin-world/src/generation/noise/aquifer_sampler.rs @@ -45,40 +45,6 @@ impl FluidLevel { } } -#[enum_dispatch(FluidLevelSamplerImpl)] -pub enum FluidLevelSampler { - Static(StaticFluidLevelSampler), - Chunk(StandardChunkFluidLevelSampler), -} - -impl FluidLevelSamplerImpl for FluidLevelSampler { - fn get_fluid_level(&self, x: i32, y: i32, z: i32) -> &FluidLevel { - match self { - Self::Static(sampler) => sampler.get_fluid_level(x, y, z), - Self::Chunk(sampler) => sampler.get_fluid_level(x, y, z), - } - } -} - -pub struct StaticFluidLevelSampler { - fluid_level: FluidLevel, -} - -impl StaticFluidLevelSampler { - #[must_use] - pub const fn new(y: i32, block: &'static Block) -> Self { - Self { - fluid_level: FluidLevel::new(y, block), - } - } -} - -impl FluidLevelSamplerImpl for StaticFluidLevelSampler { - fn get_fluid_level(&self, _x: i32, _y: i32, _z: i32) -> &FluidLevel { - &self.fluid_level - } -} - pub trait FluidLevelSamplerImpl { fn get_fluid_level(&self, x: i32, y: i32, z: i32) -> &FluidLevel; } @@ -108,7 +74,7 @@ macro_rules! local_y { } pub struct WorldAquiferSampler { - fluid_level_sampler: FluidLevelSampler, + fluid_level_sampler: StandardChunkFluidLevelSampler, start_x: i32, start_y: i32, start_z: i32, @@ -142,7 +108,7 @@ impl WorldAquiferSampler { random_deriver: &XoroshiroSplitter, minimum_y: i8, height: u16, - fluid_level: FluidLevelSampler, + fluid_level: StandardChunkFluidLevelSampler, ) -> Self { let start_x = local_xz!(chunk_pos::start_block_x(chunk_x)) - 1; let end_x = local_xz!(chunk_pos::end_block_x(chunk_x)) + 1; @@ -312,7 +278,7 @@ impl WorldAquiferSampler { } fn get_fluid_level( - fluid_level_sampler: &FluidLevelSampler, + fluid_level_sampler: &StandardChunkFluidLevelSampler, block_x: i32, block_y: i32, block_z: i32, @@ -646,12 +612,12 @@ impl AquiferSamplerImpl for WorldAquiferSampler { } pub struct SeaLevelAquiferSampler { - level_sampler: FluidLevelSampler, + level_sampler: StandardChunkFluidLevelSampler, } impl SeaLevelAquiferSampler { #[must_use] - pub const fn new(level_sampler: FluidLevelSampler) -> Self { + pub const fn new(level_sampler: StandardChunkFluidLevelSampler) -> Self { Self { level_sampler } } } @@ -720,7 +686,7 @@ mod random_positions_and_hypot { }, }; - use super::{AquiferSampler, FluidLevel, FluidLevelSampler, WorldAquiferSampler}; + use super::{AquiferSampler, FluidLevel, WorldAquiferSampler}; const SEED: u64 = 0; static RANDOM_CONFIG: LazyLock = @@ -743,10 +709,10 @@ mod random_positions_and_hypot { let chunk_x = 7; let chunk_z = 4; - let sampler = FluidLevelSampler::Chunk(StandardChunkFluidLevelSampler::new( + let sampler = StandardChunkFluidLevelSampler::new( FluidLevel::new(63, &WATER_BLOCK), FluidLevel::new(-54, &LAVA_BLOCK), - )); + ); const CHUNK_WIDTH: usize = 16; let noise = ChunkNoiseGenerator::new( &base_router.noise, diff --git a/pumpkin-world/src/generation/noise/mod.rs b/pumpkin-world/src/generation/noise/mod.rs index bcd6c6429..ec822771a 100644 --- a/pumpkin-world/src/generation/noise/mod.rs +++ b/pumpkin-world/src/generation/noise/mod.rs @@ -12,11 +12,11 @@ use pumpkin_util::{ use crate::generation::{ noise::{ aquifer_sampler::{ - AquiferSampler, AquiferSamplerImpl, FluidLevelSampler, SeaLevelAquiferSampler, - WorldAquiferSampler, + AquiferSampler, AquiferSamplerImpl, SeaLevelAquiferSampler, WorldAquiferSampler, }, ore_sampler::OreVeinSampler, }, + proto_chunk::StandardChunkFluidLevelSampler, section_coords, }; @@ -182,7 +182,7 @@ impl<'a> ChunkNoiseGenerator<'a> { start_block_x: i32, start_block_z: i32, generation_shape: &'a GenerationShapeConfig, - level_sampler: FluidLevelSampler, + level_sampler: StandardChunkFluidLevelSampler, aquifers: bool, ore_veins: bool, ) -> Self { diff --git a/pumpkin-world/src/generation/proto_chunk.rs b/pumpkin-world/src/generation/proto_chunk.rs index ffaa28c6f..8b9d1375b 100644 --- a/pumpkin-world/src/generation/proto_chunk.rs +++ b/pumpkin-world/src/generation/proto_chunk.rs @@ -39,9 +39,7 @@ use crate::chunk::format::LightContainer; use crate::chunk::{ChunkData, ChunkHeightmapType, ChunkLight}; use crate::chunk_system::StagedChunkEnum; use crate::generation::height_limit::HeightLimitView; -use crate::generation::noise::aquifer_sampler::{ - FluidLevel, FluidLevelSampler, FluidLevelSamplerImpl, -}; +use crate::generation::noise::aquifer_sampler::{FluidLevel, FluidLevelSamplerImpl}; use crate::generation::noise::perlin::DoublePerlinNoiseSampler; use crate::generation::noise::router::multi_noise_sampler::MultiNoiseSamplerBuilderOptions; use crate::generation::noise::router::surface_height_sampler::SurfaceHeightSamplerBuilderOptions; @@ -580,13 +578,13 @@ impl ProtoChunk { let start_x = start_block_x(self.x); let start_z = start_block_z(self.z); - let sampler = FluidLevelSampler::Chunk(StandardChunkFluidLevelSampler::new( + let sampler = StandardChunkFluidLevelSampler::new( FluidLevel::new( settings.sea_level, Block::from_state_id(settings.default_fluid.id), ), FluidLevel::new(-54, &Block::LAVA), - )); + ); let mut noise_sampler = ChunkNoiseGenerator::new( &noise_router.noise, diff --git a/pumpkin-world/src/level.rs b/pumpkin-world/src/level.rs index a1851a7cb..5268f430e 100644 --- a/pumpkin-world/src/level.rs +++ b/pumpkin-world/src/level.rs @@ -163,17 +163,15 @@ impl Level { let world_gen = get_world_gen(seed, dimension).into(); let chunk_saver: Arc> = match &level_config.chunk { - ChunkConfig::Linear(config) => Arc::new( - ChunkFileManager::>::new(config.clone()), - ), + ChunkConfig::Linear => Arc::new(ChunkFileManager::>::new(())), ChunkConfig::Anvil(config) => Arc::new( ChunkFileManager::>::new(config.clone()), ), }; let entity_saver: Arc> = match &level_config.chunk { - ChunkConfig::Linear(config) => Arc::new(ChunkFileManager::< - LinearV2File, - >::new(config.clone())), + ChunkConfig::Linear => { + Arc::new(ChunkFileManager::>::new(())) + } ChunkConfig::Anvil(config) => Arc::new(ChunkFileManager::< AnvilChunkFile, >::new(config.clone())), @@ -213,7 +211,11 @@ impl Level { }); // TODO - let total_cores = num_cpus::get().saturating_sub(2).max(1); + let total_cores = thread::available_parallelism() + .map(|n| n.get()) + .unwrap_or(1) + .saturating_sub(2) + .max(1); let threads_per_dimension = (total_cores / 2).max(1); GenerationSchedule::create( diff --git a/pumpkin-world/src/lib.rs b/pumpkin-world/src/lib.rs index b855653ee..3961fa2ac 100644 --- a/pumpkin-world/src/lib.rs +++ b/pumpkin-world/src/lib.rs @@ -50,10 +50,7 @@ pub use generation::{ use crate::generation::{ biome_coords, - noise::{ - CHUNK_DIM, ChunkNoiseGenerator, - aquifer_sampler::{FluidLevel, FluidLevelSampler}, - }, + noise::{CHUNK_DIM, ChunkNoiseGenerator, aquifer_sampler::FluidLevel}, positions::chunk_pos, proto_chunk::TerrainCache, }; @@ -77,13 +74,13 @@ pub fn bench_create_and_populate_noise( // Create noise sampler and other required components let generation_shape = &settings.shape; let horizontal_cell_count = CHUNK_DIM / generation_shape.horizontal_cell_block_count(); - let sampler = FluidLevelSampler::Chunk(StandardChunkFluidLevelSampler::new( + let sampler = StandardChunkFluidLevelSampler::new( FluidLevel::new( settings.sea_level, Block::from_state_id(settings.default_fluid.id), ), FluidLevel::new(-54, &pumpkin_data::Block::LAVA), - )); + ); let start_x = chunk_pos::start_block_x(0); let start_z = chunk_pos::start_block_z(0); @@ -207,13 +204,13 @@ pub fn bench_create_and_populate_noise_with_surface( MultiNoiseSampler::generate(&base_router.multi_noise, &multi_noise_config); // Noise sampler - let sampler = FluidLevelSampler::Chunk(StandardChunkFluidLevelSampler::new( + let sampler = StandardChunkFluidLevelSampler::new( FluidLevel::new( settings.sea_level, Block::from_state_id(settings.default_fluid.id), ), FluidLevel::new(-54, &pumpkin_data::Block::LAVA), - )); + ); let mut noise_sampler = ChunkNoiseGenerator::new( &base_router.noise, diff --git a/pumpkin/Cargo.toml b/pumpkin/Cargo.toml index df41312f0..6d1045efa 100644 --- a/pumpkin/Cargo.toml +++ b/pumpkin/Cargo.toml @@ -20,7 +20,6 @@ doctest = false # pumpkin arc-swap.workspace = true rayon.workspace = true -num_cpus.workspace = true pumpkin-util.workspace = true pumpkin-nbt.workspace = true pumpkin-config.workspace = true diff --git a/pumpkin/src/server/mod.rs b/pumpkin/src/server/mod.rs index 2e29f6e54..bb82c682c 100644 --- a/pumpkin/src/server/mod.rs +++ b/pumpkin/src/server/mod.rs @@ -254,10 +254,8 @@ impl Server { }; let server = Arc::new(server); - let total_cores = num_cpus::get().saturating_sub(2).max(1); let gen_pool = Arc::new( rayon::ThreadPoolBuilder::new() - .num_threads(total_cores) .thread_name(|i| format!("Gen-Pool-{i}")) .build() .expect("Failed to build generation thread pool"),