|
You last visited: Today at 16:01
Advertisement
Geschwindigkeit Variablen / Parametern
Discussion on Geschwindigkeit Variablen / Parametern within the C/C++ forum part of the Coders Den category.
04/28/2015, 16:25
|
#1
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Geschwindigkeit Variablen / Parametern
Was ist schneller ?
Wenn ich ein das D3ddevice per parameter übergebe oder es in der jeweiligen Klasse bei einen zeiger speichern lasse und es danch in der jeweiligen funktion halt einfach auslese.
|
|
|
04/28/2015, 17:22
|
#2
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
|
Beides müsste ziemlich gleich schnell sein, ob du die Parameter zu erst in den Speicherblock für funktionsparameter schiebst, und dann dort drauf zugreifst, oder ob du zu erst die Adresse ließt und dann die Daten aus der Adresse ließt, ist vergleichbarer Aufwand, generell ist es jedoch sauberer die Daten per Parameter zu übergeben.
PS Wenn du mit DX arbeitest, macht eh zu erst der PCI Bus (Grafikkarten anbindung) zu bevor der System Bus (Ram anbindung) oder gar die CPU vollständig ausgelastet ist
|
|
|
04/28/2015, 18:14
|
#3
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
Quote:
generell ist es jedoch sauberer die Daten per Parameter zu übergeben
|
citation needed.
|
|
|
04/28/2015, 18:33
|
#4
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Danke schon mal, aber ich nehme sie lieber 1 mal als Parameter da ich sie ansonsten ziemlich oft übergeben müsste.
Weiß jemand wie ich eine DDS Datei Transparenz rendere ? Ps: Ich meine jetzt nicht eine Transparentz wie z.B. nur von 50% (via Blendstate) sondern eine Transparenz das der Alphachannel komplett weg ist (Like Png).
|
|
|
04/28/2015, 20:22
|
#5
|
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
|
Quote:
Originally Posted by Dr. Coxxy
citation needed.
|
Dafür spricht die Wiederverwendbarkeit. Dagegen das häufige Übergeben. Würde je nach Anwendungsfall entscheiden. Hier würde ich es nicht immer übergeben.
|
|
|
04/28/2015, 20:51
|
#6
|
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
|
Quote:
Originally Posted by qqdev
Dafür spricht die Wiederverwendbarkeit. Dagegen das häufige Übergeben. Würde je nach Anwendungsfall entscheiden. Hier würde ich es nicht immer übergeben.
|
Wieso ist das besser für die Wiederverwendbarkeit?
|
|
|
04/29/2015, 00:41
|
#7
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
|
Für gewöhnlich versucht man Methoden so zu schreiben, sodass man sie in verschiedenen Situationen verwenden kann, dafür abstrahiert man diese am besten von allen unnötig Abhängigkeiten. Wenn ich z.b. eine such Funktion für eine Listbox schreibe, schreibe ich diese für allgemeine Listen, und gehe in der Prozedur nicht exakt auf diese listbox ein, um diese Methode auf andere Listen auch anwenden zu können
Ps Coxxy du kannst dich mir auch auf deutsch schreiben, ich habe meine Muttersprache mittlerweile recht lieb gewonnen
|
|
|
04/29/2015, 01:42
|
#8
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
|
Du musst halt überlegen, wie du die Relation am besten darstellen kannst. Wenn dein Sprite-Objekt unabhängig vom D3D-Kontext existieren kann, würde ich nicht unbedingt den Zeiger speichern, da du nicht wissen kannst, ob der noch gültig ist.
Gefühlt wären da evtl. smart pointer (std::weak_pointer und std::shared_ptr) nützlich, ansonsten würde ich den Zeiger keinesfalls speichern wenn das Objekt unabhängig vom Kontext, in dem der D3D Zeiger erstellt wird, existieren kann.
P.S.: Deine Klassennamen sind ziemlich bescheiden. Dafür wurden namespaces erfunden.
Quote:
Wenn ich z.b. eine such Funktion für eine Listbox schreibe, schreibe ich diese für allgemeine Listen, und gehe in der Prozedur nicht exakt auf diese listbox ein, um diese Methode auf andere Listen auch anwenden zu können
|
Nennt sich Abstraktion und lässt sich lösen, indem man z.B. Interfaces bzw. abstrakte Klassen verwendet oder auch direkt cool ist und Iteratoren verwendet (wir sind hier immerhin in der C++ Sektion). Extra für dich, ein komplett generischer Merge Sort (unter der Annahme, dass bool operator<(const T&, const T&) existiert):
Davon abgesehen hat das wenig mit dem Thema zu tun, er nutzt bereits das COM-Interface, das ihm bereitgestellt wird.
|
|
|
04/29/2015, 15:10
|
#9
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Quote:
Originally Posted by snow
Du musst halt überlegen, wie du die Relation am besten darstellen kannst. Wenn dein Sprite-Objekt unabhängig vom D3D-Kontext existieren kann, würde ich nicht unbedingt den Zeiger speichern, da du nicht wissen kannst, ob der noch gültig ist.
Gefühlt wären da evtl. smart pointer (std::weak_pointer und std::shared_ptr) nützlich, ansonsten würde ich den Zeiger keinesfalls speichern wenn das Objekt unabhängig vom Kontext, in dem der D3D Zeiger erstellt wird, existieren kann.
P.S.: Deine Klassennamen sind ziemlich bescheiden. Dafür wurden namespaces erfunden.
|
ziemlich bescheiden. Langeweile läst grüßen. Das mit dem zeigern ist schon sinnig aber da die gesamten Buffer im Device nacher sind (Sprites) und jeweils meine "Os" nurnoch die Pointer managed bleibe ich lieber dabei.
Aber nochmal zu den transparenten texturen hat wer eine idee ?
|
|
|
04/29/2015, 18:39
|
#10
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
Quote:
Originally Posted by warfley
Ps Coxxy du kannst dich mir auch auf deutsch schreiben, ich habe meine Muttersprache mittlerweile recht lieb gewonnen
|
"citation needed" ist mehr oder weniger ein witz, dass du deine aussage bitte auch belegen sollst - was du imo nicht kannst, da die objektorientierte lösung deutlich sauberer ist, da sie die redundanten übergaben des devices in eine einzige methode (z.b. konstruktor) auslagert - dafür nimmst du halt ein duplikat des device ptrs in der klasseninstanz in kauf - die 4/8 byte sind aber verschmerzbar.
Kann zwar je nach anwendungsfall anders sein, in der regel wird aber die objektorientierte lösung wesentlich sauberer sein - und nicht per parameter.
|
|
|
04/30/2015, 14:28
|
#11
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Die Diskussion über die Frage, ob es ein Parameter sein sollte (aus Designsicht), ist völlig schwachsinnig, weil dafür die nötigen Informationen fehlen.
Allgemein kann man sagen "Parameter sind besser als Instanzvariablen", so wie man sagen kann "Lokale Variablen sind besser als globale". Es ist immer besser, den Gültigkeitsbereich so klein wie möglich und so groß wie nötig zu halten.
Hier ist aber überhaupt nicht definiert, welcher Gültigkeitsbereich nötig ist.
Z.B. ist gar nicht genannt, was denn "die jeweilige Klasse" ist. Das spielt aber, wie folgendes Beispiel zeigt, eine wichtige Rolle.
Code:
//cool typedefs here
//...
class DrawableMenu
{
public:
virtual void Draw(DeviceType *device) = 0;
//...
};
class FancyMenu : public DrawableMenu
{
void DrawSomeSubMenu(DeviceType *device);
public:
virtual void Draw(DeviceType *device);
//...
};
void FancyMenu::DrawSomeSubMenu(DeviceType *device)
{
//draw this shit
}
void FancyMenu::Draw(DeviceType *device)
{
DrawSomeSubMenu(device);
//draw even more
}
class MenuController
{
std::vector<DrawableMenu *> _menus;
DeviceType *_device;
public:
MenuController(DeviceType *device, const std::vector<DrawableMenu *> &menus)
: _device(device)
, _menus(menus)
{}
void UpdateMenus();
};
void MenuController::UpdateMenus()
{
//...
for (DrawableMenu *menu : _menus)
{
menu->Draw(_device);
}
//...
}
std::vector<DrawableMenu *> CreateMenus()
{
//...
}
HRESULT __stdcall hkEndScene(DeviceType *device)
{
static MenuController menuController(device, CreateMenus());
//...
menuController.UpdateMenus();
return origEndScene(device);
}
(man entschuldige meine eingerosteten C++ Kenntnisse)
MenuContoller realisiert hier eine Verwaltung von mehreren D3D Menüs für ein Device. Er selbst speichert daher selbiges Device, da er daran gebunden ist und es mehr oder weniger verwaltet.
Ein Menü hingegen kann an beliebig vielen Controllern hängen und zumindest rein theoretisch mit beliebig vielen Devices gezeichnet werden. Es hat also keine Instanzvariable, sondern erhält das Device für die Zeichnung als Parameter. Zwar wird das Device ebenfalls in weiteren privaten Methoden gebraucht, aber an den nötigen Stellen wird es dann halt durchgereicht, denn es wäre unsauber und fehleranfällig, eine Instanzvariable zum Durchreichen zu verwenden, nur um sich den zusätzlichen Parameter bei den betroffenen Methoden zu sparen.
Quote:
da die objektorientierte lösung deutlich sauberer ist
[...]
Kann zwar je nach anwendungsfall anders sein, in der regel wird aber die objektorientierte lösung wesentlich sauberer sein - und nicht per parameter.
|
Nur dass eine Instanzvariable für etwas zu verwenden nicht automatisch bedeutet, dass es objektorientiert(er) ist als die Version mit dem Parameter.
Quote:
Du musst halt überlegen, wie du die Relation am besten darstellen kannst. Wenn dein Sprite-Objekt unabhängig vom D3D-Kontext existieren kann, würde ich nicht unbedingt den Zeiger speichern, da du nicht wissen kannst, ob der noch gültig ist.
|
^this
|
|
|
04/30/2015, 17:55
|
#12
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Quote:
Originally Posted by MrSm!th
Die Diskussion über die Frage, ob es ein Parameter sein sollte (aus Designsicht), ist völlig schwachsinnig, weil dafür die nötigen Informationen fehlen.
Allgemein kann man sagen "Parameter sind besser als Instanzvariablen", so wie man sagen kann "Lokale Variablen sind besser als globale". Es ist immer besser, den Gültigkeitsbereich so klein wie möglich und so groß wie nötig zu halten.
Hier ist aber überhaupt nicht definiert, welcher Gültigkeitsbereich nötig ist.
Z.B. ist gar nicht genannt, was denn "die jeweilige Klasse" ist. Das spielt aber, wie folgendes Beispiel zeigt, eine wichtige Rolle.
Code:
//cool typedefs here
//...
class DrawableMenu
{
public:
virtual void Draw(DeviceType *device) = 0;
//...
};
class FancyMenu : public DrawableMenu
{
void DrawSomeSubMenu(DeviceType *device);
public:
virtual void Draw(DeviceType *device);
//...
};
void FancyMenu::DrawSomeSubMenu(DeviceType *device)
{
//draw this shit
}
void FancyMenu::Draw(DeviceType *device)
{
DrawSomeSubMenu(device);
//draw even more
}
class MenuController
{
std::vector<DrawableMenu *> _menus;
DeviceType *_device;
public:
MenuController(DeviceType *device, const std::vector<DrawableMenu *> &menus)
: _device(device)
, _menus(menus)
{}
void UpdateMenus();
};
void MenuController::UpdateMenus()
{
//...
for (DrawableMenu *menu : _menus)
{
menu->Draw(_device);
}
//...
}
std::vector<DrawableMenu *> CreateMenus()
{
//...
}
HRESULT __stdcall hkEndScene(DeviceType *device)
{
static MenuController menuController(device, CreateMenus());
//...
menuController.UpdateMenus();
return origEndScene(device);
}
(man entschuldige meine eingerosteten C++ Kenntnisse)
MenuContoller realisiert hier eine Verwaltung von mehreren D3D Menüs für ein Device. Er selbst speichert daher selbiges Device, da er daran gebunden ist und es mehr oder weniger verwaltet.
Ein Menü hingegen kann an beliebig vielen Controllern hängen und zumindest rein theoretisch mit beliebig vielen Devices gezeichnet werden. Es hat also keine Instanzvariable, sondern erhält das Device für die Zeichnung als Parameter. Zwar wird das Device ebenfalls in weiteren privaten Methoden gebraucht, aber an den nötigen Stellen wird es dann halt durchgereicht, denn es wäre unsauber und fehleranfällig, eine Instanzvariable zum Durchreichen zu verwenden, nur um sich den zusätzlichen Parameter bei den betroffenen Methoden zu sparen.
Nur dass eine Instanzvariable für etwas zu verwenden nicht automatisch bedeutet, dass es objektorientiert(er) ist als die Version mit dem Parameter.
^this
|
Hm, da ich nur 1 mal eine Klassenvererbung mit nur 1 virtuellen funktion nutze, bleibe ich einfach erstmal bei meinem
|
|
|
|
Similar Threads
|
[Anleitung] DNS Lobby mit eigenen Parametern
01/03/2014 - Grand Theft Auto - 27 Replies
Hallo,
da es hier jeden Tag Threads gibt wo nach Money Lobby, Rp Lobby usw. gesucht wird möchte ich euch heute einen einfachen Weg zeigen wie ihr euch so eine Lobby selbst erstellen könnt.
Was ihr dazu braucht sind ein normaler PC und eure Konsole (Xbox PS3)
Schritt 1:
Ihr geht auf www.gtadns.com. Dann klickt ihr auf Download for Windows. Screen:
http://i.epvpimg.com/RqYqg.png
Jetzt ladet ihr die Datei runter und entpackt sie mit WinRar.
|
Mit 2 kleinen Parametern ein YT-Video analysieren
11/22/2013 - Coding Snippets - 0 Replies
Um mit 2 kleinen Parametern ein YT-Video analysieren kann:
public function getVideoDetails($url,$getMethode){
//The Youtube"s API url
define("YT_API_URL", "http://gdata.youtube.com/feeds/api/videos?q= ");
//Change below the video id.
$video_id = $url;
//Using cURL php extension to make the request to youtube API
$ch = curl_init();
|
eigene .exe mit parametern öffnen
08/16/2013 - AutoIt - 8 Replies
Hat jemand eine Möglichkeit wie ich meine autoit.exe so schreiben kann das diese beim start parameter akzeptiert und diese z.B. als variable abspeichert .
ShellExecute(@ScriptDir & "\bla.exe","Parameter")
|
minecraft jar noch mit Parametern Starten?
11/21/2012 - Minecraft - 2 Replies
Hallo alle zusammen,
fals ich hier nicht richtig bin sagt mir bitte bescheid!
Also folgende Frage:
kann mann die Aktuelle version von der Minecraft jar noch mit parametern Starten (Username Passwort, Server IP und no Update)?
Ich weis das das mal möglich war und auch noch möglich ist mit dem Launcher, doch ich will diesen nach möglichkeit nicht nutzen, da ich meinen eingenden Launcher gerade Baue und es da blöd kommt wenn mann erst noch den originalen Launcher sieht wenn minecraft...
|
[S]Daisy mit v17 Parametern
04/22/2012 - Flyff Private Server - 2 Replies
Ich suche Daisy welches die v17 Parameter mit liest
hat das jemand bzw. ist es released?
|
All times are GMT +2. The time now is 16:01.
|
|