|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 31.01.2005, 08:19 Titel: Vertexbuffer pro Objekt und wie? |
|
|
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
Kann mir einer ein Beispiel geben, wie man so was realisieren kann? _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 31.01.2005, 14:59 Titel: |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 31.01.2005, 16:25 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.01.2005, 16:41 Titel: |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 31.01.2005, 16:57 Titel: |
|
|
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 |
|
|
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 01.02.2005, 06:36 Titel: |
|
|
Danke Patrick!
@Jonathan_Klein
Mein Problem ist nicht die theoretische Struktur
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 , 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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 01.02.2005, 07:20 Titel: |
|
|
Compiler Sprachen vs. Interpreter Sprachen? Den Sieger kennen wir doch schon
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? ) _________________ '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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 01.02.2005, 15:19 Titel: |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 01.02.2005, 16:18 Titel: |
|
|
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 _________________ '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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 02.02.2005, 13:21 Titel: |
|
|
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 02.02.2005, 16:11 Titel: |
|
|
Patrick:
Naja.. der AFE-GmdG hat doch recht 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 |
|
|
|
|
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
|