]> git.localhorst.tv Git - blank.git/commitdiff
better chunk memory management
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 20 May 2015 16:46:13 +0000 (18:46 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 20 May 2015 16:46:13 +0000 (18:46 +0200)
Makefile
src/chunk.cpp
src/chunk.hpp

index 67b9bf1b5f200ba9c2b8f9a0b4ec088d362ef15e..36c7048c7ec60202f260e3ecab1b594c4a6debcd 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -59,7 +59,7 @@ callgrind: blank.profile
                --branch-sim=yes --cacheuse=yes --cache-sim=yes \
                --collect-bus=yes --collect-systime=yes --collect-jumps=yes \
                --dump-instr=yes --simulate-hwpref=yes --simulate-wb=yes \
-               ./blank.profile
+               ./blank.profile -n 128 -t 16 --no-keyboard --no-mouse -d --no-vsync
 
 clean:
        rm -df $(OBJ) $(DEP) $(DIR)
index 2da66399407670eb9e1dbc3677c3764c1c6a1fd1..a64e184140f503d4d343b26c04207571db0c459e 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "generator.hpp"
 
+#include <algorithm>
 #include <limits>
 #include <queue>
 #include <glm/gtx/transform.hpp>
@@ -11,9 +12,9 @@ namespace blank {
 
 Chunk::Chunk(const BlockTypeRegistry &types)
 : types(&types)
-, neighbor{ 0, 0, 0, 0, 0, 0 }
-, blocks()
-, light()
+, neighbor{0}
+, blocks{}
+, light{0}
 , model()
 , position(0, 0, 0)
 , dirty(false) {
@@ -22,23 +23,19 @@ Chunk::Chunk(const BlockTypeRegistry &types)
 
 Chunk::Chunk(Chunk &&other)
 : types(other.types)
-, blocks(std::move(other.blocks))
-, light(std::move(other.light))
 , model(std::move(other.model))
 , position(other.position)
 , dirty(other.dirty) {
-       for (size_t i = 0; i < Block::FACE_COUNT; ++i) {
-               neighbor[i] = other.neighbor[i];
-       }
+       std::copy(other.neighbor, other.neighbor + sizeof(neighbor), neighbor);
+       std::copy(other.blocks, other.blocks + sizeof(blocks), blocks);
+       std::copy(other.light, other.light + sizeof(light), light);
 }
 
 Chunk &Chunk::operator =(Chunk &&other) {
        types = other.types;
-       for (size_t i = 0; i < Block::FACE_COUNT; ++i) {
-               neighbor[i] = other.neighbor[i];
-       }
-       blocks = std::move(other.blocks);
-       light = std::move(other.light);
+       std::copy(other.neighbor, other.neighbor + sizeof(neighbor), neighbor);
+       std::copy(other.blocks, other.blocks + sizeof(blocks), blocks);
+       std::copy(other.light, other.light + sizeof(light), light);
        model = std::move(other.model);
        position = other.position;
        dirty = other.dirty;
@@ -413,12 +410,6 @@ bool Chunk::IsSurface(const Pos &pos) const {
 }
 
 
-void Chunk::Allocate() {
-       blocks.resize(Size(), Block(0));
-       light.resize(Size(), 0);
-}
-
-
 void Chunk::Draw() {
        if (dirty) {
                Update();
@@ -778,7 +769,6 @@ Chunk &ChunkLoader::Generate(const Chunk::Pos &pos) {
        loaded.emplace_back(reg);
        Chunk &chunk = loaded.back();
        chunk.Position(pos);
-       chunk.Allocate();
        gen(chunk);
        Insert(chunk);
        return chunk;
@@ -872,39 +862,31 @@ void ChunkLoader::GenerateSurrounding(const Chunk::Pos &pos) {
 }
 
 void ChunkLoader::Update() {
-       bool reused = false;
-       if (!to_generate.empty()) {
-               Chunk::Pos pos(to_generate.front());
-
-               for (auto iter(to_free.begin()), end(to_free.end()); iter != end; ++iter) {
-                       if (iter->Position() == pos) {
-                               iter->Relink();
-                               loaded.splice(loaded.end(), to_free, iter);
-                               reused = true;
-                               break;
-                       }
-               }
+       if (to_generate.empty()) {
+               return;
+       }
 
-               if (!reused) {
-                       if (to_free.empty()) {
-                               loaded.emplace_back(reg);
-                       } else {
-                               to_free.front().ClearNeighbors();
-                               loaded.splice(loaded.end(), to_free, to_free.begin());
-                               reused = true;
-                       }
-                       Chunk &chunk = loaded.back();
-                       chunk.Position(pos);
-                       chunk.Allocate();
-                       gen(chunk);
-                       Insert(chunk);
+       Chunk::Pos pos(to_generate.front());
+       to_generate.pop_front();
+
+       for (auto iter(to_free.begin()), end(to_free.end()); iter != end; ++iter) {
+               if (iter->Position() == pos) {
+                       iter->Relink();
+                       loaded.splice(loaded.end(), to_free, iter);
+                       return;
                }
-               to_generate.pop_front();
        }
 
-       if (!reused && !to_free.empty()) {
-               to_free.pop_front();
+       if (to_free.empty()) {
+               loaded.emplace_back(reg);
+       } else {
+               to_free.front().ClearNeighbors();
+               loaded.splice(loaded.end(), to_free, to_free.begin());
        }
+       Chunk &chunk = loaded.back();
+       chunk.Position(pos);
+       gen(chunk);
+       Insert(chunk);
 }
 
 }
index 32f75056bfaba0494ffe2873fd292680920bb008..fa19776ca60b063ee0a10aca4d2ea35d207a9c5c 100644 (file)
@@ -91,7 +91,6 @@ public:
        // check if block at given index is completely enclosed (and therefore invisible)
        bool Obstructed(int idx) const;
 
-       void Allocate();
        void Invalidate() { dirty = true; }
 
        void SetBlock(int index, const Block &);
@@ -146,8 +145,8 @@ private:
 private:
        const BlockTypeRegistry *types;
        Chunk *neighbor[Block::FACE_COUNT];
-       std::vector<Block> blocks;
-       std::vector<unsigned char> light;
+       Block blocks[16 * 16 * 16];
+       unsigned char light[16 * 16 * 16];
        BlockModel model;
        Pos position;
        bool dirty;