]> git.localhorst.tv Git - blank.git/commitdiff
different limits for reading and generating chunks
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 10 Aug 2015 14:48:59 +0000 (16:48 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 10 Aug 2015 14:48:59 +0000 (16:48 +0200)
TODO
src/world/ChunkLoader.hpp
src/world/chunk.cpp

diff --git a/TODO b/TODO
index 1ba83abd0205fa8751dfaf312ae9bbb65ea75c9d..4377b24c543f90d6dff8e8c79e4b61c56d14de3d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -25,6 +25,12 @@ command line
 
        usefull for development and later on world administration
 
+persistence
+
+       add world shutdown state to save dirty chunks when exiting
+
+       store some kind of byte order mark?
+
 networking
 
        exchange of chunks and entities
index b2730a67e15fdcaa2cf1b1e7039cf56d1c507427..81e7178a5f4c4bb203b1a8a5ce72317d8e67823d 100644 (file)
@@ -46,7 +46,8 @@ public:
        void Update(int dt);
 
        std::size_t ToLoad() const noexcept { return to_load.size(); }
-       void LoadOne();
+       // returns true if the chunk was generated
+       bool LoadOne();
        void LoadN(std::size_t n);
 
 private:
index c4ce097922ec1065d5c150d7f7e51b81d7cbbcb7..2d5b7cec853272f1868da71b069760156ab8ca74 100644 (file)
@@ -854,11 +854,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 +893,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 +905,7 @@ void ChunkLoader::LoadOne() {
                if (iter->Position() == pos) {
                        loaded.splice(loaded.end(), to_free, iter);
                        Insert(loaded.back());
-                       return;
+                       return false;
                }
        }
 
@@ -906,14 +918,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;
 }
 
 }