¿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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta