Domanda

Ho un'applicazione Windows CE che utilizza molta grafica vettoriale e in alcuni casi è piuttosto lenta. Attualmente sto usando GDI per il rendering tramite bitmap per aggiornamenti gratuiti con sfarfallio. In genere, mi sto aprendo una finestra su una grande mappa 3d. Su alcuni dispositivi (ad esempio 166 mhz SH4), questo rallenta con 3-5 secondi di aggiornamento per grandi set di dati. La mia domanda è questa;

  • Qualcuno ha fatto paragoni sulla velocità relativa delle operazioni grafiche su Windows mobile rispetto a Win32. Detto in altro modo, vengono profilati i risultati da una versione Win32 del software applicabile a una versione WinCE, supponendo che stiamo cercando solo chiamate GDI.

  • Qualcuno ha provato a profilare a bordo su una piattaforma WinCE (app C ++), se sì, usando quali strumenti.

  • Qualcuno è a conoscenza di metodi per migliorare la velocità di disegno su Windows CE. Al momento sto esaminando FastGraph dopo il feedback di una domanda precedente , ma questa è una soluzione leggermente più a lungo termine. Male e così com'è, sto cercando qualcosa di più veloce da implementare per una prossima uscita.

È stato utile?

Soluzione

Prima di Windows CE 6.0 - includendo quindi tutte le versioni di Windows Mobile / Windows Embedded Handheld - il codice grafico era implementato in un altro processo (GWES.EXE), che richiedeva una chiamata tra processi ogni volta che si effettua una chiamata GDI. Le chiamate cross-process CE 5.x sono molto più economiche rispetto al desktop, ma comunque più costose di una semplice chiamata di funzione o di una chiamata in modalità kernel.

Sul desktop, GDI è implementato in modalità kernel da NT 4.0. Nell'originale NT 3.1, era come il modello CE, chiamate tra processi. Per mitigare il sovraccarico di chiamate tra processi o switch della modalità utente / kernel, GDI desktop esegue il batch delle operazioni sul lato modalità utente fino a quando non si esegue un'operazione che richiede di svuotare la coda, come selezionare una penna o un pennello diverso o utilizzarne uno delle funzioni legacy che restituiscono qualcosa di diverso da BOOL - o il buffer è pieno, oppure lo svuoti esplicitamente chiamando GdiFlush .

Windows CE non dispone di questa funzionalità di batch: tutte le chiamate provocano una chiamata diretta al processo GWES, rendendolo molto più lento. Puoi mitigarlo facendo il maggior lavoro possibile in ogni chiamata. Se è necessaria una linea complessa, prendere in considerazione la polilinea anziché le singole chiamate MoveToEx / LineTo. Prova a toccare ogni pixel solo una volta anziché eseguire il rendering di oggetti sovrapposti e utilizza l'area non valida per dipingere solo parti dello schermo che devono essere ridipinte (usa GetUpdateRgn o GetUpdateRect ma fallo prima di chiamare BeginPaint , che contrassegna la regione come valida).

Il modello di accelerazione grafica CE è abbastanza semplice, essendo basato su bit-blits. Non supporta il set più ampio di funzionalità supportato dai driver di dispositivo desktop modello Windows 2000. La disponibilità di eventuali accelerazioni dipende dal fatto che l'hardware abbia anche un chip acceleratore: molti dispositivi utilizzeranno il controller LCD incorporato nel processore dell'applicazione, che di solito non esegue alcuna accelerazione.

È possibile simulare il comportamento di CE sul desktop disabilitando il batch, utilizzando GdiSetBatchLimit per impostare il limite su 1. Considerare inoltre di utilizzare il driver grafico SVGA per disabilitare l'accelerazione. Su Windows Vista o Windows 7, GDI non è accelerato se si utilizza l'ambiente Aero, tutte le operazioni sono implementate nel software, sebbene Windows 7 abbia aggiunto alcune nuove funzionalità di accelerazione hardware bit-bit.

Windows CE 6.0 ha un nuovo kernel e un modello di processo, che sposta GDI in modalità kernel come su Windows desktop (prima di Vista), quindi il costo per chiamare una funzione GDI dovrebbe essere leggermente ridotto. Non è ancora disponibile il batch.

Altri suggerimenti

Non ho molta conoscenza del lato grafico delle cose, ma per esperienza, se vuoi essere veloce in alcune cose specifiche relative all'hardware, più vicino a "metal" più veloce puoi ottenere (e più diventa difficile!). Quindi puoi esaminare Direct Draw o Direct 3D (penso anche che stiano abbandonando D3D e passando a OpenGL ES per WM7) . Potresti voler esaminare il modo in cui usano gli sviluppatori di giochi.

Per quanto riguarda i profili, non ne ho trovato nessuno ma costruisco il mio proprio .

Ho fatto molto di questo tipo di benchmarking e le operazioni GDI sono più lente su WinCE rispetto al normale Win32, ma solo più lentamente in proporzione ai processori più lenti sui dispositivi WinCE. In altre parole, non sembra esserci alcun ulteriore calo delle prestazioni dall'uso di GDI in WinCE.

Siamo spiacenti, non ho risposte alle tue ultime due domande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top