Le DeleteChunk est maintenant en multi-thread et peux enfin keep up avec le reste!
This commit is contained in:
parent
2ec9170fe3
commit
5dc05167de
@ -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
|
||||||
|
@ -36,6 +36,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;
|
||||||
|
@ -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
|
||||||
|
@ -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("");
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -31,6 +31,8 @@ class VertexBuffer
|
|||||||
|
|
||||||
int Count() const;
|
int Count() const;
|
||||||
|
|
||||||
|
void Flush();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -54,7 +54,7 @@ void World::TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]) {
|
|||||||
if (ax - x >= 0) {
|
if (ax - x >= 0) {
|
||||||
m_chunks.Set(ax - x, ay,
|
m_chunks.Set(ax - x, ay,
|
||||||
m_chunks.Remove(ax, ay));
|
m_chunks.Remove(ax, ay));
|
||||||
if (ax == WORLD_SIZE_X - 1 && m_chunks.Get(ax - x, ay))
|
if (ax == WORLD_SIZE_X - 1 && m_chunks.Get(ax - x, ay))
|
||||||
m_chunks.Get(ax - x, ay)->MakeDirty();
|
m_chunks.Get(ax - x, ay)->MakeDirty();
|
||||||
}
|
}
|
||||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||||
@ -65,7 +65,7 @@ void World::TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]) {
|
|||||||
if (ax - x < WORLD_SIZE_X) {
|
if (ax - x < WORLD_SIZE_X) {
|
||||||
m_chunks.Set(ax - x, ay,
|
m_chunks.Set(ax - x, ay,
|
||||||
m_chunks.Remove(ax, ay));
|
m_chunks.Remove(ax, ay));
|
||||||
if (ax == 0 && m_chunks.Get(ax - x, ay))
|
if (ax == 0 && m_chunks.Get(ax - x, ay))
|
||||||
m_chunks.Get(ax - x, ay)->MakeDirty();
|
m_chunks.Get(ax - x, ay)->MakeDirty();
|
||||||
}
|
}
|
||||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||||
@ -77,7 +77,7 @@ void World::TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]) {
|
|||||||
if (ay - y >= 0) {
|
if (ay - y >= 0) {
|
||||||
m_chunks.Set(ax, ay - y,
|
m_chunks.Set(ax, ay - y,
|
||||||
m_chunks.Remove(ax, ay));
|
m_chunks.Remove(ax, ay));
|
||||||
if (ay == WORLD_SIZE_Y - 1 && m_chunks.Get(ax, ay - y))
|
if (ay == WORLD_SIZE_Y - 1 && m_chunks.Get(ax, ay - y))
|
||||||
m_chunks.Get(ax, ay - y)->MakeDirty();
|
m_chunks.Get(ax, ay - y)->MakeDirty();
|
||||||
}
|
}
|
||||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||||
@ -88,7 +88,7 @@ void World::TransposeWorld(Player& player, Bullet* bullets[MAX_BULLETS]) {
|
|||||||
if (ay - y < WORLD_SIZE_Y) {
|
if (ay - y < WORLD_SIZE_Y) {
|
||||||
m_chunks.Set(ax, ay - y,
|
m_chunks.Set(ax, ay - y,
|
||||||
m_chunks.Remove(ax, ay));
|
m_chunks.Remove(ax, ay));
|
||||||
if (ay == 0 && m_chunks.Get(ax, ay - y))
|
if (ay == 0 && m_chunks.Get(ax, ay - y))
|
||||||
m_chunks.Get(ax, ay - y)->MakeDirty();
|
m_chunks.Get(ax, ay - y)->MakeDirty();
|
||||||
}
|
}
|
||||||
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
else if (m_chunks.Get(ax, ay)) m_tbDeleted.emplace_back(m_chunks.Remove(ax, ay));
|
||||||
@ -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(); }
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user