Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

C#, 60fps e redrawing dello screen con DirectX

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!!

Print | posted on venerdì 27 maggio 2005 16:23 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET