aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2010-11-29 13:03:30 +0200
committerPerttu Ahola <celeron55@gmail.com>2010-11-29 13:03:30 +0200
commit3ad212c90b280f2f9630d3ffe453ff82c71e7516 (patch)
tree744eb693fbe12912bd2f06636ee34ff36466d58b
parentc18af6e728fc15ccec65c5c3c8a5c44f0d0a86a1 (diff)
downloadminetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.tar.gz
minetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.tar.bz2
minetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.zip
meshbuffer cache test. No much speed improvement.
-rw-r--r--src/mapblock.cpp62
1 files changed, 48 insertions, 14 deletions
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index 25561008a..f525ed3e9 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -297,6 +297,8 @@ void MapBlock::updateMesh()
core::list<FastFace*> *fastfaces_new = new core::list<FastFace*>;
+ //TimeTaker timer1("updateMesh1", g_device);
+
/*
We are including the faces of the trailing edges of the block.
This means that when something changes, the caller must
@@ -340,12 +342,26 @@ void MapBlock::updateMesh()
}
}
+ //timer1.stop();
+ //TimeTaker timer2("updateMesh2", g_device);
+
scene::SMesh *mesh_new = NULL;
+
+ //s32 appendtime = 0;
if(fastfaces_new->getSize() > 0)
{
mesh_new = new scene::SMesh();
scene::IMeshBuffer *buf = NULL;
+
+ /*
+ Buffer for lesser calls to
+ mesh_new->getMeshBuffer(g_materials[f->material]),
+ which is slow.
+
+ key = material id, value = meshbuffer of that material
+ */
+ core::map<u8, scene::IMeshBuffer*> bufs;
core::list<FastFace*>::Iterator i = fastfaces_new->begin();
@@ -359,27 +375,43 @@ void MapBlock::updateMesh()
if(f->material != material_in_use || buf == NULL)
{
// Try to get a meshbuffer associated with the material
- buf = mesh_new->getMeshBuffer(g_materials[f->material]);
- // If not found, create one
- if(buf == NULL)
+ core::map<u8, scene::IMeshBuffer*>::Node*
+ n = bufs.find(f->material);
+
+ if(n != NULL)
{
- // This is a "Standard MeshBuffer",
- // it's a typedeffed CMeshBuffer<video::S3DVertex>
- buf = new scene::SMeshBuffer();
- // Set material
- ((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
- // Use VBO
- //buf->setHardwareMappingHint(scene::EHM_STATIC);
- // Add to mesh
- mesh_new->addMeshBuffer(buf);
- // Mesh grabbed it
- buf->drop();
+ buf = n->getValue();
+ }
+ else
+ {
+ buf = mesh_new->getMeshBuffer(g_materials[f->material]);
+ // If not found, create one
+ if(buf == NULL)
+ {
+ // This is a "Standard MeshBuffer",
+ // it's a typedeffed CMeshBuffer<video::S3DVertex>
+ buf = new scene::SMeshBuffer();
+ bufs[f->material] = buf;
+ // Set material
+ ((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
+ // Use VBO
+ //buf->setHardwareMappingHint(scene::EHM_STATIC);
+ // Add to mesh
+ mesh_new->addMeshBuffer(buf);
+ // Mesh grabbed it
+ buf->drop();
+ }
}
material_in_use = f->material;
}
u16 indices[] = {0,1,2,2,3,0};
+
+ //TimeTaker timer("", g_device);
+
buf->append(f->vertices, 4, indices, 6);
+
+ //appendtime += timer.stop(true);
}
// Use VBO for mesh (this just would set this for ever buffer)
@@ -390,6 +422,8 @@ void MapBlock::updateMesh()
<<" materials"<<std::endl;*/
}
+ //dstream<<"appendtime="<<appendtime<<std::endl;
+
// TODO: Get rid of the FastFace stage
core::list<FastFace*>::Iterator i;
i = fastfaces_new->begin();