Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:01

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Geschwindigkeit Variablen / Parametern

Discussion on Geschwindigkeit Variablen / Parametern within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Terrat's Avatar
 
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.
Terrat is offline  
Old 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
warfley is offline  
Thanks
1 User
Old 04/28/2015, 18:14   #3
 
Dr. Coxxy's Avatar
 
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.
Dr. Coxxy is offline  
Thanks
1 User
Old 04/28/2015, 18:33   #4
 
Terrat's Avatar
 
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).
Terrat is offline  
Old 04/28/2015, 20:22   #5
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Quote:
Originally Posted by Dr. Coxxy View Post
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.
qqdev is offline  
Old 04/28/2015, 20:51   #6
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Quote:
Originally Posted by qqdev View Post
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?
dowhile is offline  
Old 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
warfley is offline  
Old 04/29/2015, 01:42   #8

 
snow's Avatar
 
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.
snow is offline  
Old 04/29/2015, 15:10   #9
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by snow View Post
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 ?
Terrat is offline  
Old 04/29/2015, 18:39   #10
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by warfley View Post
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.
Dr. Coxxy is offline  
Thanks
2 Users
Old 04/30/2015, 14:28   #11


 
MrSm!th's Avatar
 
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
MrSm!th is offline  
Thanks
1 User
Old 04/30/2015, 17:55   #12
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by MrSm!th View Post
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
Terrat is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.