2010-10-10 13 views
5

Possiedo un Delphi TFrame nativo che emula il visualizzatore Cumulus Tag Cloud di Roy Tanck, un plug-in per WordPress Flash. Ciò che fa questo plug-in è creare una sfera di parole 3D che gira sulla superficie di una sfera "virtuale". Potete vederlo in azione qui:Delphi 6: Delphi nativo può eseguire una grafica liscia come Flash?

http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/

Nella mia struttura dell'applicazione ogni parola ha il suo TBitmap e di rendere la sfera si stampa tutte le bitmap della parola ad un TBitmap temporanea e poi BitBlt() che TBitmap temporanea sulla tela di un TPaintBox visibile. L'operazione di rendering si verifica su un evento del timer TTimer che si verifica ogni 50 millisecondi.

Tuttavia, non importa quanto io provi ci sia un notevole "jitter" al movimento delle parole, specialmente in confronto al movimento morbido e setoso del lettore Flash. Ho pensato che l'aumento della frequenza dei fotogrammi potrebbe essere d'aiuto e ho persino provato a utilizzare un timer multimediale aggiornato ogni 10 millisecondi con il blocco e lo sblocco appropriati di tutte le tele a causa della natura multithread del timer MM. Ancora nervoso. L'unica cosa che posso capire è che i calcoli che faccio risultano in posizioni di pixel discrete per ogni parola da rendere e che causa jitter. Al contrario, e questa è supposizione, forse Flash potenzialmente fa il dithering per facilitare il rendering "tra pixel" o forse fa l'anti-aliasing in tempo reale ed è per questo che non fa jitter?

In ogni caso, è possibile ottenere il movimento fluido come la seta che sto cercando utilizzando il codice Delphi nativo? O l'unico modo per farlo è arrivare fino a qualcosa come una soluzione Direct3D o OpenGL? Non voglio perdere tempo a mettere a punto questa cosa a morte se si tratta di una battaglia persa. D'altra parte, se hai qualche consiglio mi piacerebbe ascoltarli. La mia ipotesi è che se devo seguire la rotta Direct3D/OpenGL è un grosso lavoro e una curva di apprendimento, quindi se potessi trovare un modo per farlo nel codice nativo di Delphi mi piacerebbe molto.

FOLLOW-UP EDIT: Sarebbe stampa su una molto più grande bitmap "virtuale" e poi, utilizzando un metodo di ricampionamento come quella data qui di aiuto per la stampa "giù" per l'attuale Canvas visibile ?:

Scale an image nicely in Delphi?

+0

Avete in DoubleBuffering, AllPaintingInWmPaint, SupportsTransparentBackColor e UserPaint? L'utilizzo di questi quando si esegue il rendering GDI su un modulo impedirà lo sfarfallio. – Nowayz

+0

Nowayz. Non ho lo sfarfallio. Il jitter è posizionale, non dovuto a ridisegni. –

+0

La risposta è sicuramente si. Ma se vuoi una grafica 3D davvero liscia, la CPU non è abbastanza veloce. Devi usare la GPU, usando OpenGL. –

risposta

2

Ho scritto un numero di giochi in Delphi. È certamente fattibile. Ci sono un certo numero di cose da guardare.

Non solo è necessario attivare un evento regolarmente, ma anche controllare l'ora in cui arriva e spostarsi in base al tempo di interrogazione anziché assumere il tempo in base al periodo di attesa previsto.

Se è necessaria la precisione subpixel senza dipendenza GPU, consiglierei Antigrain Geometry o il cugino Pascal AGGPAS per Delphi.

L'animazione dei caratteri può avere un ulteriore problema nel rendering dei caratteri che spesso contiene la logica per garantire che i tratti sottili vengano visualizzati sui bordi dei pixel. Lo spostamento del testo visualizzato in quel modo può cambiare l'aspetto poiché i tratti diversi possono saltare dall'allineamento con un pixel al successivo.

Se il font è reso per essere allineato in pixel, sarebbe forse meglio se il rendering fosse quantizzato in numeri interi. Rimarrà comunque allineato ai pixel ma spostando un pixel alla volta dovrebbe farlo ogni volta in modo coerente.

+0

credo che un carattere GDI con 'ANTIALIASED_QUALITY' (http://msdn.microsoft.com/en-us/library/dd183499 (v = vs.85) .aspx) non sia" grigliato ", evitando il * problema "caratteri rimbalzanti" *. –

1

IMHO la strada giusta da fare è Direct3D (o OpenGL, ma dato che Delphi è solo Windows forse Direct3D è migliore). È stato introdotto esattamente perché il GDI non è adatto a tali compiti. Flash supporta sia grafica vettoriale che grafica raster e quindi è in grado di gestire questo tipo di applicazioni meglio del vecchio semplice GDI.

+1

Scrivere un'applicazione OpenGL Delphi è molto semplice, perché esiste un'unità OpenGL.pas. Scrivere un'applicazione DirectX Delphi non è così facile. –

+0

La mia esperienza con Direct3D è che quando funziona è bello, ma quando si ha un problema, soprattutto a causa di un problema di codec da qualche parte nella catena di filtri, la vita può diventare molto dolorosa molto rapidamente. Ecco perché sto lavorando così duramente per evitarlo. Non mi sono ancora stancato di OpenGL e sicuramente lo voglio. –

+0

Intendevo solo dire che essendo DirectX la piattaforma grafica avanzata nativa di Windows ha un supporto migliore. MS ha mostrato che "non mi piace" OpenGL che molto –