Domanda

Ho un problema a disegnare qualcosa velocemente in .NET. Non penso che qualsiasi cosa in particolare dovrebbe richiedere molto tempo, ma su ogni macchina su cui l'ho provato, ottengo seri problemi. Questo è implementato in vs2008 .NET, usando C # (con alcune cose in C ++, ma nulla di rilevante per il disegno).

Ho tre schermate e l'utente dovrebbe essere in grado di passare da una all'altra senza ritardi. Nella prima schermata, ci sono quattro pulsanti, otto controlli utente costituiti da due pulsanti e 6 etichette ciascuno, un campo di testo e una casella a discesa. Non la penso così tanto.

Nella seconda schermata, ho quattro etichette, sei pulsanti e due controlli con sei pulsanti, un contesto di disegno aperto e una decina di etichette ciascuno.

Nella terza schermata, ho un contesto aperto e 10 pulsanti.

Il passaggio da qualsiasi schermata a qualsiasi schermata richiede letteralmente circa un secondo. Ad esempio, se passo dalla seconda schermata alla prima, l'intera applicazione si oscura, mostrando la schermata di sfondo, quindi viene disegnata la prima schermata. Molte volte, uno schermo viene disegnato frammentariamente, come se la macchina stesse deliberatamente fabbricando lettere delicate e deliziose in una fabbrica in Svezia e poi spedendole singolarmente sul mio schermo. Esagero e voglio chiarirlo, perché non credo che gli svedesi siano lenti come questo ridisegno.

Il primo e il secondo schermo vengono disegnati in memoria e memorizzati lì, con solo un '.Hide ()' e '.Show ()' per farli apparire e scomparire. Il doppio buffering non sembra avere importanza. La terza schermata viene ridisegnata ogni volta e sembra impiegare lo stesso tempo per disegnare la prima e la seconda.

Qualche pensiero? Cosa potrebbe succedere? Come posso rintracciarlo?

Grazie!

Modifica: dovrei aggiungere che qualsiasi elaborazione C ++ e simili avviene nel suo thread. C'è il metodo MethodInvoke occasionale per disegnare i risultati dell'operazione sullo schermo, ma questo problema si verifica senza chiamare alcuna funzione, semplicemente premendo i pulsanti per passare da una schermata all'altra.

È stato utile?

Soluzione

Oltre al profiler menzionato, potresti anche disattivare i contesti OpenGL. Se noti un'accelerazione, allora saprai che sono i tuoi elementi grafici e puoi concentrare le tue ottimizzazioni di conseguenza.

Punti assegnati per umorismo svedese.

Altri suggerimenti

  

Come posso rintracciarlo?

dotTrace - http://www.jetbrains.com/profiler/

Stai eseguendo altre elaborazioni durante lo "capovolgimento dello schermo" evento? altro che lasciare semplicemente ridisegnare il modulo? Se stai elaborando qualcosa tra i flip (forse la tua aggiunta al c ++?) E non stai eseguendo il multi-threading, otterrai l'effetto white out. Il modulo probabilmente sta aspettando che il tempo della CPU si ridisegni.

Non ho mai usato OpenGL in questo modo da solo, ma potresti voler esaminare il modo in cui i contesti OpenGL sono capovolti. Quando passi da una pagina all'altra potresti ricevere un reset del dispositivo (in termini di DirectX), che potrebbe causare il ritardo.

Se possibile, fai disegnare un dispositivo su un System.Drawing.Bitmap posteriore e usa quella bitmap sugli schermi. Rendi consapevole il tuo codice OpenGL della pagina corrente in cui si trova l'utente e potresti ottenere la velocità che cerchi.

Per verificarlo prima di apportare enormi modifiche, prova a rimuovere i display OpenGL dal modulo.

Questo è tutto un capriccio.

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