optimize a bit

This commit is contained in:
MihailRis
2024-11-17 03:19:55 +03:00
parent 5240fe6226
commit bd4a5ef7fc
3 changed files with 46 additions and 51 deletions
+1 -3
View File
@@ -12,8 +12,6 @@
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include "util/timeutil.hpp"
const glm::vec3 BlocksRenderer::SUN_VECTOR (0.411934f, 0.863868f, -0.279161f); const glm::vec3 BlocksRenderer::SUN_VECTOR (0.411934f, 0.863868f, -0.279161f);
BlocksRenderer::BlocksRenderer( BlocksRenderer::BlocksRenderer(
@@ -607,7 +605,7 @@ SortingMeshData BlocksRenderer::renderTranslucent(
return sortingMesh; return sortingMesh;
} }
void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) {; void BlocksRenderer::build(const Chunk* chunk, const Chunks* chunks) {
this->chunk = chunk; this->chunk = chunk;
voxelsBuffer->setPosition( voxelsBuffer->setPosition(
chunk->x * CHUNK_W - voxelBufferPadding, 0, chunk->x * CHUNK_W - voxelBufferPadding, 0,
+44 -45
View File
@@ -14,12 +14,9 @@
#include "util/listutil.hpp" #include "util/listutil.hpp"
#include "settings.hpp" #include "settings.hpp"
#include <iostream>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/ext.hpp> #include <glm/ext.hpp>
#include "util/timeutil.hpp"
static debug::Logger logger("chunks-render"); static debug::Logger logger("chunks-render");
size_t ChunksRenderer::visibleChunks = 0; size_t ChunksRenderer::visibleChunks = 0;
@@ -79,9 +76,6 @@ ChunksRenderer::ChunksRenderer(
*level->content, cache, settings *level->content, cache, settings
); );
logger.info() << "created " << threadPool.getWorkersCount() << " workers"; logger.info() << "created " << threadPool.getWorkersCount() << " workers";
float buf[1]{};
sortedMesh = std::make_unique<Mesh>(buf, 0, CHUNK_VATTRS);
} }
ChunksRenderer::~ChunksRenderer() { ChunksRenderer::~ChunksRenderer() {
@@ -137,12 +131,12 @@ void ChunksRenderer::update() {
threadPool.update(); threadPool.update();
} }
bool ChunksRenderer::drawChunk( const Mesh* ChunksRenderer::retrieveChunk(
size_t index, const Camera& camera, Shader& shader, bool culling size_t index, const Camera& camera, Shader& shader, bool culling
) { ) {
auto chunk = level.chunks->getChunks()[index]; auto chunk = level.chunks->getChunks()[index];
if (chunk == nullptr || !chunk->flags.lighted) { if (chunk == nullptr || !chunk->flags.lighted) {
return false; return nullptr;
} }
float distance = glm::distance( float distance = glm::distance(
camera.position, camera.position,
@@ -154,7 +148,7 @@ bool ChunksRenderer::drawChunk(
); );
auto mesh = getOrRender(chunk, distance < CHUNK_W * 1.5f); auto mesh = getOrRender(chunk, distance < CHUNK_W * 1.5f);
if (mesh == nullptr) { if (mesh == nullptr) {
return false; return nullptr;
} }
if (culling) { if (culling) {
glm::vec3 min(chunk->x * CHUNK_W, chunk->bottom, chunk->z * CHUNK_D); glm::vec3 min(chunk->x * CHUNK_W, chunk->bottom, chunk->z * CHUNK_D);
@@ -164,13 +158,9 @@ bool ChunksRenderer::drawChunk(
chunk->z * CHUNK_D + CHUNK_D chunk->z * CHUNK_D + CHUNK_D
); );
if (!frustum.isBoxVisible(min, max)) return false; if (!frustum.isBoxVisible(min, max)) return nullptr;
} }
glm::vec3 coord(chunk->x * CHUNK_W + 0.5f, 0.5f, chunk->z * CHUNK_D + 0.5f); return mesh;
glm::mat4 model = glm::translate(glm::mat4(1.0f), coord);
shader.uniformMatrix("u_model", model);
mesh->draw();
return true;
} }
void ChunksRenderer::drawChunks( void ChunksRenderer::drawChunks(
@@ -207,19 +197,38 @@ void ChunksRenderer::drawChunks(
visibleChunks = 0; visibleChunks = 0;
shader.uniform1i("u_alphaClip", true); shader.uniform1i("u_alphaClip", true);
//if (GLEW_ARB_multi_draw_indirect && false) {
// TODO: implement Multi Draw Indirect chunks draw // TODO: minimize draw calls number
//} else { for (size_t i = 0; i < indices.size(); i++) {
for (size_t i = 0; i < indices.size(); i++) { auto chunk = chunks.getChunks()[indices[i].index];
visibleChunks += drawChunk(indices[i].index, camera, shader, culling); auto mesh = retrieveChunk(indices[i].index, camera, shader, culling);
if (mesh) {
glm::vec3 coord(chunk->x * CHUNK_W + 0.5f, 0.5f, chunk->z * CHUNK_D + 0.5f);
glm::mat4 model = glm::translate(glm::mat4(1.0f), coord);
shader.uniformMatrix("u_model", model);
mesh->draw();
visibleChunks++;
} }
//} }
}
static inline void write_sorting_mesh_entries(
float* buffer, const std::vector<SortingMeshEntry>& chunkEntries
) {
for (const auto& entry : chunkEntries) {
const auto& vertexData = entry.vertexData;
std::memcpy(
buffer,
vertexData.data(),
vertexData.size() * sizeof(float)
);
buffer += vertexData.size();
}
} }
void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) { void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) {
timeutil::ScopeLogTimer log(444); const int sortInterval = 8;
const int sortInterval = 6;
static int frameid = 0; static int frameid = 0;
frameid++; frameid++;
@@ -238,26 +247,22 @@ void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) {
continue; continue;
} }
const auto& found = meshes.find(glm::ivec2(chunk->x, chunk->z)); const auto& found = meshes.find(glm::ivec2(chunk->x, chunk->z));
if (found == meshes.end()) { if (found == meshes.end() || found->second.sortingMeshData.entries.empty()) {
continue; continue;
} }
glm::vec3 min( glm::vec3 min(chunk->x * CHUNK_W, chunk->bottom, chunk->z * CHUNK_D);
chunk->x * CHUNK_W - CHUNK_W, 0, chunk->z * CHUNK_D - CHUNK_D
);
glm::vec3 max( glm::vec3 max(
chunk->x * CHUNK_W + CHUNK_W*2, chunk->x * CHUNK_W + CHUNK_W,
CHUNK_H, chunk->top,
chunk->z * CHUNK_D + CHUNK_D*2 chunk->z * CHUNK_D + CHUNK_D
); );
if (!frustum.isBoxVisible(min, max)) continue; if (!frustum.isBoxVisible(min, max)) continue;
auto& chunkEntries = found->second.sortingMeshData.entries; auto& chunkEntries = found->second.sortingMeshData.entries;
if (chunkEntries.empty()) { if (chunkEntries.size() == 1) {
continue;
} else if (chunkEntries.size() == 1) {
auto& entry = chunkEntries.at(0); auto& entry = chunkEntries.at(0);
if (found->second.sortedMesh == nullptr) { if (found->second.sortedMesh == nullptr) {
found->second.sortedMesh = std::make_unique<Mesh>( found->second.sortedMesh = std::make_unique<Mesh>(
@@ -270,8 +275,9 @@ void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) {
continue; continue;
} }
for (auto& entry : chunkEntries) { for (auto& entry : chunkEntries) {
entry.distance = entry.distance = static_cast<long long>(
static_cast<long long>(glm::distance2(entry.position, cameraPos)); glm::distance2(entry.position, cameraPos)
);
} }
if (found->second.sortedMesh == nullptr || if (found->second.sortedMesh == nullptr ||
(frameid + chunk->x) % sortInterval == 0) { (frameid + chunk->x) % sortInterval == 0) {
@@ -280,19 +286,12 @@ void ChunksRenderer::drawSortedMeshes(const Camera& camera, Shader& shader) {
for (const auto& entry : chunkEntries) { for (const auto& entry : chunkEntries) {
size += entry.vertexData.size(); size += entry.vertexData.size();
} }
static util::Buffer<float> buffer; static util::Buffer<float> buffer;
if (buffer.size() < size) { if (buffer.size() < size) {
buffer = util::Buffer<float>(size); buffer = util::Buffer<float>(size);
} }
size_t offset = 0; write_sorting_mesh_entries(buffer.data(), chunkEntries);
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_unique<Mesh>( found->second.sortedMesh = std::make_unique<Mesh>(
buffer.data(), size / CHUNK_VERTEX_SIZE, CHUNK_VATTRS buffer.data(), size / CHUNK_VERTEX_SIZE, CHUNK_VATTRS
); );
+1 -3
View File
@@ -50,11 +50,9 @@ class ChunksRenderer {
std::unordered_map<glm::ivec2, bool> inwork; std::unordered_map<glm::ivec2, bool> inwork;
std::vector<ChunksSortEntry> indices; std::vector<ChunksSortEntry> indices;
util::ThreadPool<std::shared_ptr<Chunk>, RendererResult> threadPool; util::ThreadPool<std::shared_ptr<Chunk>, RendererResult> threadPool;
const Mesh* retrieveChunk(
bool drawChunk(
size_t index, const Camera& camera, Shader& shader, bool culling size_t index, const Camera& camera, Shader& shader, bool culling
); );
std::unique_ptr<Mesh> sortedMesh;
public: public:
ChunksRenderer( ChunksRenderer(
const Level* level, const Level* level,