Domanda

Ho un'applicazione MFC che visualizza mappe annotate, che possono includere una grande quantità di testo.Mentre la dimensione e il carattere del testo non tendono a cambiare molto, la rotazione del testo varia considerevolmente, per essere allineata con la linea di lavoro circostante.Ciò significa sostanzialmente che devo creare e selezionare un nuovo carattere nel contesto di visualizzazione ogni volta che cambia la rotazione.Qualcosa di simile a;

if (TextRotationChanges)
{
    m_pFont = new CFont;
    m_lf.lfEscapement = NewRotation;
    m_pFont->CreateFontIndirect(&m_lf);
}
CFont *OldFont = m_pDC->SelectObject(m_pFont);
m_pDC->TextOut(x,y,text,strlen(text));
m_pDC->SelectObject(OldFont);

Questo è ovviamente lento quando si ha a che fare con grandi quantità di testo.Esiste un modo per accelerarlo senza passare a un motore di visualizzazione diverso come D3D o OpenGL?In altre parole, posso modificare la rotazione del testo nel carattere selezionato esistente?

n.b.Sto già eseguendo altre ovvie ottimizzazioni, come garantire che il testo sia sullo schermo con dimensioni visibili prima di tentare di disegnarlo.

È stato utile?

Soluzione

La creazione e la distruzione di molti oggetti GDI possono essere lente.Quello che puoi fare è creare caratteri 360 all'avvio del tuo programma in modo da poter selezionare SelectObject() da una tabella di ricerca con caratteri predefiniti con la rotazione corretta, anziché crearli su richiesta.Oppure puoi ruotare il testo non utilizzando lfEscapement ma utilizzando SetWorldTransform() con la matrice di rotazione appropriata (di nuovo, potresti memorizzare nella cache le matrici di rotazione per la velocità).Dovresti testare se ti darà effettivamente un aumento di velocità.

Vedi la mia domanda qui SetWorldTransform() e rotazione dei caratteri per un problema che ho avuto/ho con questo approccio, però (non ho avuto il tempo di tornare indietro ed esaminarlo).

Altri suggerimenti

Sei sicuro che il problema è il tipo di carattere e non il TextOut?
idea di Oleg di utilizzare un buffer posteriore non è male se si vuole evitare lo sfarfallio.

Se stavo per usare un motore grafico che mi piacerebbe provare Cairo perché è progettato appositamente per questo tipo di posti di lavoro.
(Si può rendere direttamente sopra Win32 superfici DC)

Si deve prima disegnarlo sul invisibile DC e di copiarli sul DC.

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