X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fchunk.cpp;h=a6decf70906408558fc68f08a790da5225c126b8;hb=ede25c0a2f59e21521d1cd962e6ea9d78169ca12;hp=c4ce097922ec1065d5c150d7f7e51b81d7cbbcb7;hpb=551573ecb04969696f916aeb5485658e298a7f6b;p=blank.git diff --git a/src/world/chunk.cpp b/src/world/chunk.cpp index c4ce097..a6decf7 100644 --- a/src/world/chunk.cpp +++ b/src/world/chunk.cpp @@ -4,7 +4,7 @@ #include "Generator.hpp" #include "WorldCollision.hpp" -#include "WorldSave.hpp" +#include "../io/WorldSave.hpp" #include #include @@ -772,6 +772,10 @@ std::list::iterator ChunkLoader::Remove(std::list::iterator chunk) ++next; // unlink neighbors so they won't reference a dead chunk chunk->ClearNeighbors(); + // if it should be saved, do it now + if (chunk->ShouldUpdateSave()) { + save.Write(*chunk); + } // and move it from loaded to free list to_free.splice(to_free.end(), loaded, chunk); return next; @@ -854,11 +858,23 @@ void ChunkLoader::QueueSurrounding(const Chunk::Pos &pos) { } void ChunkLoader::Update(int dt) { - // check if a chunk generation is scheduled for this frame - // and if there's a chunk waiting to be generated + // check if a chunk load is scheduled for this frame + // and if there's chunks waiting to be loaded gen_timer.Update(dt); if (gen_timer.Hit()) { - LoadOne(); + // we may + // load until one of load or generation limits was hit + constexpr int max_load = 10; + constexpr int max_gen = 1; + int loaded = 0; + int generated = 0; + while (!to_load.empty() && loaded < max_load && generated < max_gen) { + if (LoadOne()) { + ++generated; + } else { + ++loaded; + } + } } constexpr int max_save = 10; @@ -881,8 +897,8 @@ void ChunkLoader::LoadN(std::size_t n) { } } -void ChunkLoader::LoadOne() { - if (to_load.empty()) return; +bool ChunkLoader::LoadOne() { + if (to_load.empty()) return false; // take position of next chunk in queue Chunk::Pos pos(to_load.front()); @@ -893,7 +909,7 @@ void ChunkLoader::LoadOne() { if (iter->Position() == pos) { loaded.splice(loaded.end(), to_free, iter); Insert(loaded.back()); - return; + return false; } } @@ -906,14 +922,17 @@ void ChunkLoader::LoadOne() { loaded.splice(loaded.end(), to_free, to_free.begin()); } + bool generated = false; Chunk &chunk = loaded.back(); chunk.Position(pos); if (save.Exists(pos)) { save.Read(chunk); } else { gen(chunk); + generated = true; } Insert(chunk); + return generated; } }