Memoryleak bei Spiel & Tipps zur Codeoptimierung

  • C#
  • .NET (FX) 4.0

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Weiß jetzt jemand noch was zu meinem zweiten Problem? Hier noch mal die Methode:
    Spoiler anzeigen

    C#-Quellcode

    1. private WabeFieldType CalculateFieldType(WabeType type, WabeDirection direction, int index)
    2. {
    3. var result = WabeFieldType.Center;
    4. switch (type)
    5. {
    6. case WabeType.TwoWabe:
    7. if (direction.HasFlag(WabeDirection.Up) && direction.HasFlag(WabeDirection.Left))
    8. {
    9. if (index == 0 || index == 1 || index == 2 || index == 3 || index == 6 || index == 8) result = WabeFieldType.Unused;
    10. if (index == 4) result = WabeFieldType.Center;
    11. if (index == 5 || index == 7) result = WabeFieldType.Unpowered;
    12. }
    13. else if (direction.HasFlag(WabeDirection.Down) && direction.HasFlag(WabeDirection.Left))
    14. {
    15. if (index == 0 || index == 2 || index == 3 || index == 6 || index == 7 || index == 8) result = WabeFieldType.Unused;
    16. if (index == 4) result = WabeFieldType.Center;
    17. if (index == 5 || index == 1) result = WabeFieldType.Unpowered;
    18. }
    19. else if (direction.HasFlag(WabeDirection.Up) && direction.HasFlag(WabeDirection.Right))
    20. {
    21. if (index == 0 || index == 1 || index == 2 || index == 5 || index == 6 || index == 8) result = WabeFieldType.Unused;
    22. if (index == 4) result = WabeFieldType.Center;
    23. if (index == 3 || index == 7) result = WabeFieldType.Unpowered;
    24. }
    25. else if (direction.HasFlag(WabeDirection.Down) && direction.HasFlag(WabeDirection.Right))
    26. {
    27. if (index == 0 || index == 2 || index == 5 || index == 6 || index == 7 || index == 8) result = WabeFieldType.Unused;
    28. if (index == 4) result = WabeFieldType.Center;
    29. if (index == 1 || index == 3) result = WabeFieldType.Unpowered;
    30. }
    31. break;
    32. case WabeType.ThreeWabe:
    33. if (direction == WabeDirection.Left)
    34. {
    35. if (index == 0 || index == 2 || index == 3 || index == 6 || index == 8) result = WabeFieldType.Unused;
    36. if (index == 4) result = WabeFieldType.Center;
    37. if (index == 1 || index == 5 || index == 7) result = WabeFieldType.Unpowered;
    38. }
    39. else if (direction == WabeDirection.Right)
    40. {
    41. if (index == 0 || index == 2 || index == 5 || index == 6 || index == 8) result = WabeFieldType.Unused;
    42. if (index == 4) result = WabeFieldType.Center;
    43. if (index == 1 || index == 3 || index == 7) result = WabeFieldType.Unpowered;
    44. }
    45. else if (direction == WabeDirection.Up)
    46. {
    47. if (index == 0 || index == 1 || index == 2 || index == 6 || index == 8) result = WabeFieldType.Unused;
    48. if (index == 4) result = WabeFieldType.Center;
    49. if (index == 7 || index == 3 || index == 5) result = WabeFieldType.Unpowered;
    50. }
    51. else if (direction == WabeDirection.Down)
    52. {
    53. if (index == 0 || index == 2 || index == 6 || index == 7 || index == 8) result = WabeFieldType.Unused;
    54. if (index == 4) result = WabeFieldType.Center;
    55. if (index == 3 || index == 5 || index == 1) result = WabeFieldType.Unpowered;
    56. }
    57. break;
    58. case WabeType.FourWabe:
    59. if (direction == WabeDirection.Mid)
    60. {
    61. if (index == 0 || index == 2 || index == 6 || index == 8) result = WabeFieldType.Unused;
    62. if (index == 4) result = WabeFieldType.Center;
    63. if (index == 1 || index == 3 || index == 5 || index == 7) result = WabeFieldType.Unpowered;
    64. }
    65. break;
    66. }
    67. return result;
    68. }


    Funktionieren tuts, sieht aber etwas unschön aus. Deswegen frag ich wie man das besser lösen könnte. ;)
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    KaskadekingDE schrieb:

    besser lösen
    Mit nem switch würde der Code schmaler und länger, allerdings meiner Meinung nach auch übersichtlicher.
    Überleg mal, index als enum zu handeln.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ein Versuch - ungetestet:
    Spoiler anzeigen

    C#-Quellcode

    1. private int[] _unusedIndicees = new int[] { 0, 2, 6, 8 };
    2. private WabeFieldType CalculateFieldType(WabeType type, WabeDirection direction, int index) {
    3. if (index == 4) return WabeFieldType.Center;
    4. if(Array.IndexOf(_unusedIndicees,index)>=0)return WabeFieldType.Unused;
    5. switch (type) {
    6. case WabeType.TwoWabe:
    7. if (direction.HasFlag(WabeDirection.Up | WabeDirection.Left)) {
    8. if (index == 1 || index == 3) return WabeFieldType.Unused;
    9. if (index == 5 || index == 7) return WabeFieldType.Unpowered;
    10. }
    11. else if (direction.HasFlag(WabeDirection.Down | WabeDirection.Left)) {
    12. if (index == 3 || index == 7) return WabeFieldType.Unused;
    13. if (index == 5 || index == 1) return WabeFieldType.Unpowered;
    14. }
    15. else if (direction.HasFlag(WabeDirection.Up | WabeDirection.Right)) {
    16. if (index == 1 || index == 5) return WabeFieldType.Unused;
    17. if (index == 3 || index == 7) return WabeFieldType.Unpowered;
    18. }
    19. else if (direction.HasFlag(WabeDirection.Down | WabeDirection.Right)) {
    20. if (index == 5 || index == 7) return WabeFieldType.Unused;
    21. if (index == 1 || index == 3) return WabeFieldType.Unpowered;
    22. }
    23. break;
    24. case WabeType.ThreeWabe:
    25. if (direction == WabeDirection.Left) {
    26. if (index == 3) return WabeFieldType.Unused;
    27. if (index == 1 || index == 5 || index == 7) return WabeFieldType.Unpowered;
    28. }
    29. else if (direction == WabeDirection.Right) {
    30. if (index == 5) return WabeFieldType.Unused;
    31. if (index == 1 || index == 3 || index == 7) return WabeFieldType.Unpowered;
    32. }
    33. else if (direction == WabeDirection.Up) {
    34. if (index == 1) return WabeFieldType.Unused;
    35. if (index == 7 || index == 3 || index == 5) return WabeFieldType.Unpowered;
    36. }
    37. else if (direction == WabeDirection.Down) {
    38. if ( index == 7 ) return WabeFieldType.Unused;
    39. if (index == 3 || index == 5 || index == 1) return WabeFieldType.Unpowered;
    40. }
    41. break;
    42. case WabeType.FourWabe:
    43. if (direction == WabeDirection.Mid) {
    44. if (index == 1 || index == 3 || index == 5 || index == 7) return WabeFieldType.Unpowered;
    45. }
    46. break;
    47. }
    48. throw new ArgumentException("<hier eine kluge Meldung>");
    49. }
    50. }
    Die ElseIfs testen nur 1- oder 2-fach geflaggte directions - aber auch 3-fach geflaggte directions würden akzeptiert - soll das legal sein? Eine direction.Up | direction.Down | direction.Left erscheint mir nämlich unsinnig, und wert, eine Exception zu werfen.

    hier noch verschärfte Fassung:
    Spoiler anzeigen

    C#-Quellcode

    1. private WabeFieldType CalculateFieldType(WabeType type, WabeDirection direction, int index) {
    2. if (index == 4) return WabeFieldType.Center;
    3. if (0 != ((index + 1) & 1)) return WabeFieldType.Unused;//gradzahlige indicees
    4. switch (type) {
    5. case WabeType.TwoWabe:
    6. switch (direction) {
    7. case WabeDirection.Up | WabeDirection.Left:
    8. return (0 == (index & 4)) ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    9. case WabeDirection.Down | WabeDirection.Right:
    10. return (0 != (index & 4)) ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    11. case WabeDirection.Down | WabeDirection.Left:
    12. return (0 != (index & 2)) ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    13. case WabeDirection.Up | WabeDirection.Right:
    14. return (0 == (index & 2)) ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    15. }
    16. break;
    17. case WabeType.ThreeWabe:
    18. switch (direction) {
    19. case WabeDirection.Left:
    20. return index == 3 ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    21. case WabeDirection.Right:
    22. return index == 5 ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    23. case WabeDirection.Up:
    24. return index == 1 ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    25. case WabeDirection.Down:
    26. return index == 7 ? WabeFieldType.Unused : WabeFieldType.Unpowered;
    27. }
    28. break;
    29. case WabeType.FourWabe:
    30. if (direction == WabeDirection.Mid) return WabeFieldType.Unpowered;
    31. break;
    32. }
    33. throw new ArgumentException("<hier eine kluge Meldung>");
    34. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @RodFromGermany
    Ich bin kein Fan davon switch in anderen switch-Blöcken zu verwenden.
    Das Problem ist ich hab nur den Index des Feldes und daraus möchte ich ja ein Enum-Wert haben .
    @ErfinderDesRades

    ErfinderDesRades schrieb:

    Die ElseIfs testen nur 1- oder 2-fach geflaggte directions - aber auch 3-fach geflaggte directions würden akzeptiert - soll das legal sein? Eine direction.Up | direction.Down | direction.Left erscheint mir nämlich unsinnig, und wert, eine Exception zu werfen.

    Ne aber ich denke nicht dass es jemals auftauchen wird (außer jemand würde den Code ändern ^^)

    Mich würde intressieren was diese Zeile macht:

    ErfinderDesRades schrieb:

    C#-Quellcode

    1. return (0 != (index & 4))

    laut MSDN wird "das bitweise logische AND der beiden Operatoren" berechnet. Jedoch versteh ich das nicht so ganz.
    Kannst du mir das erklären? :)
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    KaskadekingDE schrieb:

    und daraus möchte ich ja ein Enum-Wert haben.
    Dann musst Du das als enum implementrieren und im Projekt durchziehen.
    Alternativ könntest Du den index in dieser Prozedur auf ein korrektes enum casten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    0 != (index & 4) index wird mit 4 ge-undet, der geklammerte Teil-Ausdruck ist also entweder 4 oder 0.
    Der Gesamt-Ausdruck trifft also zu, wenn in index das 4er-Bit gesetzt ist.

    KaskadekingDE schrieb:

    Ne aber ich denke nicht dass es jemals auftauchen wird (außer jemand würde den Code ändern ^^)
    ich habs sogar getestet - unsinnig geflaggte directions tauchen niemals auf.
    Daher würde ich meine Lösung sehr empfehlen, in solchen Fällen - die ja nur auftreten, wenn eklatanter Bockmist verzapft wurde - dann auch die ArgumentException zu schmeissen.
    Also nicht denken, dass..., sondern sicherstellen, dass... :D


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    KaskadekingDE schrieb:

    Kannst du mir das erklären?
    Wie lange brauchst Du, um das ganze experimentell zu erforschen und zu verstehen?
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Dann musst Du das als enum implementrieren und im Projekt durchziehen.

    Ich habe in jeder Wabe ein Array welches 9 Felder beinhaltet. Und ich muss aus jeden Feld den Typ herrausfinden, mit Berücksichtigung der jeweiligen WabeDirection
    Wie soll ich da den Index als enum implementieren? ;)

    RodFromGermany schrieb:

    Wie lange brauchst Du, um das ganze experimentell zu erforschen und zu verstehen?

    Ich weiß wie man debuggt. Glaub mir ;)
    Bei folgenden Code:

    C#-Quellcode

    1. for(var i = 0; i < 10; i++)
    2. Console.WriteLine("Number " + i + " = " + (i & 4));
    3. Console.ReadLine();

    Bekomm ich folgende Ausgabe:

    Number 0 = 0
    Number 1 = 0
    Number 2 = 0
    Number 3 = 0
    Number 4 = 4
    Number 5 = 4
    Number 6 = 4
    Number 7 = 4
    Number 8 = 0
    Number 9 = 0

    @ErfinderDesRades
    Ok danke ;)
    Also heißt das
    0-3 = 0
    4-7 = 4
    8-11 = 0
    12-15 = 4
    usw..?
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    KaskadekingDE schrieb:

    Wie soll ich da den Index als enum implementieren?

    C#-Quellcode

    1. enum WabeDirection
    2. {
    3. Left,
    4. Top,
    5. Right,
    6. Bottom,
    7. // und die anderen, die Du brauchst
    8. }
    Mach ggf ein [Flags] draus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    KaskadekingDE schrieb:

    Also heißt das
    0-3 = 0
    4-7 = 4
    8-11 = 0
    12-15 = 4
    usw..?
    ja, tatsächlich, das heisst es (hab ich noch nie so betrachtet) :)

    Ich betrachte es halt bitweise, und diese Ausdrücke entsprechen so ziemlich, was bei Enums die Enum.HasFlag-Methode macht.
    0 != (bla & 2) entspricht bla.HasFlag(2)

    Wobei es dem nur entspricht, solange die Flag-Muster nur ein Bit enthalten.
    @RodFromGermany
    Ich hab bereits so ein enum. Das wird sogar in der Methode als 2. Parameter übergeben ;)

    C#-Quellcode

    1. [Flags]
    2. public enum WabeDirection
    3. {
    4. Left = 1,
    5. Right = 2,
    6. Up = 4,
    7. Down = 8,
    8. Mid = 16
    9. }
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Hier noch eine ähnliche Bearbeitung:

    C#-Quellcode

    1. private WabeDirection CalculateDirection(Vector2 position) {
    2. var min = (int)position.X;
    3. var max = (int)position.Y;
    4. switch (_wabe.Type) {
    5. case WabeType.TwoWabe:
    6. if (_wabe.X == min) {
    7. if (_wabe.Y == min) return WabeDirection.Left | WabeDirection.Up;
    8. else if (_wabe.Y == max) return WabeDirection.Left | WabeDirection.Down;
    9. }
    10. else if (_wabe.X == max) {
    11. if (_wabe.Y == min) return WabeDirection.Right | WabeDirection.Up;
    12. else if (_wabe.Y == max) return WabeDirection.Right | WabeDirection.Down;
    13. }
    14. break;
    15. case WabeType.ThreeWabe:
    16. if (_wabe.X == min) return WabeDirection.Left;
    17. if (_wabe.X == max) return WabeDirection.Right;
    18. if (_wabe.Y == min) return WabeDirection.Up;
    19. if (_wabe.Y == max) return WabeDirection.Down;
    20. break;
    21. case WabeType.FourWabe:
    22. break;
    23. }
    24. return WabeDirection.Mid;
    25. }