diff options
author | Perttu Ahola <celeron55@gmail.com> | 2010-11-29 13:03:30 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2010-11-29 13:03:30 +0200 |
commit | 3ad212c90b280f2f9630d3ffe453ff82c71e7516 (patch) | |
tree | 744eb693fbe12912bd2f06636ee34ff36466d58b | |
parent | c18af6e728fc15ccec65c5c3c8a5c44f0d0a86a1 (diff) | |
download | minetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.tar.gz minetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.tar.bz2 minetest-3ad212c90b280f2f9630d3ffe453ff82c71e7516.zip |
meshbuffer cache test. No much speed improvement.
-rw-r--r-- | src/mapblock.cpp | 62 |
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(); |