Le DeleteChunk est maintenant en multi-thread et peux enfin keep up avec le reste!

This commit is contained in:
MarcEricMartel 2021-12-15 21:00:06 -05:00
parent 2ec9170fe3
commit 5dc05167de
8 changed files with 51 additions and 9 deletions

View File

@ -130,6 +130,10 @@ void Chunk::FlushMeshToVBO() {
delete[] m_vd; delete[] m_vd;
} }
void Chunk::FlushVBO() {
m_vertexBuffer.Flush();
}
void Chunk::Update(BlockInfo* blockinfo[BTYPE_LAST], World* world) { void Chunk::Update(BlockInfo* blockinfo[BTYPE_LAST], World* world) {
float u, v, s; float u, v, s;
// Update mesh // Update mesh

View File

@ -37,6 +37,8 @@ class Chunk {
void Update(BlockInfo* blockinfo[BTYPE_LAST], World* world); void Update(BlockInfo* blockinfo[BTYPE_LAST], World* world);
void FlushMeshToVBO(); void FlushMeshToVBO();
void FlushVBO();
void Render() const; void Render() const;
bool IsDirty() const; bool IsDirty() const;
void MakeDirty(); void MakeDirty();

View File

@ -28,6 +28,7 @@
#define THREADS_GENERATE_CHUNKS 1 #define THREADS_GENERATE_CHUNKS 1
#define THREADS_UPDATE_CHUNKS 1 #define THREADS_UPDATE_CHUNKS 1
#define THREADS_DELETE_CHUNKS 1
#define VIEW_DISTANCE 256 #define VIEW_DISTANCE 256
#define TEXTURE_SIZE 128 #define TEXTURE_SIZE 128
@ -44,6 +45,7 @@
#define THREADS_GENERATE_CHUNKS 12 #define THREADS_GENERATE_CHUNKS 12
#define THREADS_UPDATE_CHUNKS 8 #define THREADS_UPDATE_CHUNKS 8
#define THREADS_DELETE_CHUNKS 10
#define VIEW_DISTANCE 1024 #define VIEW_DISTANCE 1024
#define TEXTURE_SIZE 512 #define TEXTURE_SIZE 512

View File

@ -120,6 +120,9 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) {
ss << " Rendered Chunks : " << m_renderCount; ss << " Rendered Chunks : " << m_renderCount;
PrintText(10, Height() - 35, ss.str()); PrintText(10, Height() - 35, ss.str());
ss.str(""); ss.str("");
ss << " To-Be-Deleted Chunks : " << m_world.GettbDeleted();
PrintText(10, Height() - 45, ss.str());
ss.str("");
ss << " Velocity : " << m_player.GetVelocity(); // IMPORTANT : on utilise l operateur << pour afficher la position ss << " Velocity : " << m_player.GetVelocity(); // IMPORTANT : on utilise l operateur << pour afficher la position
PrintText(10, 10, ss.str()); PrintText(10, 10, ss.str());
ss.str(""); ss.str("");

View File

@ -16,10 +16,7 @@ bool VertexBuffer::IsValid() const {
return m_isValid; return m_isValid;
} }
//std::mutex VertexBuffer::m_opgl;
void VertexBuffer::SetMeshData(VertexData* vd, int vertexCount) { void VertexBuffer::SetMeshData(VertexData* vd, int vertexCount) {
//const std::lock_guard<std::mutex> prout(VertexBuffer::m_opgl);
assert(vertexCount <= USHRT_MAX); assert(vertexCount <= USHRT_MAX);
if(vertexCount == 0) if(vertexCount == 0)
return; return;
@ -77,3 +74,10 @@ int VertexBuffer::Count() const {
return m_vertexCount; return m_vertexCount;
} }
void VertexBuffer::Flush() {
if (m_isValid) {
glDeleteBuffers(1, &m_vertexVboId);
glDeleteBuffers(1, &m_indexVboId);
}
m_isValid = false;
}

View File

@ -31,6 +31,8 @@ class VertexBuffer
int Count() const; int Count() const;
void Flush();
private: private:

View File

@ -109,6 +109,11 @@ void World::CleanUpWorld(int& deleteframes, bool clear = false) {
} }
} }
if (!m_tbDeleted.empty() && !deleteframes) { if (!m_tbDeleted.empty() && !deleteframes) {
int deleted = 0;
while (deleted < THREADS_DELETE_CHUNKS) {
}
delete m_tbDeleted.back(); delete m_tbDeleted.back();
m_tbDeleted.pop_back(); m_tbDeleted.pop_back();
deleteframes = FRAMES_DELETE_CHUNKS; deleteframes = FRAMES_DELETE_CHUNKS;
@ -302,6 +307,7 @@ void World::UpdateWorld(Player& player, Perlin& perlin, BlockInfo* blockinfo[BTY
int threads = 0; int threads = 0;
std::future<Chunk*> genThList[THREADS_GENERATE_CHUNKS]; std::future<Chunk*> genThList[THREADS_GENERATE_CHUNKS];
std::future<Chunk*> updateThList[THREADS_UPDATE_CHUNKS]; std::future<Chunk*> updateThList[THREADS_UPDATE_CHUNKS];
std::future<void> delThList[THREADS_DELETE_CHUNKS];
if (frameGenerate > 0) --frameGenerate; if (frameGenerate > 0) --frameGenerate;
if (frameUpdate > 0) --frameUpdate; if (frameUpdate > 0) --frameUpdate;
@ -446,5 +452,23 @@ void World::UpdateWorld(Player& player, Perlin& perlin, BlockInfo* blockinfo[BTY
} }
} }
CleanUpWorld(frameDelete); threads = 0;
while (!m_tbDeleted.empty() && !frameDelete) {
if (m_tbDeleted.back()) {
m_tbDeleted.back()->FlushVBO();
delThList[threads] =
std::async(std::launch::async,
[](Chunk* chunk) { delete chunk; }, m_tbDeleted.back());
m_tbDeleted.pop_back();
if (++threads > THREADS_DELETE_CHUNKS) frameDelete = FRAMES_DELETE_CHUNKS;
}
else m_tbDeleted.pop_back();
}
for (int x = 0; x < threads; ++x)
delThList[x].wait();
} }
int World::GettbDeleted() const { return m_tbDeleted.size(); }

View File

@ -40,6 +40,7 @@ public:
void ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block); void ChangeBlockAtCursor(BlockType blockType, Player& player, bool& block);
void ChangeBlockAtPosition(BlockType blockType, Vector3f pos); void ChangeBlockAtPosition(BlockType blockType, Vector3f pos);
void CleanUpWorld(int& deleteframes, bool clear); void CleanUpWorld(int& deleteframes, bool clear);
int GettbDeleted() const;
private: private:
Array2d<Chunk*> m_chunks = Array2d<Chunk*>(WORLD_SIZE_X, WORLD_SIZE_Y); Array2d<Chunk*> m_chunks = Array2d<Chunk*>(WORLD_SIZE_X, WORLD_SIZE_Y);
std::vector<Chunk*> m_tbDeleted; std::vector<Chunk*> m_tbDeleted;