2016-01-10 17 views
5

Poniżej znajduje się mały eksperyment, który wykonałem, gdy dołączam SurfaceTextureListener do TextureView w części onResume() działania.Czy SurfaceTexture przetrwa cykl pauzy/wznowienia aktywności?

  • na nowy początek: a struktura powierzchni jest udostępniona ("onSurfaceTextureAvailable")

  • na zmianę orientacji: jak bym się spodziewał, tekstura powierzchni ulega zniszczeniu ("onSurfaceTextureDestroyed") a następnie udostępniana jest tekstura powierzchni ("onSurfaceTextureAvailable").

Teraz oto co mnie zaskakuje:

  • włącznik zadań następnie wznowić: faktura powierzchni nie jest zniszczona (nie „onSurfaceTextureDestroyed”) i faktura powierzchni nie są udostępniane (no "onSurfaceTextureAvailable")

W tych warunkach gwarantuję, że stary SurfaceTexture jest stil ważne? Jak mogę się upewnić, że faktycznie wiem, kiedy moja SurfaceTexture jest dostępna? Dlaczego zmiana orientacji różni się od zmiany zadania i skąd mam wiedzieć?


public class MainActivity extends AppCompatActivity { 
    private final String TAG = "MainActivity"; 
    TextureView mTextureView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTextureView = (TextureView) findViewById(R.id.textureView); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { 
      @Override 
      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
       Log.d(TAG, "onSurfaceTextureAvailable"); 
      } 
      @Override 
      public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
       Log.d(TAG, "onSurfaceTextureSizeChanged"); 
      } 
      @Override 
      public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
       Log.d(TAG, "onSurfaceTextureDestroyed"); 
       return false; 
      } 
      @Override 
      public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      } 
     }); 
    } 
} 

Odpowiedz

0

powiedziałbym, że nie jest to problem i nie jest to „normalne” lub „oczekuje się” zachowanie. Ma wiele wspólnego ze sprzętem urządzenia i sposobem, w jaki system radzi sobie z przeciążeniem w wykorzystaniu zasobów lub zmianach oprogramowania sprzętowego.

Twoje urządzenie może mieć bardzo elastyczny akcelerator graficzny, a Twoje powierzchnie mogą przetrwać zmianę orientacji. Zobacz, kiedy urządzenie jest zatytułowane, tryb wideo zmienia się kompletnie i zapamiętaj te czasy programowania dla urządzeń stacjonarnych, kiedy wszystkie powierzchnie DirectX (powierzchnie są pamięcią wideo) powinny zostać odtworzone po zmianie trybu wideo z pulpitu na pełny ekran lub nawzajem.

To samo dzieje się wtedy, gdy twoja aplikacja jest grą wykorzystującą duże zasoby, która zużywa całą ilość pamięci wideo jak na powierzchnie dla tekstur lub backbufferów, lub tak ... Jeśli przełączysz się na inną aplikację i to nowe trzeba powierzchni, niektóre lub wszystkie z pamięci wideo powinny zostać zabite, aby nowy ekran działał.

A zatem ... Rozumiesz? ... Może się zdarzyć, że nie wykorzystasz całej pamięci wideo lub po prostu masz złe urządzenie z najnowszym oprogramowaniem, które poradzi sobie zarówno światło lub miękkie zmiany nie niszczące zasobów.

Morał z mojej, w przeciwnym razie bezużytecznej, mowy jest taki, że musisz sobie poradzić z niszczeniem, na wypadek, gdyby został zniszczony, nawet jeśli nigdy nie dzieje się w twoim urządzeniu lub będziesz miał wiele wyjątków próbujących zablokować płótno lub rendering przy zerowej.

Powiązane problemy