Frage zum Speed
-
Hi,
ich bin dabei OpenGL und OpenAL zu Kapseln nach dem COM-Schema, das funzt auch bisher prima
Jetzt hab ich aber eine frage:
Ist das ein großer performance einbruch wenn ich den code benutze anstatt den anderen?
// Deklaration MLRESULT IMedia3DDevice::clear (const unsigned long Color, const unsigned int Flags) { glClearColor (CON_COLOR_HEX_TO_FLOATS(Color)); // Simples makro glClear (Flags); if (getLastError()) { MLRESULT result; switch (getLastError()) { case 0x00000100: return (M3D_ERR_INVALIDCALL); break; // [...] } } return (M3D_OK); } // Aufruf if (g_M3DDevice->clear (0xFF000000, M3D_COLOR_BUFFER_BIT | M3D_DEPTH_BUFFER_BIT) != M3D_OK) { // [...] }
versus
// Aufruf im code (Ohne Klassen und COM, kurz: Direkt in der Hauptschleife drin, ohne extra Funktionsaufruf) // [...] glClearColor (CON_COLOR_HEX_TO_FLOATS(0xFF000000)); // Simples makro glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // [...]
Ich kann mir denken, dass das 2. schneller ist, da ja ein Funktionsaufruf Zeit kostet, bin mir aber net sicher.
Jetzt meine Fragen:
- Gibt es Speedeinbußen?
- Verbesserungsvorschläge für Funktion Methode 1?Schon mal dickes Danke im voraus!
-
Das ist das falsche Forum. Hier gibts nur Standard C++, und das trifft und keinen von deinen Codes zu.
-
Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi!
Also ich würde die 1. bevorzugen. So kann man immer seine eigenen Einstellungen vornehmen. Beim anderen gibst du es ja vor, ist etas eingeschränkt, imho.
Ansonsten kommt es natürlich auch darauf an wie du es brauchst, wobei man ja nie weiß was nochmal auf einen zukommt und dann kann man verwenden was man hat und muss es nicht neu schreiben.
Nebenbei verstehe ich eines nicht. Deine Funktion ist doch viel länger als deine 2 Funktionsaufrufe, wie soll das also bei der 2. Methode aussehen?
Code-Hacker
-
CarstenJ schrieb:
Das ist das falsche Forum. Hier gibts nur Standard C++, und das trifft und keinen von deinen Codes zu.
Sag mal... ich will mal jetzt nicht an Deiner Kompetenz zweifeln, aber ich hab eine Standardfrage zu C++ gestellt, in der es darum ging, Ob ein Funktionsaufruf aus einer Klasse, welche auf dem Stack liegt, Zeit kostet oder gar keine.
Und nur weil das GL steht und so, heißt das noch lange nicht, das das nix mit Standard zu tun hat, denn darum gings um ehrlich zu sein einen feuchten Futzi.
Drum meine Frage: Was sucht mein Thread nun in diesem Forum??? Leßt ihr eucht die Topics genau durch bevor ihr sie verschiebt, oder seht ihr nur "Aha, eine OpenGL Funktion, dann gehts 100% nur ums gamecoding! Das hat nix mit Standard zu tun! Also verschieben!"
Demnächst kommt jeder an "COM hat nur was mit DX zu tun, selbst das Konzept! Also Spieleprogrammiererforum!" bzw. "Aha da steht HRESULT drine, also direkt damit zur Win32API"
also bitte, ich glaube in letzter Zeit seit ihr richtig im "verschiebungswahn"...
-
Blue Panther schrieb:
CarstenJ schrieb:
Das ist das falsche Forum. Hier gibts nur Standard C++, und das trifft und keinen von deinen Codes zu.
Sag mal... ich will mal jetzt nicht an Deiner Kompetenz zweifeln, aber ich hab eine Standardfrage zu C++ gestellt, in der es darum ging, Ob ein Funktionsaufruf aus einer Klasse, welche auf dem Stack liegt, Zeit kostet oder gar keine.
Und nur weil das GL steht und so, heißt das noch lange nicht, das das nix mit Standard zu tun hat, denn darum gings um ehrlich zu sein einen feuchten Futzi.
Drum meine Frage: Was sucht mein Thread nun in diesem Forum??? Leßt ihr eucht die Topics genau durch bevor ihr sie verschiebt, oder seht ihr nur "Aha, eine OpenGL Funktion, dann gehts 100% nur ums gamecoding! Das hat nix mit Standard zu tun! Also verschieben!"
Demnächst kommt jeder an "COM hat nur was mit DX zu tun, selbst das Konzept! Also Spieleprogrammiererforum!" bzw. "Aha da steht HRESULT drine, also direkt damit zur Win32API"
also bitte, ich glaube in letzter Zeit seit ihr richtig im "verschiebungswahn"...
das passt ja auch genauso gut hierher, denn performance und opengl sind schon etwas spezifischer.
ich kann dir nämlich etwas dazu antworten was auch nicht unbedingt was mit dem standard zu tun hat.
du hast eine funktion 'clear', wie oft wird die schon aufgerufen? es dürfte zweifelhaft sein, dass sie mehr als 100mal pro bild aufgerufen wird, vermutlich meißt nur ein einziges mal pro bild. da ist es für dich wohl nicht wichtig performance zu erhalten, also mach das ruhig als COM. das wird ein wenig langsammer, aber diese paar hundertstel prozent an performance bekommst du mit einem guten algorithmus irgendwo sicherlich weg;)
weiter kannst du erwarten, dass du wenig aufrufe hast für deine COM interface, denn der aufruf der opengl API ist sehr viel langsammer als von deinem COM objeckt. wenn jemand also performance will, wird er nicht jedes vertex einzeln mit
g_M3DDevice->Vertex3f(...);
übertragen, sondern in einem array oder es gleich auf die graka packen, und in diesen fällen wird deine COM sache das rauschen in der performanc sein.
wenn nun jemand doch vertex für vertex überträgt und deine funktionsaufrufe einiges an zeit ziehen, ist das ganze so unoptimal angelegt, dass es egal ist ob mit deinen aufrufen 15k triangle/s oder mit direckten aufrufen 30k triangle/s dargestellt werden, denn es wird ein bruchteil des möglichen bleiben. Niemand wird dann anfangen an den aufrufen zu optimieren anstatt die grundlegenen fehler zu beseitigen.
rapso->greets();
-
Hi,
nein also es ging eher um die Funktionsaufrüfe allgemein, clear war ja sogesehen nur ein Beispiel.
Ich wollte das Konzept eigentlich so wie in Direct3D machen, also nicht jeden Vertex einzeln ans Device übergeben sondern halt wie du schon sagtest ein Array, nur halt noch mit nem IMedia3DVertexBuffer und IMedia3DIndexBuffer. halt in Direct3D Manier
Glaubst du, das würde erhebliche Speedeinbrüche geben wenn ichs so machen würde?
-
sowas kann schon um einiges langsammer sein im vergleich zum direkten aufruf, aber die aufrufe an sich machen kaum was von der gesammtperformance aus, deine framerate wird deswegen nicht von 50 auf 49 singen oder so. Mit einem performance analyser wie z.b. dem CodeAnalyst von AMD (gibt es kostenlos) sollten die aufrufe sogut wie garnicht bemerkt werden.
anstatt deinen com interfaces ist es auch möglich, dass du selbst abstracte klassendeklarationen hast und dir aus deiner DLL einen pointer auf die klassen gibst, dann kannst du über die abstracte klase drauf zugreifen. Das würde ein wenig vom COM-interface overhead übergehen (soweit ich weiß, wird dort mit refcounting gearbeitet, das kostet ja auch performance)
rapso->greets();
-
Hi,
kurz: es wird nur derbst minimaler performanceverlust auftreten?
Also wenn das so ist, bin ich ja zufrieden.
-
Miss es einfach!
Bye, TGGC \-/
-
@TGGC:
Danke für den Tipp. Ich hab's mal gemessen und die Zeiten waren gar nicht mal sooooooo schlechtFast gleich schnell
-
Blue Panther schrieb:
Ich kann mir denken, dass das 2. schneller ist, da ja ein Funktionsaufruf Zeit kostet, bin mir aber net sicher.
Funktionsaufrufe sind heutzutage nur noch Schall und Rauch (naja fast). Früher haben die noch Zeit gekostet, heutzutage ist das nicht mehr so. Benutze lieber die Funktionen und ein sauberes Klassendesign, später wirst du dir dankbar sein (hey das reimt sich). Vielleicht solltest du in dem Zusammenhang dir auch mal inline anschaun.