Hi Leute,
ich bin immernoch dabei meinen Minecraft-Client zu schreiben. Funzt bis jetzt auch ziemlich gut bis auf die Tatsache dass der Chunk-Loader trotz Optimierungen ziemlich lahm ist. Ich Arbeite mit GL.NewList(), GL.GenList() und GL.CallList(). Jedes mal, wenn ein Chunk hinzugefügt wird, wird er auf die sections aufgeteilt und dann dem SectionRenderer übergeben. Wenn der SectionRenderer feststellt, dass die Displaylist noch nicht existiert, legt er sie neu an, und das dauert. Ich habe mir überlegt das Multithreaded zu machen, ungefähr so:
So jetzt läuft alles Lag-Frei, konstant 190-200fps (das Maximum was ich eingestellt habe), aber er rendert nix mehr außer der Skybox.
Was mach ich hier falsch? Geht das nicht bei GL, dass man das Multithreaded oder ist irgendwo anders mein Code Faul?
Hoffe ihr könnt mir helfen
LG
Twometer
ich bin immernoch dabei meinen Minecraft-Client zu schreiben. Funzt bis jetzt auch ziemlich gut bis auf die Tatsache dass der Chunk-Loader trotz Optimierungen ziemlich lahm ist. Ich Arbeite mit GL.NewList(), GL.GenList() und GL.CallList(). Jedes mal, wenn ein Chunk hinzugefügt wird, wird er auf die sections aufgeteilt und dann dem SectionRenderer übergeben. Wenn der SectionRenderer feststellt, dass die Displaylist noch nicht existiert, legt er sie neu an, und das dauert. Ich habe mir überlegt das Multithreaded zu machen, ungefähr so:
VB.NET-Quellcode
- Public Sub RenderSection(ByRef section As Section)
- If Not processor.IsAlive Then 'Processor ist der Thread Public processor As New Thread(AddressOf ChunkProcessor) With {.IsBackground = True}
- processor.Start()
- End If
- If section.needsRebuild Then
- section.needsRebuild = False
- queue.Enqueue(section)
- End If
- If section.list <> -1 Then
- GL.CallList(section.list)
- End If
- End Sub
- Public Sub ChunkProcessor()
- While True
- SyncLock synclockx
- Dim sec As Section
- If queue.TryDequeue(sec) And sec IsNot Nothing Then
- RebuildSection(sec)
- End If
- End SyncLock
- End While
- End Sub
- Public Sub RebuildSection(ByRef section As Section)
- section.needsRebuild = False
- section.list = GL.GenLists(2)
- GL.NewList(section.list, ListMode.Compile)
- TheGame.textureManager.BindAtlas()
- t.Init()
- chunk = section.Chunk
- For x As Integer = 0 To 15
- For y As Integer = 0 To 15
- For z As Integer = 0 To 15
- absoluteX = chunk.worldX + x
- absoluteY = section.yIndex * 16 + y
- absoluteZ = chunk.worldZ + z
- tile = GetBlock(x, y, absoluteY, z, section)
- If tile <> 0 Then
- yPos = Not IsTile(x, y + 1, absoluteY + 1, z, section)
- yNeg = Not IsTile(x, y - 1, absoluteY - 1, z, section)
- zNeg = Not IsTile(x, y, absoluteY, z - 1, section)
- zPos = Not IsTile(x, y, absoluteY, z + 1, section)
- xNeg = Not IsTile(x - 1, y, absoluteY, z, section)
- xPos = Not IsTile(x + 1, y, absoluteY, z, section)
- t.RenderCube(tile, absoluteX, absoluteY, absoluteZ, yPos, yNeg, xNeg, xPos, zNeg, zPos)
- End If
- Next
- Next
- Next
- t.Flush()
- GL.EndList()
- End Sub
So jetzt läuft alles Lag-Frei, konstant 190-200fps (das Maximum was ich eingestellt habe), aber er rendert nix mehr außer der Skybox.
Was mach ich hier falsch? Geht das nicht bei GL, dass man das Multithreaded oder ist irgendwo anders mein Code Faul?
Hoffe ihr könnt mir helfen
![:D](https://www.vb-paradise.de/wcf/images/smilies/biggrin.png)
LG
Twometer
An Error 404 occurred while loading signature...