meshbuffer cache test. No much speed improvement.

master
Perttu Ahola 2010-11-29 13:03:30 +02:00
parent c18af6e728
commit 3ad212c90b
1 changed files with 48 additions and 14 deletions

View File

@ -297,6 +297,8 @@ void MapBlock::updateMesh()
core::list<FastFace*> *fastfaces_new = new core::list<FastFace*>; 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. We are including the faces of the trailing edges of the block.
This means that when something changes, the caller must This means that when something changes, the caller must
@ -340,13 +342,27 @@ void MapBlock::updateMesh()
} }
} }
//timer1.stop();
//TimeTaker timer2("updateMesh2", g_device);
scene::SMesh *mesh_new = NULL; scene::SMesh *mesh_new = NULL;
//s32 appendtime = 0;
if(fastfaces_new->getSize() > 0) if(fastfaces_new->getSize() > 0)
{ {
mesh_new = new scene::SMesh(); mesh_new = new scene::SMesh();
scene::IMeshBuffer *buf = NULL; 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(); core::list<FastFace*>::Iterator i = fastfaces_new->begin();
// MATERIAL_AIR shouldn't be used by any face // MATERIAL_AIR shouldn't be used by any face
@ -359,6 +375,15 @@ void MapBlock::updateMesh()
if(f->material != material_in_use || buf == NULL) if(f->material != material_in_use || buf == NULL)
{ {
// Try to get a meshbuffer associated with the material // Try to get a meshbuffer associated with the material
core::map<u8, scene::IMeshBuffer*>::Node*
n = bufs.find(f->material);
if(n != NULL)
{
buf = n->getValue();
}
else
{
buf = mesh_new->getMeshBuffer(g_materials[f->material]); buf = mesh_new->getMeshBuffer(g_materials[f->material]);
// If not found, create one // If not found, create one
if(buf == NULL) if(buf == NULL)
@ -366,6 +391,7 @@ void MapBlock::updateMesh()
// This is a "Standard MeshBuffer", // This is a "Standard MeshBuffer",
// it's a typedeffed CMeshBuffer<video::S3DVertex> // it's a typedeffed CMeshBuffer<video::S3DVertex>
buf = new scene::SMeshBuffer(); buf = new scene::SMeshBuffer();
bufs[f->material] = buf;
// Set material // Set material
((scene::SMeshBuffer*)buf)->Material = g_materials[f->material]; ((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
// Use VBO // Use VBO
@ -375,11 +401,17 @@ void MapBlock::updateMesh()
// Mesh grabbed it // Mesh grabbed it
buf->drop(); buf->drop();
} }
}
material_in_use = f->material; material_in_use = f->material;
} }
u16 indices[] = {0,1,2,2,3,0}; u16 indices[] = {0,1,2,2,3,0};
//TimeTaker timer("", g_device);
buf->append(f->vertices, 4, indices, 6); buf->append(f->vertices, 4, indices, 6);
//appendtime += timer.stop(true);
} }
// Use VBO for mesh (this just would set this for ever buffer) // Use VBO for mesh (this just would set this for ever buffer)
@ -390,6 +422,8 @@ void MapBlock::updateMesh()
<<" materials"<<std::endl;*/ <<" materials"<<std::endl;*/
} }
//dstream<<"appendtime="<<appendtime<<std::endl;
// TODO: Get rid of the FastFace stage // TODO: Get rid of the FastFace stage
core::list<FastFace*>::Iterator i; core::list<FastFace*>::Iterator i;
i = fastfaces_new->begin(); i = fastfaces_new->begin();