JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=e5687bdc8cd3b0184ce5a2924f05709fMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Vertexbuffer pro Objekt und wie?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Catscratch1
Junior JLI'ler



Anmeldedatum: 20.01.2005
Beiträge: 98

Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 08:19    Titel: Vertexbuffer pro Objekt und wie? Antworten mit Zitat

Hi,

was mich interessiert. Macht es Sinn pro Objekt, sei es komplex oder simpel, einen eigenen Vertex- bzw Indexbuffer zu verwenden?

Gehen wir mal davon aus, Stil hin oder her, ich modularisiere mein Programm so, dass ich zum Beispiel für einen Würfel eine Klasse Cube anlege. Der Cube soll zur Initialisierung einen Vertexbuffer anlegen, den man sich zum Bsp mit einer get-Methode rausholt, um in einer anderen Datei über das Device gerendert zu werden.
Wie würde ich so eine Klasse Cube aufbauen und den Buffer initialisieren? Wenn ich beispielsweise eine Methode in der Klasse habe, die den Buffer initialisiert, und das Device als Übergabeparameter habe, kriege ich Ausnahmefehler bei vb->Lock.
Der Debugger sagt, dass ich nen schlechten Pointer beim BYTE*, den ich der Lock Methode gebe, habe.
Ich hab noch Probleme mit COM, da ich mehr mit ManagedDirectX gearbeitet habe. Dieses Zeigerwirrwarr macht mich krank Wink

Kann mir einer ein Beispiel geben, wie man so was realisieren kann?
_________________
"Dispatcher und Scheduler sind wie Brüder, bloß anders"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 09:23    Titel: Antworten mit Zitat

Hi,

natürlich für jedes objekt ein Vertexbuffer wenn sie sich unterscheiden.

COM rockt Very Happy
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Catscratch1
Junior JLI'ler



Anmeldedatum: 20.01.2005
Beiträge: 98

Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 14:59    Titel: Antworten mit Zitat

Und wie würdest du ein Objekt, meinetwegen eine Instanz einer eigenen Klasse Cube, mit einem VB initialisieren? Irgendwie kriege ich das nicht hin!
_________________
"Dispatcher und Scheduler sind wie Brüder, bloß anders"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 15:21    Titel: Antworten mit Zitat

Ich würd noch nichtmal ne klasse cube machen sondern alles über den Scenemanager machen, welcher ein singleton ist.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Catscratch1
Junior JLI'ler



Anmeldedatum: 20.01.2005
Beiträge: 98

Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 16:25    Titel: Antworten mit Zitat

Hört sich interessant an:

Hättest du für mich ein kleines Programmierbeispiel.
Wäre hilfreich!

Danke
_________________
"Dispatcher und Scheduler sind wie Brüder, bloß anders"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 16:41    Titel: Antworten mit Zitat

hm, naja, du möchtest im Prinzip ne Klasse machen, die einen Würfel rendert? So mit Vertex und Indexbuffer?
naja, ich kann nicht behaupten, das ich erfahren in 3D wäre, wohl aber das ich schon komplexere Sacehn wie einen Cube gerendert habe;-)
ka, mit Managed DX hab ich AFAIK noch nie was gemacht, ka, kann dir evtl. zeigen, wei ich das realisiert habe, fals dir das helfen sollte.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 31.01.2005, 16:57    Titel: Antworten mit Zitat

Ich übernehme keine Haftung auf Gültigkeit, habs nur schnell ausm Kopf gemacht:
CPP:
namespace scenemanagment
{
class manager;

class entry
{
public:
        // Constructor/Destructor
    entry (void) : vb_(NULL), ib_(NULL)
    { ::ZeroMemory (&mat_, sizeof(mat_));
    entry (const IEntry& other)
    { vb_ = other.vb_; ib_ = other.ib_; mat_ = other.mat_; }
    virtual ~entry (void)
    { if(vb_) vb_->Release(); if(ib_) ib_->Release(); }

        // Freundschaften:
    friend class manager;

protected:
    ::IDirect3DVertexBuffer9*   vb_;    // IndexBuffer
    ::IDirect3DIndexBuffer9*    ib_;    // VertexBuffer
    ::D3DMATERIAL9              mat_;   // Materialdaten: KEINE TEXTURNAMEN!!!
    ::D3DMATRIX                 trans_; // Transformation, D3DX suckt!
};


class manager
{
private:
        // Con- und Destructor
    manager  (void);
    manager  (const manager& other);
    ~manager (void);

        // Es gibt nur eine Instanz. Jede Zuweisung wäre eine Selbstzuweisung.
        // Da Selbstzuweisungen selten Sinn machen, ist der op= privat
    manager& operator= (const manager& other);

public:
        // Diese statische Methode erzeugt die einzige Instanz.
        // Nur über diese Methode erhalten Anwender den Zugriff auf
        // die Instanz.
    inline static manager& getInstance (void)
    {
            // Die Instanz wird erst beim ersten Aufruf erzeugt.
            // Endet das Programm, wird Instanz vernichtet.
        static manager instance;
        return (instance);
    }

        // Freundschaften:
    friend class entry;

