2012-10-22 19 views
5

Opracowuję małą bibliotekę jako podstawę do niektórych zastosowań. Jak mam zamiar stworzyć scenegraph (2D) Zastanawiam się, które z następujących podejść wygląda bardziej obiecująco pod widzenia wydajności, konserwacji, łatwe w użyciu itdManipulacja płótnem a manipulowanie elementami

  1. mogę dać każdy element rozciągliwej matrycę gdzie Wykonuję tłumaczenia, rotację i więcej.
  2. Mogłem zrobić wszystko na płótnie zamiast na elementach.

Pierwsze rozwiązanie posiada wady: Do pierwotnych elementów, takich jak koła, w którym nie mogą przenikać macierz na wywołanie rozciągania musi uzyskać dostęp przetłumaczone wartości od matrycy, jak to:

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); 
} 

Tak więc przy każdym wywołaniu remisu tworzę tablicę float dla każdego wywołania gettera (jeden dla getX(), jeden dla getY()). Zakładając, że mam mnóstwo elementów na ekranie, może to doprowadzić do zwiększenia pamięci i wydajności.

Drugie podejście ma wadę myślenia "negatywnego". Jeśli chcę, aby element został narysowany w punkcie 100/100, muszę przetłumaczyć płótno na -100/-100, tak jak rysowałem na 0/0. Jeśli później przywrócę płótno, wynikiem będzie element, który zostanie narysowany na pożądanym 100/100. Nie jestem pewien, czy to negatywne myślenie spowodowałoby duży wpływ na łatwość obsługi kodu i zmniejszenie zrozumienia (nigdy nawet nie zaczęto myśleć o wprowadzaniu błędów po prostu zapominając o negowaniu czegoś ...).

Czy ktoś ma napiwek, który powinien być preferowany?

Odpowiedz

2

Wydaje się, że rzeczywiście oba rozwiązania muszą być łączone.

Moje założenie dotyczące drugiego podejścia jest całkowicie błędne. Jeśli przetłumaczyć element na 100/100, punkt początkowy zostanie zmieniony na 100/100. To samo dotyczy oczywiście płótna. Negatywne myślenie było całkowitym nonsensem ze mnie.

Połączony efekt będzie następujący:

  1. Każdy element, który zostanie sporządzony, ma swój własny macierzy, która zawiera obrotową, tłumaczenia i skalę.
  2. Obszar roboczy zostanie zapisany za pomocą save(), przy użyciu dostarczonej metody concat(Matrix matrix) można zastosować matrycę elementu. Rysunek zostanie wykonany i płótno zostanie przywrócone za pomocą restore().
  3. Każdy element do rysowania, który jest elementem nadrzędnym dla innych rysunków, będzie przełączać się między dziećmi i zapisywać, konkatować i przywracać w ten sam sposób.

Umożliwia to wykonanie wykresu 2D bez dużych prac wdrożeniowych.

1

Ze względów wydajnościowych, użycie metody wewnętrznych macierzy jest prawdopodobnie szybsze, ponieważ umożliwia automatyczną akcelerację bibliotek, jeśli to właśnie robisz. Z drugiej strony, nie jestem do końca pewien, czy będzie to sprzęt przyspieszony.

# 2 to świetny sposób. Zdecydowanie dałoby to więcej mocy i elastyczności na dłuższą metę. Poza tym możesz połączyć oba.

Jest też nr 3: gdy mówisz element do rysowania, a jeśli korzystasz z Android Drawables, możesz utworzyć niestandardową klasę Draw.

Nie sądzę, istnieje doskonały sposób, aby to zrobić

+1

Opublikowałem wyniki moich badań. Naprawdę nie mogłem uzyskać niczego nowego z twojej odpowiedzi, ale głosowałem za twój wysiłek. – WarrenFaith