From 3ad212c90b280f2f9630d3ffe453ff82c71e7516 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 29 Nov 2010 13:03:30 +0200 Subject: [PATCH] meshbuffer cache test. No much speed improvement. --- src/mapblock.cpp | 62 +++++++++++++++++++++++++++++++++++++----------- 1 file 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 *fastfaces_new = new core::list; + //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 bufs; core::list::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::Node* + n = bufs.find(f->material); + + if(n != NULL) { - // This is a "Standard MeshBuffer", - // it's a typedeffed CMeshBuffer - 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 + 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"<