|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Provincia di Lecco
Messaggi: 321
|
[C#]Come valutare il n° di fotogrammi al secondo di una scena DirectX fatta da me?
Ciao a tutti!
Sto facendo la mia tesina di maturità, che invece di essere un gioco (come pensavo qui) è una specie di dimostrazione delle DirectX. Ora, ho già trovato un modo per visualizzare il numero di fotogrammi al secondo della mia scena. Ho messo un valore int come attributo della form in cui è presente la scena DirectX e lo vado ad incrementare ogni qual volta traccio qualcosa con il metodo Paint della form. Inoltre ho fatto partire un thread che cicla all'infinito in questo modo per valutare quando è passato un secondo: Codice:
private void tempoFps(Object start) //metodo per il thread che visualizza il numero di frame per secondo
{
DateTime timeStart = (DateTime)start; //leggo il tempo passato, che è l'ora attuale
while (true)
{
TimeSpan calcolo = DateTime.Now - timeStart;//faccio la differenza tra il tempo attuale e quello iniziale
if ((calcolo.Seconds) >= 1) //se è passato almeno un secondo
{
scelta.fps(fps); //chiamo il metodo della finestra di menu per visualizzare il valore del numero di fps
fps = 0; // è la variabile che tiene conto degli fps
timeStart = DateTime.Now; //riazzero il tempo iniziale
}
}
}
L'unico problema è che questo thread, essendo un ciclo infinito, occupa molto tempo cpu (ho un dual core quindi ne occupa la metà), e considerando che prima il mio programma non occupava praticamente nulla di CPU, vorrei ottimizzarlo un po'. Ho provato ad aprire fraps e lui se la viaggia che è un piacere... Come faccio ad ottimizzare il tutto??
__________________
CONFIGURAZIONE PC FISSOAlimentatore:Levicom X-Alien 450W.CPU:Intel Core 2 Duo E6600 @2975MHz per ora...VGA:Sapphire x1950 xt 256 mb @634/945 MOBO:P5N-E SLI RAM:2Gb Corsair XMS2 6400 cas4||BENCHMARK PC FISSO 3dMark05:12810 3dMark06:6546||Internet:Fastweb 6mbit/s||PORTATILEAcer Aspire 5920G.CPU:Intel Core 2 Duo T5550.VGA:nVidia 8600M GT 512mb.RAM:3 gb.HDD:160gb |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Hai diversi modi per farlo. Io ti consiglio di separare il rendering un thread, oppure metterlo in risposta all'evento Idle della Form.
All'inizio del render frame prendi il tempo corrente e lo sottrai al tempo preso al frame precedente. Cosi' calcoli il frame_time e da li' il frame rate. Meglio ancora prendere il tempo ogni X frame. E' pulito e funziona. Ora, se metti un ciclo (come il render loop) in un altro thread e non vuoi fargli mangiare tutta la CPU, sbatti un bel Sleep(1) o Sleep(0). Nel primo caso rilasci la CPU per un millisecondo e il thread va in pausa, mentre nel secondo caso rilasci il resto del timeslice allocato per quel thread al sistema, il thread non va in pausa ma viene rimesso in coda pronto per un'altra allocazione al prossimo round robin. Ma puo' avere alcuni problemi in alcuni casi contorti. Usa Sleep(1) e funziona una meraviglia. Note stilistiche: - scrivi variabili e metodi in inglese - NON COMMENTARE IL CODICE RIGA PER RIGA O VENGO A CASA TUA E TI SPEZZO LE GINOCCHIA No, non lo faccio, ma non commentare il codice riga per riga che gesu' bambino piange
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Provincia di Lecco
Messaggi: 321
|
Errore LoaderLock
Ok, ho messo l'istruzione Thread.Sleep(1) ed ora l'utilizzo cpu è tornato normale
Avrei un'altra cosa da chiederti, una curiosità: hai nominato l'evento idle della form. Quando viene generato? Quando l'applicazione arriva alla fine del metodo Paint? Vado un po' OT per chiederti un'altra cosa [OT] Quando da Visual studio faccio partire il programma, ogni tanto mi compare questo errore: Tentativo di esecuzione gestita da parte della DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX.DirectInput\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.DirectInput.dll' all'interno del blocco OS Loader. Non provare a eseguire codice gestito all'interno di una DllMain o di una funzione di inizializzazione delle immagini. Questa operazione può causare il blocco dell'applicazione. In presenza di questa istruzione: Codice:
inizializzaTastiera(handle); Codice:
public void inizializzaTastiera(IntPtr handle)
{
keyb = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard); //alloco la tastiera di default alla mia variabile "keyb"
keyb.SetCooperativeLevel(handle, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
keyb.Acquire();
}
Finora a fare partire l'eseguibile da Windows non è successo nulla di strano, ma magari è perché la maggior parte delle volte lo faccio da Visual Studio... [/OT]
__________________
CONFIGURAZIONE PC FISSOAlimentatore:Levicom X-Alien 450W.CPU:Intel Core 2 Duo E6600 @2975MHz per ora...VGA:Sapphire x1950 xt 256 mb @634/945 MOBO:P5N-E SLI RAM:2Gb Corsair XMS2 6400 cas4||BENCHMARK PC FISSO 3dMark05:12810 3dMark06:6546||Internet:Fastweb 6mbit/s||PORTATILEAcer Aspire 5920G.CPU:Intel Core 2 Duo T5550.VGA:nVidia 8600M GT 512mb.RAM:3 gb.HDD:160gb Ultima modifica di Radeon89 : 05-04-2008 alle 16:03. |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]() che stai diventando anche tu un evangelista fran?
__________________
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ma è per una Giusta Causa (tm).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Provincia di Lecco
Messaggi: 321
|
Comunque quel problema è fastidiosissimo, me lo dà quasi sempre da quando ho fatto le ultime modifiche per il conteggio dei fotogrammi al secondo... E non capisco per quale motivo... Inoltre ha reso Visual Studio instabile, nel senso che spesso si blocca sul mio pc quando faccio partire il programma dall'IDE, e poi continua dice di essere in attesa di un evento che tarda ad essere generato...
__________________
CONFIGURAZIONE PC FISSOAlimentatore:Levicom X-Alien 450W.CPU:Intel Core 2 Duo E6600 @2975MHz per ora...VGA:Sapphire x1950 xt 256 mb @634/945 MOBO:P5N-E SLI RAM:2Gb Corsair XMS2 6400 cas4||BENCHMARK PC FISSO 3dMark05:12810 3dMark06:6546||Internet:Fastweb 6mbit/s||PORTATILEAcer Aspire 5920G.CPU:Intel Core 2 Duo T5550.VGA:nVidia 8600M GT 512mb.RAM:3 gb.HDD:160gb |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Oct 2001
Città: Trento
Messaggi: 164
|
Ciao,
vi vedo abbastanza efferati in materia quindi vi chiedo gentilmente una dritta. Devo imparare a programmare in C# sfruttando le funzionalità e le classi del .NET Framework e volevo sapere quale versione di Visual Studio e quale versione di .NET Framework installare su un computer con SO WinXP. Grazie. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
__________________
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Provincia di Lecco
Messaggi: 321
|
Quote:
Comunque in merito al mio problema nessuno sa dirmi niente? Lo fa spesso... E' un errore di LoaderLock
__________________
CONFIGURAZIONE PC FISSOAlimentatore:Levicom X-Alien 450W.CPU:Intel Core 2 Duo E6600 @2975MHz per ora...VGA:Sapphire x1950 xt 256 mb @634/945 MOBO:P5N-E SLI RAM:2Gb Corsair XMS2 6400 cas4||BENCHMARK PC FISSO 3dMark05:12810 3dMark06:6546||Internet:Fastweb 6mbit/s||PORTATILEAcer Aspire 5920G.CPU:Intel Core 2 Duo T5550.VGA:nVidia 8600M GT 512mb.RAM:3 gb.HDD:160gb |
|
|
|
|
|
|
#11 | |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Quote:
Ciao |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Provincia di Lecco
Messaggi: 321
|
No, purtroppo lo fa ancora... Anzi, devo dire che è peggiorata la situazione togliendo il segno di spunta da quella casella. Almeno prima quando lo fa basta farlo ripartire, ora devo provare 3 volte di seguito per riuscire a farlo andare!
Altri suggerimenti???
__________________
CONFIGURAZIONE PC FISSOAlimentatore:Levicom X-Alien 450W.CPU:Intel Core 2 Duo E6600 @2975MHz per ora...VGA:Sapphire x1950 xt 256 mb @634/945 MOBO:P5N-E SLI RAM:2Gb Corsair XMS2 6400 cas4||BENCHMARK PC FISSO 3dMark05:12810 3dMark06:6546||Internet:Fastweb 6mbit/s||PORTATILEAcer Aspire 5920G.CPU:Intel Core 2 Duo T5550.VGA:nVidia 8600M GT 512mb.RAM:3 gb.HDD:160gb |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:44.




















