2009-07-14 12 views
6

Sto scrivendo un'applicazione che utilizza il dito per disegnare semplici diagrammi. Lo faccio funzionare per la maggior parte, ma ora sto cercando di ottimizzare le sue prestazioni. Quando l'utente fa scorrere rapidamente il dito, non riesco a catturare eventi di tocco sufficienti per tracciare un percorso scorrevole.Ottimizzazione dell'applicazione di disegno (con un tocco delle dita) per iPhone SDK

Ecco il mio approccio attuale:

1) I sottoclasse un UIView e ha aggiunto un poroperty ad un CGLayer (viene creato pigramente ed è la stessa dimensione come la mia UIView). 2) La sottoclasse UIView risponde agli eventi di tocco memorizzando gli ultimi e attuali punti di contatto nelle variabili di istanza. 3) La mia vista setNeedsDisplay viene richiamata e in draw rect, effettuare le seguenti operazioni: - tracciare una linea dalla posizione di tocco precedente alla posizione corrente su CGLayer - trascina l'intero CGLayer nel contesto delle viste in una volta

Il problema principale è quando un utente scorre rapidamente. Ottengo relativamente pochi eventi di tocco, quindi le linee che disegna tra i tocchi sono lunghe e rendono il tracciato frastagliato non liscio.

Le mie domande:

1) Se drawRect (sul mio UIView sottoclasse) e il mio tocco gestori di eventi sul mio UIView sottoclasse vengono chiamati nello stesso thread? Cioè potrei avere thread in esecuzione (uno in un evento touch e il secondo nel mio draw rect)?

Se nessun evento tocco viene accodato mentre viene chiamato drawRect? E come posso migliorare le prestazioni - semplicemente migliorare le prestazioni di drawRect?

Se sì, come posso ottenere più eventi di tocco affinché possa disegnare un percorso più agevole?

Grazie.

risposta

4

Un altro approccio consiste nell'interpolare la curva tra i punti di campionamento. Quando inizia il trascinamento del dito, inizia a raccogliere punti campione. All'aumentare del numero di punti, ridisegna la linea. Con due punti, traccia una linea retta, con tre o più disegna una curva. È possibile riavviare il processo quando vengono campionati due punti che si trovano entro una distanza definita. Questo ti permetterebbe di disegnare due archi (come una 'm') in un movimento: ti fermerai naturalmente nel mezzo mentre cambi direzione, possibilmente abbastanza a lungo per due o più campioni.

3

drawRect viene chiamato sul thread principale. Ma tu non devi farlo. È possibile utilizzare il thread principale per raccogliere gli eventi dell'interfaccia utente e fare il disegno su un thread in background. Il thread in background viene notificato ogni volta che ci sono nuovi tocchi e avvia un'operazione di disegno nel proprio CGBitmapContext. Quindi crei un CGImage e lo consegni alla vista: view.layer.contents = drawingImage.

Se sono necessarie prestazioni ancora maggiori, è consigliabile disegnare utilizzando OpenGL.

+0

Quindi sia il mio drawRect ei miei gestori di eventi di tocco ottenere chiamato sul thread principale? Stai suggerendo che ogni volta che si verifica un evento tattile dovrei iniziare una nuova discussione e fare il mio disegno in quel thread? – aloo

+1

Sto proponendo di avere ** un thread di lavoro **. Inizia a disegnare ogni volta che è finito con quello vecchio e almeno un nuovo tocco è disponibile. –

1

Aloo, hai trovato una soluzione a lui perché ho lo stesso problema. Ho anche trovato un ottimo tutorial http://www.ipodtouchfans.com/forums/showthread.php?t=132024 ma ha anche lo stesso problema che se disegni velocemente, diciamo un cerchio, il disegno non è molto fluido. È quasi come se l'iPhone non potesse tenere il passo, sfortunatamente questo deve usare la grafica di base.

0

Ho provato ad aggiungere

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); 

ma questo non ha fatto nulla. Sembra che dovremo capire le curve di Bezier

Problemi correlati