From 7bdeba982b29fc166873e1c1202ad80116806fbc Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 16 Nov 2024 15:24:46 +0300 Subject: [PATCH] optimize (part 3) --- src/graphics/render/ChunksRenderer.cpp | 45 ++++++++++++++++---------- src/graphics/render/commons.hpp | 2 +- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index fc3b3eb6..02929c25 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -257,31 +257,42 @@ void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) { if (chunkEntries.size() == 1) { auto& entry = chunkEntries.at(0); - if (found->second.planesMesh == nullptr) { - found->second.planesMesh = std::make_shared( + if (found->second.sortedMesh == nullptr) { + found->second.sortedMesh = std::make_shared( entry.vertexData.data(), entry.vertexData.size() / 6, ATTRS ); } - found->second.planesMesh->draw(); + found->second.sortedMesh->draw(); continue; } - std::sort(chunkEntries.begin(), chunkEntries.end()); - size_t size = 0; - for (const auto& entry : chunkEntries) { - size += entry.vertexData.size(); + if (chunkEntries.empty()) { + continue; } - util::Buffer buffer(size); - size_t offset = 0; - for (const auto& entry : chunkEntries) { - std::memcpy( - (buffer.data() + offset), - entry.vertexData.data(), - entry.vertexData.size() * sizeof(float) + + if (found->second.sortedMesh == nullptr) { + std::sort(chunkEntries.begin(), chunkEntries.end()); + size_t size = 0; + for (const auto& entry : chunkEntries) { + size += entry.vertexData.size(); + } + static util::Buffer buffer; + if (buffer.size() < size) { + buffer = util::Buffer(size); + } + size_t offset = 0; + for (const auto& entry : chunkEntries) { + std::memcpy( + (buffer.data() + offset), + entry.vertexData.data(), + entry.vertexData.size() * sizeof(float) + ); + offset += entry.vertexData.size(); + } + found->second.sortedMesh = std::make_shared( + buffer.data(), size / 6, ATTRS ); - offset += entry.vertexData.size(); } - sortedMesh->reload(buffer.data(), size / 6); - sortedMesh->draw(); + found->second.sortedMesh->draw(); } } diff --git a/src/graphics/render/commons.hpp b/src/graphics/render/commons.hpp index fe633012..1bff70f5 100644 --- a/src/graphics/render/commons.hpp +++ b/src/graphics/render/commons.hpp @@ -31,5 +31,5 @@ struct ChunkMeshData { struct ChunkMesh { std::shared_ptr mesh; SortingMeshData sortingMeshData; - std::shared_ptr planesMesh = nullptr; + std::shared_ptr sortedMesh = nullptr; };