ogni Windows applicazione ha al suo interno un ciclo che sembra qualcosa di simile:
BOOL bRet;
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
È compito dell'applicazione - non del sistema operativo - per garantire che i messaggi vengono inviati.
Come probabilmente sapete, i giochi primi di Windows utilizzato un metodo alternativo in cui, invece di chiamare la GetMessage
funzione di bloccaggio, che avrebbero chiamato PeekMessage
, e quindi chiamare ciclo di elaborazione principale del gioco se non ci fosse alcun messaggio da gestire. Sono state utilizzate varie forme di ritardi per cercare di ottenere un frame rate adeguato senza utilizzare il 100% di CPU. Semplicemente non c'era un timer abbastanza buono per ottenere una frequenza fotogrammi uniforme.
Oggi, potrebbe non essere necessario scrivere esplicitamente un ciclo che chiama DoEvents
. È possibile che sia ora possibile ottenere una frequenza di fotogrammi uniforme utilizzando i timer di pool di timer incorporati (esposti in .NET da System.Threading.Timer
e spostati da System.Timers.Timer
).
Come ricordo, c'erano anche problemi con ottenere eventi mouse e tastiera in modo tempestivo. Abbiamo utilizzato l'accesso diretto alla tastiera e al mouse piuttosto che a seconda del ciclo dei messaggi, perché il ciclo dei messaggi era spesso troppo lento e talvolta ci causava la perdita di informazioni.
Non ho scritto giochi in un numero di anni, e non so come sia .NET come piattaforma di giochi. È possibile che l'input sia ancora un problema - che la coda dei messaggi semplicemente non sia abbastanza veloce da fornire la risposta fulminea che gli sviluppatori di giochi vogliono. Quindi ignorano la coda dei messaggi per le attività critiche.
fonte
2009-03-25 12:23:34
Sì, ti manca l'importante distinzione che un gioco non è un servizio OS. – Hejazzman