fix(client): copertura del terreno consapevole della quota, ricostruita in background #274
No reviewers
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo!274
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/terrain-window-coverage"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Il terreno passa al 3D vero, e questa tornata chiude i due problemi emersi camminando sull'asterra: "ad esempio qui dovrebbe esserci della lava" — un lago di lava autorizzato che a schermo era nero — e "è qualcosa nel mesh perché camminando in pendenza lo sfondo cambia di continuo a seconda di dove ci si muove, anche se magari è monobioma come la pendice del vulcano".
Erano due sintomi di una causa sola, in due punti distinti.
Primo: la camera segue il giocatore alla sua posizione disegnata, che contiene già il sollevamento
-z*ZScale. I due punti che riconvertivano quella posizione in celle di mappa usavano l'inverso piatto, quindi nominavano le celle a quota 0 che finiscono sugli stessi pixel — 86 celle di distanza az 237. La finestra dei biomi veniva costruita attorno a un'altra zona della mappa: la lava non veniva mai campionata, e siccome l'errore è proporzionale az, ogni passo in salita lo spostava.Secondo: la mesh veniva disegnata su un rettangolo più largo di quello per cui esistevano dati di bioma e rilievo. Nel mezzo i sampler bloccavano al bordo — niente texture, ombreggiatura piatta — e quel bordo si spostava a ogni ricostruzione della finestra. Da qui
TerrainWindow, che diventa l'unica autorità su quali celle vanno coperte: mesh e dati derivano da lì e non possono più divergere.I margini di quota sono asimmetrici perché è la forma giusta, non un'ottimizzazione: con
screenY = (x+y)*TileHeight/2 - z*ZScale, il terreno entra in vista da+x+ysolo se sta sopra il piano della camera, e da-x-ysolo se sta sotto.Coprire tutto il disegnato costava però 300-500 ms di ricostruzione sul thread di render. Quel lavoro passa a un worker cancellabile con un loader generation-safe; il thread di render fa solo lo scambio delle texture. La misura chiave: adottare una finestra costa ora 1 ms.
Infine le statiche, cullate con padding dimensionato solo sullo sprite e senza termine di quota: dal fondovalle il vulcano risultava correttamente texturizzato e completamente calvo.
Screenshots / recording
Rotta cratere-valle, database fresco, cinque punti diagnostici. Nessuna fascia grigia e nessun bordo diagonale mobile in nessuno dei cinque.
Comandi (
docs/debug-harness.md), con il database azzerato prima dijust dev:How it was tested
IsoMmo.Client.Core.Tests292.TerrainWindowOracleTests) decide la visibilità di una cella dall'equazione di proiezione, senza chiamare le funzioni sotto test: senza di lui un errore di segno nel margine renderebbe sbagliati insiemeDrawnBoundseRequired, e ogni test di contenimento passerebbe comunque. È il test che ha trovato il buco del mezzo-rombo.p99 <= 2x mediana: 28,3 <= 33,5. Build bloccanti durante il cammino: 0. snapshot 13-14 ms · build 400-529 ms · upload 1 ms.Limiti noti, dichiarati
Checklist
just lintpassa (CSharpier + analyzer, zero warning)just testè verdeTask/CancellationTokeneTexture2D.SetData, nulla di specifico per OSNota sulla storia. Sostituisce #273, che era irrimediabilmente in conflitto: #272 aveva titolo
docs(design)ma ha schiacciato inmainanche tutto il codice 3D (IsoCamera,TerrainMesh3D, lo shader e il suo.xnb,GridRenderer,GroundBlendRenderer,WorldRenderer,Mobile), quindi il ramodesign/3d-terrainne portava una seconda copia con storia diversa. Qui restano solo i 17 commit chemainnon ha: la correzione della camera (FlatFocus/FocusZ, che #272 non conteneva), la spec, il piano e i 13 del lavoro. Replicati sumainsenza un solo conflitto; 1041 test verdi, 0 avvisi, csharpier pulito.