Srites in Sprite

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Mir ist PB ohnehin schon schnell genug, ist außerdem eine Ladefunktion, da
macht sowas kaum etwas aus. Und mit 64 Mb Ram und sonst nur 8 bit Bmp's
ist das relativ unnötig. Ist mir um ehrlich zu sein im Moment auch egal.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

ich denk auch nicht, dass es irgendeine bemerkbare Effizienzsteigerung bringt,
aber IMHO gehören solche Verbesserungen zu einem guten Programmierstil.

Es geht da meines Erachtens halt nicht um 0,00000001 Sekunden schnellere berechnung oder so,
sondern darum, dass man den besten und schnellsten Code hat,
der in der jeweiligen Prog.-Sprache mit normalen Mitteln und Aufwand erreichbar ist.

Letzten Endes summieren sich solche Kleinigkeiten ja schnell zu ein paar Sekunden,
und da ist es schon enorm nervig,
wenns auch anderst möglich wäre.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

meine Wenigkeit hat geschrieben:...ist in diesem fall irrelevant, kann aber bei performance-kritischem code was ausmachen :wink:
...und da fand ich den hinweis mit dem dummy echt praktisch...
Kekskiller hat geschrieben:... die ihr schon längst als Museumsstücke ansehen würdet...
schau mal in mein profil....
Deeem2031 hat geschrieben:Wär nicht schlecht wenn Fred einen Anhang (wie Step) einbauen könnte, dass man will das der Wert zuerst augerechnet werden würde und nicht immer neu..
...muss das denn "on demand" sein ? vielleicht kann man den rücksprung-punkt generell ändern...

...ich weiss, das problem wäre das zwischenspeichern des wertes... die variable ist ein pointer, das ergebnis ist aktuell vorhanden...

also, konkrete frage (betreff PB-Source):
gäbe es eine möglichkeit, start und endwert von FOR-TO (und auch STEP, wenn variablen dort erstmal implementiert sind) zu puffern, damit deren berechnung nur einmal und nicht bei jedem durchlauf ausgefürt werden ?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Kaeru Gaman hat geschrieben:also, konkrete frage (betreff PB-Source):
gäbe es eine möglichkeit, start und endwert von FOR-TO (und auch STEP, wenn variablen dort erstmal implementiert sind) zu puffern, damit deren berechnung nur einmal und nicht bei jedem durchlauf ausgefürt werden ?

Code: Alles auswählen

x = Berechnung1()
y = Berechnung2()
For i = x To y
  ; do it
Next i
Der Coder muß es selbst machen, wenn PB es nicht von
selbst optimiert.

Viele Compiler optimieren das selbst. Beschreibung mit einem
ähnlichen Beispiel findest Du in den NULLSTONE Optimization Categories
unter dem Punkt Hoisting.
Auch noch ähnlich ist die Quick Optimization.

Der Compiler checkt also ob etwas in den Expressions x und y
in der Schleife *verändert* wird. Wobei x der StartPunkt ist,
also eh nur einmal gebraucht wird. Wichtig ist also das "To".
Beispiel:

Code: Alles auswählen

For zy = 0 To heighttiles-1
Hier checkt der Compiler einfach ob "heighttiles" innerhalb der
Schleife verändert wird.
Ist das nicht der Fall, dann kann er das Ergebniss vor der
Schleife ausrechnen, da es sich während der Schleife nicht
mehr ändert.
Dann einfach noch zy und das Ergebniss in Register, und alles wird gut.

Es lohnt sich mal die Kategorien und Beispiele bei Nullsoft
anzuschauen, schliesslich muß man das alles als PB-Coder
selbst machen - soweit man Einfluß hat und optimieren will.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

In Anbetracht der Tatsache, dass Master Gaman anscheinend immer noch
unzfrieden ist, gibt hier nochmal eine veränderte Variante, mit zwei Variablen
mehr:

Code: Alles auswählen

