2012-10-22 14 views
5

Sto sviluppando una piccola libreria come base per alcune applicazioni. Mentre sto per creare uno scenegraph (2D) Mi chiedo quale dei seguenti approcci sembra più promettente sotto la vista delle prestazioni, manutenibilità, facile da usare, eccManipolazione della tela rispetto alla manipolazione degli elementi

  1. ho potuto dare ogni elemento drawable una matrice in cui Eseguo traduzione, rotazione e altro.
  2. Potrei fare tutto sulla tela invece degli elementi.

La prima soluzione ha un'inconvenienti: per gli elementi primitivi come cerchi, dove non posso passare una matrice nella chiamata sorteggio, devo accedere ai valori tradotti dalla matrice in questo modo:

private float get(int index) { 
    final float[] values = new float[9]; 
    getValues(values); 
    return values[index]; 
} 

public float getX() { 
    return get(Matrix.MTRANS_X); 
} 

public float getY() { 
    return get(Matrix.MTRANS_Y); 
} 

Così ad ogni chiamata di draw creo un array float per ogni chiamata getter (una per getX(), una per getY()). Supponendo di avere molti elementi sullo schermo, ciò potrebbe portare a un impatto sulla memoria e sulle prestazioni.

Il secondo approccio ha lo svantaggio del pensiero "negativo". Se voglio che un elemento sia disegnato al punto 100/100 devo tradurre la tela su -100/-100 come disegnerei su 0/0. Se ripristino la tela dopo, il risultato sarebbe l'elemento da disegnare sul 100/100 desiderato. Non sono sicuro che questo modo di pensare negativo possa avere un impatto pesante sulla manutenibilità del codice e sulla riduzione della comprensione (non ho mai nemmeno iniziato a pensare di introdurre bug dimenticando semplicemente di negare qualcosa ...).

Qualcuno ha una mancia che deve essere preferita?

risposta

2

Sembra che in effetti entrambe le soluzioni devono essere combinati.

La mia ipotesi sul secondo approccio è totalmente sbagliata. Se traduco un elemento su 100/100, il punto di origine verrà modificato in 100/100. Lo stesso vale, ovviamente, per la tela. Il pensiero negativo era totalmente privo di senso per me.

Il risultato combinato sarà il seguente:

  1. Ogni elemento che verrà disegnata, ha la sua matrice che contiene rotazione, traslazione e scala.
  2. La tela verrà salvata tramite save(), con il metodo fornito concat(Matrix matrix) la matrice dell'elemento può essere applicata. Il disegno verrà eseguito e la tela verrà ripristinata con restore().
  3. Ogni elemento drawable che è il padre di altri drawable si sovrappone ai figli e salva, concat e ripristina allo stesso modo.

Ciò consente l'implementazione di un grafico di scena 2D senza grandi interventi di implementazione.

1

Per motivi di prestazioni, l'utilizzo del metodo delle matrici interne è probabilmente più veloce poiché consente alle librerie di accelerare automaticamente l'hardware, se è ciò che si sta facendo. Poi di nuovo, non sono del tutto sicuro se sarebbe accelerato dall'hardware.

# 2 è il modo divertente. Sicuramente ti darebbe più potenza e flessibilità nel lungo periodo. Inoltre, potresti essere in grado di combinare i due.

C'è anche # 3: quando si dice elemento disegnabile, e se si utilizza Android Drawable, è possibile creare una classe Drawable personalizzata.

Io non credo che ci sia un modo perfetto per fare questo

+1

Ho pubblicato il mio risultato di ricerca. Non potrei ottenere nulla di nuovo dalla tua risposta, ma ti inviterò per il tuo impegno. – WarrenFaith