Gosub
Übersicht

g-hunnBetreff: Gosub |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Ich verstehe irgendwie die funktion Gosub nicht! Kann mir das einer erklären??? ![]() Danke |
||
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
ql:Gosub | ||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
![]() |
miLORD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Benutze nie GoSub.
GoSub ist böse. Böse! BÖSE! Böses GoSub usw. GoSub springt zum nächsten deklarierten befehl. Aber um Himmels willen Junge, nimm functions, du steigst sonst durch deinen eigenen code nicht mehr durch! |
||
brqwq?! oO |
![]() |
Cardonic |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Gosub arbeitet schneller als Funktionen; daher für Unterprogramme, die ständig aufgerufen werden, zu empfehlen. Man mus schon aufpassen, das man den Code gut strukturiert und den Überblick nicht verliert ![]() mfg Cardonic |
||
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet. |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cardonic hat Folgendes geschrieben: Gosub arbeitet schneller als Funktionen
Zeige mir sofort einen Quellcode, wo sich eine derartige Optimierung gegenüber dem enormen Übersichtsverlust lohnt. MfG D2006 |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
Cardonic |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ D2006 : Wenn man bei einem Spiel viele (z.B. 200) Objekte mit einem Unterprogramm bearbeitet und eine Framerate von 70 FPS hat, dann addiert sich der Zeitverlust immerhin um das 14'000-Fache in einer Sekunde ![]() (wenn man mehrere solche Dinge beachtet, dann kann das im Endeffekt etwas ausmachen) mfg Cardonic |
||
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet. |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Programme bestehen fast nur aus Functionen!
GoSub geht da eh nicht ! GoTo benutzte ich manchmal! Ein Haupt(Main) Programm mach ich grundsätzlich nicht, da es dann schwieriger ist ein Menüe oder ähnliches zu impletieren! Und der minimale Speedverlust der bei Functionen draufgeht ist mir egal! Abgesehen davon würde ich keine Function 200 mal innerhalb eines Frames aufrufen, sondern das so programmieren das das nicht nötig ist! |
||
[BB2D | BB3D | BB+]
|
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
.Bemerkung
Also wenn was böse ist, dann Goto. Gosub dagegen ist harmlos, da es automatisch wieder dorthin zurrück geht von wo aus es aufgerufen wurde... Demnach unterscheidet sich ein Gosub kaum von einer Funktion. Wenn man davon ausgeht das sowieso zu über 90% aller hier geposteten Programmabschnitte die Funktion missbrauchen. Eine Funktion ist eigentlich dazu gedacht um Rückgabewerte zu geben. Also sowas wie Sin/Cos/Sqr usw... Die meisten hier machen unendlich viele Funktionen in winzigen Programmen, weil sie denken das es toll sein soll und schiessen sich damit selbst ins Bein. Zudem ist ein Gosubaufruf schneller als ein Funktionsaufruf. Das einzige was mich persönlich an Gosub stört, ist die schlechte Übersichtlichkeit eines Punktes als Anfang. Return |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Awa! Weder Gosub noch Goto sind "böse" -auf den Einsatz kommt es an. Ein Coder, der einen Befehl pauschal verdammt, hat doch nur Angst vor seiner eigenen Unfähigkeit ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cardonic hat Folgendes geschrieben: Hi
Gosub arbeitet schneller als Funktionen; Dieses Märchen hält sich aber ziemlich hartnäckig. Ich verweise einfach mal auf meinen Vergleich: Link Der wirklich minimale Zeitvorteil bei Gosub, der fast im Rauschen untergeht, spielt bei der Spieleentwicklung nun wirklich keine Rolle. Da gibt es ganz andere Flaschenhälse. ![]() Gruß - Xaron |
||
Cerberus X - Monkey X Reloaded! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Xaron, habe mir mal dein Geschwindigkeitstest mal angesehen. Muß aber dazu sagen, daß so ein Test nicht 'veralgemeinert' werden kann... Beispiel: Habe mal ein Spiel geschrieben wo man ein Raumschiff steuern konnte. Beim Schub wurden Flammen mit Line dargestellt (sah sehr gut aus). Immer wenn ich ein neuen Schub angestossen habe, hackte das Spiel ganz kurz. Das war echt nervig und nach sehr langem rumtesten bin ich zum Schluss gekommen, daß das Line der Grund dafür war. Habe dann zusätzlich bei jedem Schleifendurchlauf ein Line -Befehl in den Koordinaten -1,-1,-2,-1 ausserhalb des Bildschirmes gelegt. Und was war passiert? Das Spiel lief gnadenlos fliessend, egal wann ich Schub gegeben habe und wann nicht. Ein Funktionsaufruf kann von mir aus schnell sein, muß aber nicht wenn dieser längere Zeit nicht in Anspruch genommen wurde und dann mal wieder aufgerufen wird... Will jetzt auch keine Disskusionen über das auskitzeln der letzten 0.000001 ms beisteuern, nur das so ein Test nicht unbedingt eine grundlegende Aussage machen muß.
Den genauen Grund, warum das Line die Verzögerung verursacht hat, weiß ich nicht. Könnte mir aber vorstellen das es mit dem Cache zusammen hängt. Dieser kann u.A. auch Codeabschnitte beinhalten und wenn diese 'längere' Zeit nicht benötigt werden, werden sie einfach raus geschmissen. Kommt dann wieder dieser Codeabschnitt, muß dieser erst vom langsamen RAM ausgelesen werden... Wenn die Funktion in ihrem Umfang wesentlich komplexer ist, dann kann so ein Neuabruf schon mal etwas länger dauern. Ausser man benutzt ständig irgendwelche Funktionen und behält sie somit im schnellem Cache... |
||
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
hectic, der Vergleich hinkt aber etwas. Die Zeiten, wo man noch in Taktzyklen gerechnet hat und Sachen auf dem Stack anlegen und wieder löschen noch wesentliche Zeit verbraten hat, sind ja glücklicherweise vorbei. ![]() Gruß - Xaron |
||
Cerberus X - Monkey X Reloaded! |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Es gibt einen elementaren Unterschied zwischen Gosub und Funktionen:
Funktionen erzeugen einen eigenen Variablenraum, wo man lokale Variablen erzeugen kann, die danach wieder entsorgt werden. Gosub hingegen "beult" einfach den aktuellen Variablenraum ein wenig aus indem die Programmausführung temporär an einem anderen Ort weitergeführt wird, jedoch immer noch innerhalb des gleichen Variablenraumes. Es gibt durchaus Fälle, wo Gosub vorzuziehen ist, zb Laden von Media, Variableninitialisierung etc, da man dann nicht alles global machen muss, was eine sehr schädliche Angelegenheit ist. Anderseits gibt es Fälle wo Funktionen unumgänglich sind, weil man etwas durch bestimmte Werte machen will. Gosub verwenden wenn: - man etwas mit den Variablen machen will, die man schon hat - es sonst eine Funktion ohne Übergabeparameter und Rückgabewert geben würde Funktionen verwenden wenn: - man einen Rückgabewert braucht (Erzeugungsfunktionen für Types zb) - wenn man bestimmte, nicht vorgebene Werte übergeben will um etwas spezielles damit zu machen, was man an verschiedenen Orten braucht Goto verwenden wenn: Es gibt eigentlich nur einen Grund Goto zu verwenden: Der ist um aus mehrstufigen Schleifen herauszuspringen. Dies ist auch nur nötig, weil erst BlitzMax Schleifenlabels unterstützt, so das man mit einem Exit auch eine 3fache Schleife verlassen kann. Ansonsten sollte man von Goto Abstand nehmen, denn der Code wird nur unlesbarer, an der Geschwindigkeit ändert sich nichts. (es gibt kaum etwas was Goto kann, was mit While / For / If nicht zu machen wäre, ausser halt Schleifen verlassen) PS: Ich persönlich finde, es gibt nichts schlimmeres, als Leute die auch noch in Funktionen Goto / Gosub einsetzen. Entweder das eine oder das andere, aber nicht den Codefluss total zerstören bitte. Blitz erlaubt da leider sehr viel sehr grausiges Zeug auf das ich nicht näher eingehe um solche Dinge nicht noch zu fördern. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
es gab schon mal so einen Thread
https://www.blitzforum.de/viewtopic.php?t=12164 |
||
[BB2D | BB3D | BB+]
|
![]() |
miLORD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt eine Möglichkeit GOTO zu verwenden...
und zwar, wenn man aus einer function die selbe fuction aufrufen muss. Sonst seh ich für Sachen mit .GO oder GO keine Verwendung - in meinen codes. Aber jeder wie er will. |
||
brqwq?! oO |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Function test(peng)
Rekursiver Funktionsaufruf? peng=peng+1 If peng>10 Return peng test(peng) End Function ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group