Procedure.b LoadAnimSprite(AnimSprite.l,FileName$, TileWidth.l,TileHeight.l, Mode.l, MaskRed.l,MaskGreen.l,MaskBlue.l)
  If FileSize(FileName$) >= 0
    LoadSprite(#TMP_AnimSprite, FileName$, 0)
    widthtiles = SpriteWidth(#TMP_AnimSprite) / TileWidth
    heighttiles =SpriteHeight(#TMP_AnimSprite) / TileHeight
    UseBuffer(#TMP_AnimSprite)
    zxend = widthtiles - 1
    zyend = heighttiles - 1
    For zy = 0 To zxend
      For zx = 0 To zyend
        GrabSprite(AnimSprite + z, zx*TileWidth,zy*TileHeight, TileWidth,TileHeight, Mode)
        TransparentSpriteColor(AnimSprite + z, MaskRed,MaskGreen,MaskBlue)
        z = z + 1
      Next
    Next
    ReturnCode = 1
    FreeSprite(#TMP_AnimSprite)
    UseBuffer(-1)
  Else
    ReturnCode =  0
  EndIf
  ProcedureReturn ReturnCode
EndProcedure
Obwohl ich jetzt auch keine Klammern mehr ausrechnen muss, finde ich
es in dieser Situation in dieser Sprache nicht nötig. Meist hat man in
solchen Bilder kleine Sprites, mit mittlerer Anzahl, da geht das schon in
Ordnung. Aber überlegt dochmal, die hauptsächlichen Zeitschlucker sind
doch die Grabimage- und Ladefunktion, die nehmen mehr Zeit weg als
simple Divisionen im Code.

@Master Gaman (klingt cool):
Willkommen im Club, ich bin auch Perfektionist, aber nur wenn es auch
angebracht oder nötig ist. ABER BEI SOLCHEN KLEINIGKEITEN IST DAS
DOCH KAUM EINE WELT. Naja, egal, Geschmackssache... Auf jeden Fall
kann ich es nicht leiden, wenn Anwendungen schelcht und nicht perfekt,
bzw. synchron gesetzte Gadgets haben.

@bluejoke:
Muss ich dir zustimmen, hier ist es kaum eine Steigerung (höchstens in
ausgewachsenen Word-Bereichen). Hätte ich das beispielsweise in
Quickbasic oder auch Blitzbasic gemacht (wo so eine Funktion sogar noch
schneller, besser und handlicher vorhanden ist), dann hätte ich von
grundauf alle Werte so wenig wie nur möglich berechnet.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

bitte versteh mich richtig...

zu beginn sollte das nur ein tipp am rande sein, mir ist vollkommen klar, das der aufwand deiner routine so minimal ist, dass du die "1" innerhalb der schleife ruhig aus "e^(2*i*pi)" hättest errechnen können. :mrgreen:

interessant wurde es dann, als die frage aufkam, ob denn die berechnung WIRKLICH vorher stattfindet, wenn man sie in die schleifendefinition packt, oder ob man einen dummy erzeugen MUSS, wenn man diese operation draussen halten möchte. - diese diskussion hatte nichts mehr mit deiner routine zu tun, sondern war allgemein-informativ. <)

danke für das willkommen.
das "Master" ist nicht nötig, besonders nicht, wenn es eher sarkastisch gemeint ist. :?
schiefe Gadgeds oder Buttons kann ich auch nicht ausstehen - es lebe die pixelgenaue arbeit. :wink:

@Danilo
also, konkrete frage (betreff PB-Source):
...war eigentlich an die entwickler gerichtet, ob man sowas in der mystischen "Version 4" vielleicht einbauen könnte... hab ich wohl nicht deutlich gemacht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Trotzdem finde ich diese Disskusion sinnlos. Wer darüber diskutieren will,
solle doch den ersten Stein auf einen neuen Thread werfen... Obwohl, sowas
gibt ja natürlich "Einschaltquoten".
Antworten