move BlocksRenderer voxels buffer fill to main thread

This commit is contained in:
MihailRis 2025-12-18 00:30:33 +03:00
parent 0c62951062
commit c46a6ad3bd
4 changed files with 81 additions and 45 deletions

View file

@ -12,24 +12,22 @@
#include "window/Camera.hpp"
#include "maths/FrustumCulling.hpp"
#include "util/listutil.hpp"
#include "util/ObjectsPool.hpp"
#include "settings.hpp"
static debug::Logger logger("chunks-render");
size_t ChunksRenderer::visibleChunks = 0;
class RendererWorker : public util::Worker<std::shared_ptr<Chunk>, RendererResult> {
const Chunks& chunks;
class RendererWorker : public util::Worker<RendererJob, RendererResult> {
BlocksRenderer renderer;
public:
RendererWorker(
const Level& level,
const Chunks& chunks,
const ContentGfxCache& cache,
const EngineSettings& settings
)
: chunks(chunks),
renderer(
: renderer(
settings.graphics.denseRender.get()
? settings.graphics.chunkMaxVerticesDense.get()
: settings.graphics.chunkMaxVertices.get(),
@ -39,8 +37,10 @@ public:
) {
}
RendererResult operator()(const std::shared_ptr<Chunk>& chunk) override {
renderer.build(chunk.get(), &chunks);
RendererResult operator()(const RendererJob& job) override {
auto chunk = job.chunk;
auto volume = job.volume;
renderer.build(chunk.get(), *volume);
if (renderer.isCancelled()) {
return RendererResult {
glm::ivec2(chunk->x, chunk->z), true, ChunkMeshData {}};
@ -51,6 +51,9 @@ public:
}
};
static util::ObjectsPool<VoxelsVolume> voxelsVolumesPool {};
static inline const int VOXELS_BUFFER_PADDING = 2;
ChunksRenderer::ChunksRenderer(
const Level* level,
const Chunks& chunks,
@ -67,7 +70,7 @@ ChunksRenderer::ChunksRenderer(
"chunks-render-pool",
[&]() {
return std::make_shared<RendererWorker>(
*level, chunks, cache, settings
*level, cache, settings
);
},
[&](RendererResult& result) {
@ -87,30 +90,61 @@ ChunksRenderer::ChunksRenderer(
level->content, cache, settings
);
logger.info() << "created " << threadPool.getWorkersCount() << " workers";
logger.info() << "memory consumption is "
<< renderer->getMemoryConsumption() * threadPool.getWorkersCount()
<< " B";
logger.info() << "memory consumption is "
<< renderer->getMemoryConsumption() *
threadPool.getWorkersCount() +
voxelsVolumesPool.countTotal() *
(sizeof(VoxelsVolume) +
(CHUNK_W + VOXELS_BUFFER_PADDING * 2) * CHUNK_H *
(CHUNK_D + VOXELS_BUFFER_PADDING * 2) *
(sizeof(voxel) + sizeof(light_t)))
<< " B";
}
ChunksRenderer::~ChunksRenderer() = default;
std::shared_ptr<VoxelsVolume> ChunksRenderer::prepareVoxelsVolume(
const Chunk& chunk
) {
auto voxelsBuffer = voxelsVolumesPool.create(
CHUNK_W + VOXELS_BUFFER_PADDING * 2,
CHUNK_H,
CHUNK_D + VOXELS_BUFFER_PADDING * 2
);
voxelsBuffer->setPosition(
chunk.x * CHUNK_W - VOXELS_BUFFER_PADDING, 0,
chunk.z * CHUNK_D - VOXELS_BUFFER_PADDING
);
chunks.getVoxels(
*voxelsBuffer, settings.graphics.backlight.get(), chunk.top + 1
);
return voxelsBuffer;
}
const Mesh<ChunkVertex>* ChunksRenderer::render(
const std::shared_ptr<Chunk>& chunk, bool important
) {
glm::ivec2 key(chunk->x, chunk->z);
chunk->flags.modified = false;
if (important) {
auto mesh = renderer->render(chunk.get(), &chunks);
meshes[glm::ivec2(chunk->x, chunk->z)] = ChunkMesh {
std::move(mesh.mesh), std::move(mesh.sortingMeshData)
};
auto voxelsBuffer = prepareVoxelsVolume(*chunk);
inwork[key] = true;
auto mesh = renderer->render(chunk.get(), *voxelsBuffer);
meshes[glm::ivec2(chunk->x, chunk->z)] =
ChunkMesh {std::move(mesh.mesh), std::move(mesh.sortingMeshData)};
return meshes[glm::ivec2(chunk->x, chunk->z)].mesh.get();
}
glm::ivec2 key(chunk->x, chunk->z);
if (inwork.find(key) != inwork.end()) {
return nullptr;
}
auto voxelsBuffer = prepareVoxelsVolume(*chunk);
inwork[key] = true;
threadPool.enqueueJob(chunk);
chunks.getVoxels(
*voxelsBuffer, settings.graphics.backlight.get(), chunk->top + 1
);
threadPool.enqueueJob({chunk, std::move(voxelsBuffer)});
return nullptr;
}