Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

21

23.01.2018, 14:05

Das sieht doch soweit ganz gut aus. Ob der Code jetzt optimierter ist oder nicht ist relativ. An sich ist es erst mal wichtig dass er verständlich ist. Du könntest den Part theoretisch in eine Funktion auslagern. Dadurch würde das ganze vielleicht noch etwas leserlicher. Ansonsten optimieren Compiler eigentlich schon ganz gut für dich.
Spaßeshalber könnte man mal sehen was passiert wenn man ohne Optimierung übersetzt:

C-/C++-Quelltext

1
2
3
4
            bool cellExists = currentCellIndex.x >= 0 &&
                  currentCellIndex.y >= 0 &&
                  currentCellIndex.x < mapCells.GetLength(0) &&
                  currentCellIndex.y < mapCells.GetLength(1);

Eine Zuweisung,
Vier Vergleiche,
Drei Konjunktionen die durch SCE die Ausführung frühzeitig unterbrechen können.
Im Fall der wohl am häufigsten vorkommt, dass die Position im Raster liegt, hast du also die vier Vergleiche, die drei Konjunktionen und die Zuweisung.

C-/C++-Quelltext

1
bool cellExists = Math.Min(mapCells.GetLength(0) - 1, Math.Abs(x)) == x && Math.Min(mapCells.GetLength(1) - 1, Math.Abs(y)) == y;


Eine Zuweisung,
Vier Vergleiche ( 2x == und 2x Math.Min )
Eine Konjunktion
Zwei Subtraktionen
Zwei mal Math.Abs ( kann geschickt durch bitweises Und implementiert werden )

Unabhängig davon dass die Leserlichkeit viel wichtiger ist als ist die erste Version vermutlich sogar effizienter. Allein dadurch dass du dort die SCE an drei Stellen hast und den ausgeführten Code frühzeitig unterbrechen kannst. Genauer nachgemessen habe ich das aber nicht. So Low Level Optimierung ist an sich total schwachsinnig. Ich wollte das hier nur mal ausführen um dir zu zeigen dass kürzerer Code nicht unbedingt optimaler sein muss. POITROAE
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

22

23.01.2018, 14:06

Nicht zu vergessen: Zig-mal wird mapCells.GetLength aufgerufen statt es einmal zu tun und sich das Ergebnis zu merken.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

23.01.2018, 14:20


Nicht zu vergessen: Zig-mal wird mapCells.GetLength aufgerufen statt es einmal zu tun und sich das Ergebnis zu merken.

Wobei das vom Compiler theoretisch weg optimiert werden kann. Ob das wirklich passiert nicht natürlich fraglich. Man müsste sich das Ergebnis mal ansehen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

24

23.01.2018, 15:48

@David, klar, hab ich schon aus der while-Schleife rausgenommen.

Ich könnte es mir auch Global merken, aber dann hat man wieder Variablen rumfliegen, das will man ja auch nicht. :whistling:

Werbeanzeige