Newsgroup: it.comp.programmare.win32
Titolo: Problema velocità

Ho fatto un piccolo giochino, avete presente quelli che "appare un'immagine
in una parte della finestra e prima che scompaia ci devi cliccare sopra, un
acchiappa immagine...". Ecco, ne ho fatto uno come mio primo programma e
tutto funziona bene a parte una cosa: dopo un po' il puntatore del mouse
comincia a muoversi + lentamente e anche la risposta al click comincia a
tardare... ovviamente non posso scrivere tutto il codice del programma
quindi cerco di dire le cose + importanti (a mio modesto avviso) che ho
messo.
Innanzitutto, una cosa che non ho mai capito bene, ho messo tutte le
variabili che mi servono nella windproc proprio all'inizio, prima dello
switch.... e le ho definite come static (static int nvar); poi in WM_CREATE
le inizializzo. Poi, quando inizia la partita, ho messo un SetTimer e ho
gestito WM_TIMER. Beh, non so cosa possiate capire da questo, ma magari vi
era successo anche a voi all'inizio e sapete dove può essere il problema...
grazie e BUONE FESTE!

 
Direi che la procedura e' piu' o meno corretta. Il timer standard puo' 
andare bene per un gioco in cui le prestazioni non sono troppo 
stringenti (magari anziche' usare il WM_TIMER usa la procedura che 
cosi' scavalchi la coda dei messaggi, vedi l'help della SetTimer per 
ulteriori info). Cosi' a "naso" direi che il rallentamento e' dovuto al 
fatto che allochi della memoria e non la liberi, molto probabilemnte 
sono degli oggetti grafici. Per verificarlo puoi lanciare il tuo 
programma sotto Win2000 con il Task Manager attivo e vedere se 
effettivamente l'utilizzo della memoria scresce col passare del tempo
Luca

 programma sotto Win2000 con il Task Manager attivo
Purtroppo ho win98, avevo già provato con il misura risorse ma non è molto
preciso.... cerco qualche utili simile online (tu ne conosci qualcuna
buona?). Cmq, appena porto il cursore fuori dalla mia finestra si muove
normalmente, la lentezza si verifica solo passandoci sopra.... cmq grazie,
ti farò sapere...

 ulteriori info).
Per doivere di precisione aggiungo una cosa che magari vi può interessare.
Non c'è una reale differenza di prestazioni tra intercettare WM_TIMER o
gestire la TimerProc perché entrambe passano per la coda dei messaggi.
In entrambi i tipi di gestione vienne piazzato un messaggio WM_TIMER nella
coda dei messaggi del thread, infatti (preso da MSDN):
If you specify a TimerProc callback function, the default window procedure
calls the callback function when it processes WM_TIMER.
Therefore, you need to dispatch messages in the calling thread, even when
you use TimerProc instead of processing WM_TIMER.
Porlock.


Porlock, hai perfettamente ragione. Non so come mai ma sono sempre stato
convinto di quello che ho detto nel post. Per fortuna per gli usi che faccio
io i timer standard non vanno bene e non li uso mai :)
Luca

 
Porlock, per caso mi e' capitato di guardare la descrizione della 
DispatchMessage nella documentazione del PSDK Agosto 2001 (a casa non ho 
versioni piu' recenti) e qui il caso del WM_TIMER e' descritto in 
maniera leggermente diversa da quando detto nella descrizione del 
messaggio stesso che hai riportato tu.
Remarks
The MSG structure must contain valid message values. If the lpmsg 
parameter points to a WM_TIMER message and the lParam parameter of the 
WM_TIMER message is not NULL, lParam points to a function that is called 
instead of the window procedure. 
Qui dice che se e' specificata una funzione questa viene chiamata al 
posto della window procedure, quindi il messaggio non arrivera' mai alla 
default window procedure. Boh...
Luca