        // Funktionen
    void createSceneEntry (entry* output, const void* vertices, unsigned long numvertices,
                                          const void* indices, unsigned long numindices,
                                          const ::D3DMATERIAL9 &mat, const ::D3DMATRIX& trans)
    {
        if (!vertices || !indices)
            exception (L"Invailid params!");

        direct3d9device_->CreateVertexBuffer (blablabla, &output->vb_);
        direct3d9device_->CreateIndexBuffer (blablabla, &output->ib_);
        blablabla
    }

    void addEntryToScene (const entry& data)
    {
        entries_.push_back (data);
    }

    void render (void)
    {
        for (entries_it_ = entries_.begin(); entries_it_ != entries_.end(); ++entries_it_)
        {
                // Teste ob Entry überhaupt sichtbar ist!
            if (testEntryOnFrustum(entries_it_))
            {
                    // Transformieren
                direct3d9device_->SetTransform (D3DTS_WORLD, entries_it_->trans_);

                    // Render blabla
            }
        }

            // Muss für den nächsten Frame neu gefüllt werden!
        entries_.clear();
    }

private:
    std::vector<entry>           entries_;
    std::vector<entry>::iterator entries_;
};

} // Namespace: scenemanagment


scenemanagment::entry temp;

scenemanagment::manager::getInstance().createSceneEntry (&temp, blablabla);


    // Hauptschleife
while (true)
{
direct3d9device_->settexture (blabla);
scenemanagment::manager::getInstance().addEntry (temp);

scenemanagment::manager::getInstance().render();
}

_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Catscratch1
Junior JLI'ler



Anmeldedatum: 20.01.2005
Beiträge: 98

Medaillen: Keine

BeitragVerfasst am: 01.02.2005, 06:36    Titel: Antworten mit Zitat

Danke Patrick!

@Jonathan_Klein
Mein Problem ist nicht die theoretische Struktur Wink
Ich will mein Beispiel eins zu eins aus C# übersetzen, aber das schaff ich aus irgendwelche Pointergründen nicht.

Ich mache Performancetests zwischen Compiler- und Interpretersprachen.
Und um best und worstcase zu testen, versuche ich halt solche Sachen wie:

Ein Box Objekt für jeden gerenderten Würfel, oder ein Boxobject, das mehrfach gerendert wird. Und bei tausend Würfeln merkt man dann schon was im Speicher Wink, wie es sich gezeigt hat.
Nur will ich das mit C++ auch machen, aber irgendwie krieg ich Exceptions beim VB->Lock!
_________________
"Dispatcher und Scheduler sind wie Brüder, bloß anders"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 01.02.2005, 07:20    Titel: Antworten mit Zitat

Compiler Sprachen vs. Interpreter Sprachen? Den Sieger kennen wir doch schon Wink

Es wird genau das selbe ergebnis werden wie bei Java vs. C++! Nämlich C++.

Das selbe haben sie vor 1 Jahr auch mit C++ vs, C# probiert, C++ hat mal wieder am besten Abgeschnitten. (Wen wunderts? Wink)
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 01.02.2005, 15:19    Titel: Antworten mit Zitat

Was die Direct3D-Leistung von C# angeht, ist der Performanceverlust so marginal klein, dass er nicht wirklich ins Gewicht schlägt. Wenn etwas langsamer ist, dann sind es Berechnungen die zu einem Spiel so nebenher dazugehören - wie z.B. Kollisionserkennungen. Da in solchen Fällen oft mit komplexen Objekten gehandhabt wird (Objekten in Form von Classen und Strukturen), muss man darauf achten, wie diese Objekte Untereinander ausgetauscht werden. Wenn alles ständig kopiert wird, ist es egal in welcher Sprache langsam.
C# hat dafür aber andere Vorteile, die in C++ nicht ohne weiteres oder nicht so einfach zu verwenden sind. (Listen, Stringverwaltung, Fensterbehandlung)
Sicherlich geht das auch in C++ (z.B. mit der STL) aber das ist mitsicherheit nicht ganz so einfach.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 01.02.2005, 16:18    Titel: Antworten mit Zitat

AFE-GmdG
Was gibt es denn für Probleme bei der Verwendung von Strings oder Listen? Okay bei der Iterator-Sache ist schon Pointerverständnis wichtig, aber das war auch schon alles. Und dank boost (was größtenteils in den neuen Standard einfließen soll) unschlagbar Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 02.02.2005, 13:21    Titel: Antworten mit Zitat

Es stimmt schon, mit den neuen Bibliotheken wird das Ganze immer einfacher. Ich gehe da eher von dem Standpunkt aus, dass jeder Anwendungsfall eine optimale Programmiersprache hat. So ist es jedem selbst überlassen welche Sprache er wofür verwenden will.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 02.02.2005, 15:16    Titel: Antworten mit Zitat

AFE-GmdG
Du magst es zu gewinnen, gell? Wink
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 02.02.2005, 16:11    Titel: Antworten mit Zitat

Patrick:
Naja.. der AFE-GmdG hat doch recht Wink Ich muss mich aber auch mal wieder ein wenig in C++ weiterbilden.. Habe in letzter Zeit nur noch Java Programmiert. Vor allem für den undeswettbewerb werde ich wieder C++ brauchen, da sidn ein paar Performance kritische Sachen bei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum