¿Generando una interfaz sin funciones virtuales?
Estoy codificando un motor de juego y tengo esta clase configurada para objetos:
class SceneManager //controls everything in the "world" game
{
public:
void Add(SceneObject* object); //adds to the vector
private:
vector<SceneObject*> _worldObjects; //the vector that contains all of them
}
Y todas las clases que trabajo en el juego heredan de SceneObject:
class SceneObject
{
public:
virtual void Draw() = 0;
}
class Image : public SceneObject
{ }
class Sprite : public SceneObject
{ }
class Model3D : public SceneObject
{ }
Así que sé que puedo llamar a Draw () para todos los objetos en mi vector. Pero he estado trabajando en optimizaciones y estoy tratando de deshacerme de todas las funciones virtuales y de herencia, y en su lugar utilizo la composición, ya que no pueden integrarse y parece ser un problema de rendimiento importante cuando se realiza en un objeto por objeto. base.
Estoy buscando alguna técnica de C ++ que pueda usar para poder almacenar un montón de SceneObjects en mi vector, y luego llamar a Draw () en él y dibuja correctamente el objeto relacionado con él. Esto también funcionará para la función Update () que estoy usando como virtual.
Así que este código:
void SceneManager::Add(SceneObject* object)
{
_worldObjects.push_back(object);
}
void SceneManager::DrawTheWorld()
{
for(unsigned int i = 0; i < _worldObjects.size(); i++)
{
_worldObjects[i]->Draw(); //SceneObject's being called
}
}
...se convertiría:
void SceneManager::Add(Image* image)
{
SceneObject* object = new SceneObject();
//link object to image somehow, tried to use it as a member of image
_worldObjects.push_back(object);
}
void SceneManager::DrawTheWorld()
{
for(unsigned int i = 0; i < _worldObjects.size(); i++)
{
//_worldObjects[i]->
//I need somehow to be able to get the pointer back to the original class
//It can be an image, sprite, model3d, anything
}
}
No creo que si agrego un interruptor o si / y eliminando el virtual obtendría algún rendimiento, por lo que estoy tratando de averiguar si hay una manera limpia de lidiar con esto.
¿Algunas ideas?