Minecraft-Klon, Leistung inkrementieren

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Jop, hat funktioniert.. ich musste die Frequenzen skalieren, und den Faktor richtig setzen. (1/256)

    Nächstes Problem ist diesmal (leider) wieder die Perfomance.
    Bei einer Render-Distanz von 70 Einheiten sieht es aus wie Tiny bei Minecraft, obwohl die Map 8x8 Chunks groß ist.(Siehe Screenshot).

    Gibt es denn keinerlei Potenzialitäten, "einmal" zu rendern, und sonst, wenn etwas geändert wird?
    Das ist meines Erachtens der einzige Kompromiss.

    Nun, bei Release-Mode habe ich um die 50~60 FPS..
    zu Unrecht rendert meine Applikation über 3000 Würfel, obwohl gerade mal maximal 200 gesehen werden.(Anhang 4)

    Im Anhang 1 ist die Welt und seine Renderdistanz hervorgehoben,
    im Anhang 2 die FPS,
    und im Anhang 3 was alles gerendert wird.

    (Es wird alles das gezeichnet, was auch potentiell gesehen werden könnte.)

    Ich bedanke mich für eure Hilfe.

    Post scriptum: Wie groß ist denn ein Würfel in Minecraft?!
    Meines ist auf 0.5 skaliert..
    Bilder
    • Screenshot (305).png

      723,79 kB, 1.920×1.080, 163 mal angesehen
    • Screenshot (306).png

      523,33 kB, 1.920×1.080, 137 mal angesehen
    • Screenshot (309).png

      584,97 kB, 1.920×1.080, 137 mal angesehen
    • Screenshot (312).png

      257,95 kB, 1.920×1.080, 144 mal angesehen
    Und Gott alleine weiß alles am allerbesten und besser.

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

    Nehm lieber 16*16*16 ushort für die indices.
    DIe Chunks sind wichtig für die Veränderung, wenn die Welt sich nicht verändern soll, dann kannst du gerne alles in einem machen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Wird wohl Zeit das ich selber eine Cube zur Laufzeit generiere :D , habe immer ein Model verwendet .

    ​DIe Chunks sind wichtig für die Veränderung, wenn die Welt sich nicht verändern soll, dann kannst du gerne alles in einem machen.

    Jo, so mach ich es schon.

    Ein wesentliches Problem stellt das (statische) ViewFrustum dar.
    Es hat eine farplane von 75(konstant).

    Wenn nun exemplarisch auf eine Mauer geguckt wird, die 5 breit und 5 hoch ist(und in die Tiefe geht, hier: 200)) dann rendert er nicht 25 Würfel wie angenommen, sondern 1875 .(Weil nun mal die far Plane 75 Einheiten ist)
    Ich habe mir gedacht, mit einem Ray die Distanz zu einem signifikanten Objekt zu messen; und diese dann dem far Plane zuzuweisen.

    Ist das eine gute Idee, oder "clusterfuck"?
    Und Gott alleine weiß alles am allerbesten und besser.
    LOL!
    Das Prüfen, ob ein Würfel im ViewFrustum liegt war das Problem.
    Wenn ich alles auf einmal render (um die 21000 Blöcke) habe ich im Debug-Mode(!) konstant 60 FPS . 8o

    Nun, ich generiere den Würfel zur Laufzeit :

    C#-Quellcode

    1. public class Cube
    2. {
    3. private VertexPositionTexture[] Vertices = new VertexPositionTexture[8];
    4. private ushort[] Indices = new ushort[36];
    5. public static VertexBuffer VertexBuffer { get; private set; }
    6. public static IndexBuffer IndexBuffer { get; private set; }
    7. public static void Initialize()
    8. {
    9. new Cube().SetUpVertices().SetUpIndices();
    10. }
    11. private Cube SetUpVertices()
    12. {
    13. //Vector2 textureTopLeft = new Vector2(1.0f * Size.X, 0.0f * Size.Y);
    14. //Vector2 textureTopRight = new Vector2(0.0f * Size.X, 0.0f * Size.Y);
    15. //Vector2 textureBottomLeft = new Vector2(1.0f * Size.X, 1.0f * Size.Y);
    16. //Vector2 textureBottomRight = new Vector2(0.0f * Size.X, 1.0f * Size.Y);
    17. Vertices[0] = new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(1, 0));
    18. Vertices[1] = new VertexPositionTexture(new Vector3(0, 1, 0), new Vector2(0, 1));
    19. Vertices[2] = new VertexPositionTexture(new Vector3(1, 1, 0), new Vector2(1, 1));
    20. Vertices[3] = new VertexPositionTexture(new Vector3(1, 0, 0), new Vector2(1, 0));
    21. Vertices[4] = new VertexPositionTexture(new Vector3(0, 0, -1), new Vector2(0, 1));
    22. Vertices[5] = new VertexPositionTexture(new Vector3(0, 1, -1), new Vector2(1, 1));
    23. Vertices[6] = new VertexPositionTexture(new Vector3(1, 1, -1), new Vector2(1, 1));
    24. Vertices[7] = new VertexPositionTexture(new Vector3(1, 0, -1), new Vector2(1, 0));
    25. VertexBuffer = new VertexBuffer(Global.GlobalShares.GlobalDevice, typeof(VertexPositionTexture), 8, BufferUsage.WriteOnly);
    26. VertexBuffer.SetData<VertexPositionTexture>(Vertices);
    27. return this;
    28. }
    29. private Cube SetUpIndices()
    30. {
    31. //Front face
    32. //bottom right triangle
    33. Indices[0] = 0;
    34. Indices[1] = 3;
    35. Indices[2] = 2;
    36. //top left triangle
    37. Indices[3] = 2;
    38. Indices[4] = 1;
    39. Indices[5] = 0;
    40. //back face
    41. //bottom right triangle
    42. Indices[6] = 4;
    43. Indices[7] = 7;
    44. Indices[8] = 6;
    45. //top left triangle
    46. Indices[9] = 6;
    47. Indices[10] = 5;
    48. Indices[11] = 4;
    49. //Top face
    50. //bottom right triangle
    51. Indices[12] = 1;
    52. Indices[13] = 2;
    53. Indices[14] = 6;
    54. //top left triangle
    55. Indices[15] = 6;
    56. Indices[16] = 5;
    57. Indices[17] = 1;
    58. //bottom face
    59. //bottom right triangle
    60. Indices[18] = 4;
    61. Indices[19] = 7;
    62. Indices[20] = 3;
    63. //top left triangle
    64. Indices[21] = 3;
    65. Indices[22] = 0;
    66. Indices[23] = 4;
    67. //left face
    68. //bottom right triangle
    69. Indices[24] = 4;
    70. Indices[25] = 0;
    71. Indices[26] = 1;
    72. //top left triangle
    73. Indices[27] = 1;
    74. Indices[28] = 5;
    75. Indices[29] = 4;
    76. //right face
    77. //bottom right triangle
    78. Indices[30] = 3;
    79. Indices[31] = 7;
    80. Indices[32] = 6;
    81. //top left triangle
    82. Indices[33] = 6;
    83. Indices[34] = 2;
    84. Indices[35] = 3;
    85. IndexBuffer = new IndexBuffer(Global.GlobalShares.GlobalDevice, IndexElementSize.SixteenBits, sizeof(ushort) * Indices.Length, BufferUsage.WriteOnly);
    86. IndexBuffer.SetData<ushort>(Indices);
    87. return this;
    88. }
    89. }
    (stackoverflow.com/questions/94…-draw-in-xna-with-c-sharp) .

    Das Problem sind die Texture-Koordinaten bei einem indizierten Würfel.
    Ist es möglich für solch ein Würfel Texture-Koordinaten zu setzen?

    Liebe Grüße.
    Bilder
    • Screenshot (327).png

      197,79 kB, 1.920×1.080, 135 mal angesehen
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „φConst“ ()

    Ich habe die Texture-Koordinaten angepasst:

    C#-Quellcode

    1. ​ Vertices[0] = new VertexPositionTexture(new Vector3(0, 0, 0), new Vector2(0, 1));
    2. Vertices[1] = new VertexPositionTexture(new Vector3(0, 1, 0), new Vector2(0, 0));
    3. Vertices[2] = new VertexPositionTexture(new Vector3(1, 1, 0), new Vector2(1, 0));
    4. Vertices[3] = new VertexPositionTexture(new Vector3(1, 0, 0), new Vector2(1, 1));
    5. Vertices[4] = new VertexPositionTexture(new Vector3(0, 0, -1), new Vector2(0, 1));
    6. Vertices[5] = new VertexPositionTexture(new Vector3(0, 1, -1), new Vector2(0, 0));
    7. Vertices[6] = new VertexPositionTexture(new Vector3(1, 1, -1), new Vector2(1, 0));
    8. Vertices[7] = new VertexPositionTexture(new Vector3(1, 0, -1), new Vector2(1, 1));
    ; und zwar so, wie nicht-indizierten Würfel.

    Vektor mit den Koordinaten (1,1,0) ist (0,1) (Bildschirmkoordinaten).

    Das Ergebnis:

    @jvbsl Ich verweise mal auf dich :whistling:
    Woran liegt es nur?

    Liebe Grüße.
    Bilder
    • Screenshot (338).png

      594,4 kB, 1.920×1.080, 141 mal angesehen
    Und Gott alleine weiß alles am allerbesten und besser.
    @jvbsl
    Und deshalb ja auch meine Frage, kann ich bei indizierten Würfeln die Texture-Koordinaten setzen?
    Denn ein Polygon wird ja nicht nur exemplarisch für Front sondern auch für Back , Left, et cetera gebraucht.

    Ah, ich verstehe, ich benötige mit Indices nur 8 Vertices.
    Und deren Texture-Koordinaten müssen dann nicht-nicht-indiziert gesetzt werden.
    Und wie sähe das aus?
    Und Gott alleine weiß alles am allerbesten und besser.
    Nunja eigt. reicht ja ein Punkt, weil du ja weißt, dass es ein Würfel ist und die Koordinaten kannst dann direkt auf der GPU erstellen, aber das wäre dann mit GeometryShader, was du mit MonoGame gar nicht machen kannst.
    Also musst du das CPU based machen und brauchst pro Seite die vollen 4 Koordinaten(mit Trickserei könnte man auch im VertexShader ein paar Informationen erzeugen)
    d.h. ein Kompletter Würfel besteht aus 6*4 Vertices, aber das einfachste ist gar nicht mehr in Würfeln zu denken, sondern in Flächen und erzeugen tust du nur noch die Oberflächen. Indizieren kannst du jeweils auch nur die einzelnen Seiten, sodass du pro Seite nicht 6 Vertices brauchst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---