RTTI?



  • Hi Leute

    Ich baue mir ein VFS für unsere Engine zusammen, und dazu bin ich am überlegen, ob ich die Typenkontrolle mit RTTI oder als Enum einbauen soll. Es geht vorallem um die Performance, denn min. 6000 Checks / Sek werden es auf jeden Fall sein.

    Meine überlegen möglichkeiten:

    Entweder die Nodes enumerieren:
    enum Type {
    PARTICLE_SYSTEM = 1,
    TEXTURE,
    MESH,
    ...
    };

    class Node {
    public:
    Type _type;
    ...
    }

    und dann in die Node einbauen, um den Typencheck zu erledigen.

    Oder das ganze per RTTI

    if( dynamic_cast<ParticleSystem*>(node) ) {
    ...
    } else if( dynamic_cast< Texture*>(node) ) {
    ...
    }

    usw.

    Wie sehen euere Erfahrungen aus bei RTTI? Ich meine vom Speed.
    Es geht um ein Game, und da zählt jedes Frame

    Danke
    Sven



  • Macht RTTI nicht Stringvergleiche? Das dürfte doch schon alles sagen.



  • Die RTTI braucht ja keine Strings zu vergleichen. Es reicht ja ein Klassenvergleich. Allerdings baue ich die Enum Variante ein, da alles andere Overkill währe.



  • warum ist rtti so wichtig für dich? wie willst du das denn sinnvoll einsetzen?



  • Ist von dem her nicht wichtig. Es war nur ein weiterer Ansatz, den NodeType zu representieren.



  • Also mein C++ Buch sagt mir, dass man RTII wenn möglich vermeiden sollte, und eine Verwendung von RTII meist auf einen Designfehler schließen lässt.
    Vielleicht kannst du dein Problem m.h. von Klassen und virtuellen Funktionen besser lösen ?
    Auf jeden Fall verschieb ich dich mal ins C++ Forum, die kennen sich mit sowas besser aus



  • Das Problem hat sich eigentlich schon gelöst. Hab einfach in die Base Class ein Enum eingebaut. Das ist die schnellste Variante. Für andere Fälle, wo ich mehr Dynamik brauche hab ich mir inzwischen eine eigene kleine RTTI zusammengeschraubt.



  • Ich dachte, der GCC erledigt RTTI mit Pointervergleichen...



  • Original erstellt von SnorreDev:
    Das Problem hat sich eigentlich schon gelöst. Hab einfach in die Base Class ein Enum eingebaut. Das ist die schnellste Variante. Für andere Fälle, wo ich mehr Dynamik brauche hab ich mir inzwischen eine eigene kleine RTTI zusammengeschraubt.

    hast du gemessen? was könnte sich den hinter dynamic_cast verbergen?

    if(this->vtab == neuer_typ->vtab)
        return p;
    else
        return NULL;
    

    dumm ist nur das man mit typeid und switch nicht arbeiten kann 😞
    was hat da gegen gesprochen type_info einen methode int id() const zu geben?



  • Wenn ich dich richtig verstanden habe, hab ich es auch so gelöst.
    Einfach per Anfrage mit inline VFS_TYPE GetType() zurückgegeben. Somit ist das Problem eigentlich gelöst.

    VFS_TYPE ist das Enum der verschiedenen Klassen. Also File, SymLink, Directory. File wird dann halt in die HandleTypen gesplittet. Also ParticleSystem, Texture, Mesh usw.

    Somit funktioniert das ganze recht schnell.
    Den RTTI check werd ich aber mal zum Performance messen einbauen 🙂


Anmelden zum Antworten