Hi, I've got a simple question. I have 2 ways to draw objects that I can think of but I didn't know which one is better.
1. Use an abstract class Renderable for the parent of the objects and have an std::vector of the Renderable class and call an overloaded virtual function to draw.
E.g:
Code:
class Renderable
{
public:
virtual void draw()=0;
}
Code:
class MovableObject:public Renderable
{
public:
void draw()
{
}
.........
}
class TerrainObject:public Renderable
{
public:
void draw()
{
}
........
}
class OverlayObject:public Renderable
{
public:
void draw()
{
}
...........
}
etc...
Code:
std::vector <Renderable *> mRenderable
...
mRenderable.push_back(new MovableObject() );
mRenderable.push_back(new TerrainObject() );
mRenderable.push_back(new OverlayObject() );
//Main loop
while (!done)
{
..............
for (std::vector <Renderable *>::iterator itr=mRenderable.begin();
itr!=mRenderable.end();
itr++)
{
(*itr)->draw();
}
}
........
2. Not using any inheritance and making the respective objects's vectors for drawing
e.g.:
Code:
class MovableObject
{
public:
void draw()
{
}
.........
}
class TerrainObject
{
public:
void draw()
{
}
........
}
class OverlayObject
{
public:
void draw()
{
}
...........
}
etc...
Code:
std::vector <MovableObject *> mMovables
std::vector <TerrainObject *> mTerrains
std::vector <OverlayObject *> mOverlays
...
mMovables.push_back(new MovableObject() );
mTerrains.push_back(new TerrainObject() );
mOverlays.push_back(new OverlayObject() );
//Main loop
while (!done)
{
..............
//Movables
for (std::vector <MovableObject *>::iterator itr=mMovables.begin();
itr!=mMovables.end();
itr++)
{
(*itr)->draw();
}
//Terrains
for (std::vector <TerrainObject *>::iterator itr=mTerrains.begin();
itr!=mTerrains.end();
itr++)
{
(*itr)->draw();
}
//Overlays
for (std::vector <OverlayObject *>::iterator itr=mOverlays.begin();
itr!=mOverlays.end();
itr++)
{
(*itr)->draw();
}
}
........
The question is which is better? I understand that using virtual calls can very much affect the performance. But how slow will it be?
Thanks in advance.