Newsgroup: it.comp.programmare.win32
Titolo: Gestione Tempo in Windows98

Salve a tutti,
sto lavorando alla scrittura di un semplice gioco, cosa che mi ha introdotto
a creare thread di temporizzazione (per il movimento di missili ad esempio).
Lavoro sotto win2000 e non ho nessunissimo problema...il programma gira bene
ed č ben temporizzato tutto il mondo virtuale.
Ho provato a portare il prog. su Windows98 e ho notato che č piů lento e
scattoso (non c'č nessun tipo di grafica con DirectX o
Direct3D...semplicemente disegno nelle finestre oggetti 2D come quadrati,
cerchi, ecc...niente di speciale).
I missili soprattutto. Il loro movimento non č stabile, ma varia ed č
decisamente piů veloce di quello che ho sotto win2000.
Nelle mie funzioni thread ho utilizzato, per la temporizzazione,
GetTickCount():
// ............
Timer0 = Timer1 = GetTickCount();
while (Active)
{  Timer1 = GetTickCount();
    if (Timer1-Timer0 > TEMPO)
   { ...
      ...
      Timer0 = Timer1;
   }
   ....
   ....
   Sleep(2);
}
// ............
Questa č la struttura di tutti i miei thread.
Secondo voi da cosa potrebbero dipendere quei problemi di temporizzazione?
Grazie a tutti
Giovanni.

 Secondo voi da cosa potrebbero dipendere quei problemi di temporizzazione?
La vecchi GDI di win98 è necessariamente più lenta di quella nuova perché
funziona in user-mode; quella di NT invece va direttamente in kernel mode;
il tuo rallentamento dipende in primis da questo fatto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


mmm...più lenta? I missili sotto Win98 vanno più veloci...e in modo
irregolare...
secondo te cosa posso fare?
Grazie
Giovanni.

 secondo te cosa posso fare?
Non so se hai già fatto così, ma io farei nel seguente modo: organizzerei
il mio programma in soli due threads; uno è il thread primario, che riceve
gli input dell'utente e reagisce di conseguenza modificando i dati in
memoria, come ad esempio le coordinate dei personaggi, o che so io.
L'altro thread invece entra in un loop: all'inizio di ogni iterazione
aspetta due eventi, uno che scatta quando il programma deve terminare, e
l'altro che viene fatto scattare ogni volta che bisogna ridisegnare lo
schermo; quando scatta il primo ovviamente il thread termina, e quando
scatta il secondo, il thread disegna un frame e lo mette sullo schermo.
In questo modo il lavoro di ricezione dell'input è separato dal lavoro di
elaborazione dell'immagine e i due lavori possono essere svolti
"contemporaneamente", ma è un sistema che ritengo buono solo per
videogiochi che debbano disegnare frame abbastanza laboriosi; te lo
consiglio in caso il tuo programma dovesse diventare uno di quelli.
Una volta attuato questo sistema, per quanto riguarda i movimenti
temporizzati (come ad esempio il movimento dei missili) io creerei un
timer in una finestra del thread primario con la funzione SetTimer, e ad
ogni scatto del timer farei scattare l'evento che dice al secondo thread
di ridisegnare il frame.
A questo punto, dal momento che l'elaborazione dell'immagine viene
effettuata da un thread a parte, non dovrebbero accumularsi ritardi nel
thread primario, che può continuare a riceve in modo fluido gli input
dell'utente e gli scatti del timer.
Spero di esserti stato chiaro, :)
ciao
