meshbuffer cache test. No much speed improvement.
authorPerttu Ahola <celeron55@gmail.com>
Mon, 29 Nov 2010 11:03:30 +0000 (13:03 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Mon, 29 Nov 2010 11:03:30 +0000 (13:03 +0200)
src/mapblock.cpp

index 25561008a1796beb9ffafa8fffdde1701762ddce..f525ed3e9dda96708e69ccc7ccb5e011a8b03773 100644 (file)
@@ -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();