From 1f73dc5d5e5bb49ff9a4648b424efe50b69e239c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 9 Dec 2025 01:20:41 +0300 Subject: [PATCH] feat: pre-read region chunks offsets table --- src/world/files/RegionsLayer.cpp | 20 ++++++++++++++++---- src/world/files/WorldRegions.hpp | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/world/files/RegionsLayer.cpp b/src/world/files/RegionsLayer.cpp index 2da2bd011..04821d463 100644 --- a/src/world/files/RegionsLayer.cpp +++ b/src/world/files/RegionsLayer.cpp @@ -50,6 +50,20 @@ regfile::regfile(io::path filename) : file(filename), filename(filename) { " is not supported in " + filename.string() ); } + + size_t file_size = file.length(); + size_t table_offset = file_size - REGION_CHUNKS_COUNT * 4; + + file.seekg(table_offset); + file.read( + reinterpret_cast(offsets.data()), + sizeof(uint32_t) * REGION_CHUNKS_COUNT + ); + if (dataio::is_big_endian()) { + for (size_t i = 0; i < offsets.size(); i++) { + offsets[i] = dataio::le2h(i); + } + } } std::unique_ptr regfile::read( @@ -58,14 +72,12 @@ std::unique_ptr regfile::read( size_t file_size = file.length(); size_t table_offset = file_size - REGION_CHUNKS_COUNT * 4; - uint32_t buff32; - file.seekg(table_offset + index * 4); - file.read(reinterpret_cast(&buff32), 4); - uint32_t offset = dataio::le2h(buff32); + uint32_t offset = offsets.at(index); if (offset == 0) { return nullptr; } + uint32_t buff32; file.seekg(offset); file.read(reinterpret_cast(&buff32), 4); size = dataio::le2h(buff32); diff --git a/src/world/files/WorldRegions.hpp b/src/world/files/WorldRegions.hpp index 3b4a63fa6..e3bf2774a 100644 --- a/src/world/files/WorldRegions.hpp +++ b/src/world/files/WorldRegions.hpp @@ -55,6 +55,7 @@ struct regfile { io::path filename; int version; bool inUse = false; + std::array offsets; regfile(io::path filename); regfile(const regfile&) = delete;