TIPP: Schnelles Neuerstellen bei DirectX
-
für alle die es noch nicht wissen oder es vielleicht einfach nicht gemacht haben. man kann das neuerstellen von projekten, die directx benutzen beschleunigen, indem man versucht überall dort wo es möglich ist vorwärtsdeklarationen zu benutzen. ich weiß, eigentlich es das klar, aber ich glaube nicht jeder noob weis das.
besonders anfänger schreiben gerne folgendes:
#pragma once #include <d3dx9.h> class CMyClass { public: ... private: IDirect3DTexture9* m_MyTexture; IDirect3DVertexBuffer9 *m_MyVertexBuffer; }; und in der cpp datei: #include "MyClass.h" CMyClass::CMyClass(void) { } ...
dabei kann man aber für die interfaces vorwärtsdeklarationen benutzen:
#pragma once __interface IDirect3DTexture9; __interface IDirect3DVertexBuffer9; class CMyClass { public: ... private: IDirect3DTexture9 *m_MyTexture; IDirect3DVertexBuffer9 *m_MyVertexBuffer; }; und in der cpp datei dann die headerdatei einbinden #include <d3dx9.h> #include "MyClass.h" CMyClass::CMyClass(void) { } ...
dann spart man sich in den projekten, die die selbstgeschriebenen klassen-header benutzen, das lange kompilieren, da man dann ja keine directx header mehr einbinden muss. leider funktioniert das nicht überall. bei directx-strukturen wie z.b. "D3DPRESENT_PARAMETERS" kann man keine vorwärtsdeklarationen benutzen, ausser man benutzt zeiger auf diese strukturen und erstellt sie dynamisch, was aber um einiges langsamer ist, da hinter einem "new xyz" ein gewaltiger funktionsaufruf steht, ein datentyp alleine aber erst mal keine zeit für die speicherreservierung benötigt (kommt halt ganz darauf an...)
dennoch, man kann den rebuild-vorteil an vielen stellen gut einbauen und seine engine dadurch verbessern.
-
Und wenn du dann auf Dx10 updaten willst, darfste alle Header umschreiben.
-
und seine engine dadurch verbessern
Macht die nur während der Entwicklungszeit geringere Kompilierzeit wirklich die Engine besser?
-
das verstehe ich nicht. wenn man auf directx 10 umsteigen will, dann muss man die header sowieso umschreiben egal wie sie aussehen. erklär das mal bitte genauer...
kommt ganz darauf an wie DU es definierst. aber für MICH ist es eine verbesserung, wenn ich anstatt 30-60 sekunden kompilierzeit nur 2-3 sekunden kompilierzeit für mein projekt habe. denn dieser rebuildvorteil überträgt sich ja auf alles was dann deine engine nutzt. und wenn man mal genau hinschaut, dann wird man feststellen, das das lange kompileren nur durch die "externen" bibliotheken ensteht, wie z.b winapi oder directx.
es dauert, bis man selber mit REINEM c++ eine engine geschrieben hat, die mehr als 30 sekunden kompilierzeit braucht (auf einem Pentium IV 1.6 GHZ mit 512 mb RDRAM). meine "basisklassen" die nur in reinem c++ geschrieben sind lassen sich alle innerhalb eines bruchteils einer sekunde kompilieren, selbst wenn diese mehr als 30kb reinen c++ quellcode haben (und somit keine externen libs verwenden).
-
Ich benutze OpenGL, aber ich mache es so:
//mein file
#include "gl.h"class so_und_so
{
};#include <GL/gl.h>
#include <GL/glu.h>Würden sich jetzt die Gl-Header verändern (z.B. beim Wechsel auf GL2),
ändere ich nur meine lokale gl.h.[ Dieser Beitrag wurde am 20.06.2003 um 16:12 Uhr von Kane editiert. ]
-
genau das mache ich doch auch!
die klasse CMyClass ist nicht irgendeine klasse von irgendeinem projekt, sondern eine spezielle directx klasse (->wrapperklasse???, brrrr... ich hasse den ausdruck), wie z.b. "CVertexBuffer".
die klasse hat eine h und eine cpp datei.
in der h-datei steht die klassendefinition und in der cpp datei die methoden (und alles was man sonst noch braucht). directx wird vollkommen gekapselt und ist nach "aussen" nicht mehr sichtbar/benutzbar.
wenn ich nun ein programm schreibe das einen vertexbuffer braucht, dann includiere ich "CVertexBuffer.h". wenn ich dann umsteige auf directx 10 dann verändere ich, SELBSTVERSTÄNDLICH, nur die "CVertexBuffer.h" datei, und zwar einmal. alle anderen dateien, die den vertexbuffer benutzen bleiben unverändert, und includieren nach wie vor "CVertexBuffer.h"
und da ich in der "CVertexBuffer.h" datei nur vorwärtsdeklarationen habe und somit keine großen und langsamen header einbinden muss, ist das einbinden meiner "CVertexBuffer.h" extrem schnell!
jetzt sollte es klar sein oder hast du was anderes gemeint?