Leggendo per bene il codice delle routine di StarTrooper (specialmente il Render di ciascun sprite) mi sono accorto di una cosa interessante: ogni volta la scena viene ridisegnata da zero. Stavo cercando di scrivere qualche linea di codice usando DirectInput e facendo spostare una label sul form.
In pratica, ho scritto un loop in cui:
1) leggo lo stato della tastiera e gestisco eventuali tasti premuti (tastierino numerico)
2) misurando il tempo trascorso, mantengo 60fps
3) ricomincio daccapo
La gestione dei tasti è fatta attraverso una Sub ManageKBD(). Controllo le frecce direzionali (LEFT, RIGHT, UP, DOWN) del tastierino numerico. Ad esempio:
If aKeys(DIK_NUMPAD4) = True Then Me.etcLabel.Left -= DELTA
etcLabel è una label che ho sul form, DELTA è una costante che dice di quanto spostare la label sullo schermo. E fin qua tutto bene, il codice gira. Però poi ho pensato che con DX non avrò più label, ovviamente, sarà tutto grafica pura e semplice. Effettivamente StarTrooper usa oggetti Sprite (proprietà: picture, x, y, rotation, active, visible, etc.) che non hanno alcuna corrispondenza con gli elementi delle Windows Forms. Vado a vedere il codice. Apro Game.cs e vedo il metodo Render(): ad ogni loop, viene chiamato il BeginScene(), l'elenco degli sprite viene ordinato in base al loro ZOrder ed infine viene chiamato il metodo Render per ciascun Sprite/Text2D che deve comparire sullo schermo. Fatto questo, viene chiamato EndScene() e poi Present(). Quindi ogni volta l'intera schermata viene ridisegnata e preparata in memoria, per essere visualizzata di colpo sullo schermo. L'utente nemmeno se ne accorge.
Il metodo Render dello sprite di conseguenza non sposta un'immagine già esistente (come faccio adesso io con la mia amica label), ma la ridisegna ogni volta da zero direttamente nella nuova posizione.
Mi chiedo se anche Windows internamente è strutturato in modo simile, oppure una finestra viene ridisegnata solo quando necessario (messaggi da e verso l'OS), non servirebbe nulla cercare di mantenere gli fps costanti, giusto?
P.S. : non uso IMHO per postare, perchè poi con ThunderBird i post del blog non li vedo come vorrei. Vedo il testo del post puro e semplice, ma senza l'impaginazione corretta che vedo se posto on-line. Mah!!