2013-03-03 24 views
9

Buduję aplikację, która wymaga dużego rysunku na płótnie. Zauważam, że ta aplikacja jest nieco opóźniona w urządzeniach o wysokiej rozdzielczości (na przykład nexus 7). Widziałem opcję Force GPU w opcji programisty. Gdy funkcja Wymuszanie procesora graficznego jest włączona, moja aplikacja działa zupełnie gładko.Android Force GPU Rendering Jak włączyć i wyłączyć?

Przeczytałem, że ta opcja Force GPU nazywa się przyspieszanie sprzętowe i jest dostępna tylko dla systemu Android 3.0 i nowszych.

Moja aplikacja jest przeznaczona dla systemu Android 2.3 i nowszych.

Czy można programowo włączyć sprzęt przyspieszony (lub wymusić procesor graficzny - bez względu na magię) na dowolnym urządzeniu z Androidem 3.0 lub nowszym?

Coś jak:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ 

    Turn On Hardware Accelerate HERE but How can i do this? 
    any code snippet would be welcome/helpful/thanks 

} 
+0

Przepraszamy za zamieszanie, buduję swoją aplikację na Androida 2.3 api 10, więc nie ma naprawdę lub getWindow(). setFlags ( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); – xiaowoo

+0

Czy dodałeś suppression do swojej metody onCreate? – wtsang02

+0

Ustaw swój cel kompilacji na poziom API 11 lub wyższy, a następnie użyj 'android: hardwareAccelerated =" true "'. – CommonsWare

Odpowiedz

6

Zakładam, że już dodane androida: hardwareAccelerated do pliku manifestu?

<application android:hardwareAccelerated="true" ...> 

To, co umożliwia sprzętową akcelerację w aplikacji za the guide on hardware acceleration i powinni robić dokładnie to, co zmusza GPU robi na poziomie systemowym.

+0

moja aplikacja używa Androida 2.3 api 10, nie ma Androida: hardwareAccelerated, więc narzeka na "Brak identyfikatora zasobu znalezionego dla atrybutu" hardwareAccelerated "w pakiecie" android "" – xiaowoo

+1

Możesz budować i kierować różne poziomy API. Buduj z API 11+ i utrzymuj minimum SDK na 10. – ianhanniballake

+0

ianhanniballake, mówisz, że mogę zbudować swoją aplikację przy użyciu najnowszego api (11) i sprawić, by nadal działała na niższych urządzeniach api? Czy to oznacza, że ​​muszę tylko uaktualnić mój cel projektu Android do najnowszego API? – xiaowoo

3

Set minSdkVersion do 10 i targetSdkVersion do maksymalnej

jak poniżej

<uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="17" /> 

następnie

<application android:hardwareAccelerated="true" ...> 

Teraz będzie działać

oraz dla szczególnych

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){ 
    view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
} 

lub

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){ 
    view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 
0

Jeśli chcesz zbudować swoją aplikację za pomocą niższego poziomu api można uzyskać dostęp do metody poprzez odbicie:

try { 
     Method setLayerType = view.getClass().getMethod(
       "setLayerType", new Class[] { int.class, Paint.class }); 
     if (setLayerType != null) 
      setLayerType.invoke(view, new Object[] { LAYER_TYPE_X, null }); 
    } catch (NoSuchMethodException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } catch (InvocationTargetException e) { 
    } 

Gdzie LAYER_TYPE_X jest stałą wartością całkowitą od pożądanego rodzaju warstwy:

LAYER_TYPE_NONE = 0 
LAYER_TYPE_SOFTWARE = 1 
LAYER_TYPE_HARDWARE = 2