2013-02-10 8 views
5

jestem pobieranie obrazów przez sieć i dodać je do mojego libgdx UI jako aktorzy zdjęcie za pomocą tego:Jak przeładować libgdx niezarządzanej Texture po OpenGL utraty kontekstowego

Pixmap pm = new Pixmap(data, 0, data.length); 
Texture t = new Texture(pm); 
TextureRegion tr = new TextureRegion(t,200,300); 
TextureRegionDrawable trd = new TextureRegionDrawable(tr); 
Image icon = new Image(); 
icon.setDrawable(trd); 

Biorąc pod uwagę to muszę jakiś sposób ponowne ładowanie dane tekstury, ponieważ są tracone, gdy kontekst OpenGL zostanie utracony (np. z powodu przejścia ekranu w stan uśpienia).

Próbowałem dokonywania moje własne klasy menedżera, dodając

DynamicTextureManager.register(t, pm); // Register texture together with the source pixmap 

do powyższego fragmentu, w resume() zrobić:

DynamicTextureManager.reload(); 

Klasa kierownik:

public class DynamicTextureManager { 
    private static LinkedHashMap<Texture, Pixmap> theMap = new 
     LinkedHashMap<Texture,Pixmap>(); 
    public static void reload() { 
     Set<Entry<Texture,Pixmap>> es = theMap.entrySet(); 
     for(Entry<Texture,Pixmap> e : es) { 
      Texture t = e.getKey(); 
      Pixmap p = e.getValue(); 

      t.draw(p, 0, 0); 
     } 
    } 

    public static void register(Texture t, Pixmap p) { 
     theMap.put(t, p); 
    } 
} 

Ale to nie pomaga - nadal kończę z rozładowywaną teksturą i białymi obszarami zamiast i Mag.

Jak należy to zrobić? Nie udało mi się znaleźć żadnego kodu demonstrującego to!

+0

Domyślam się, że 'Tekstura' nie _magicznie_ odtwarza uchwyt struktury tekstur. Spróbuj odtworzyć samą teksturę 'Texture' lub przełączyć się na tak zwane dane _managed_ texture (sprawdź podklasy' TextureData'; 'PixmapTextureData' nie obsługuje tego pojęcia –

+0

Mam zadanie, które jest bardzo podobne do tego. zrobiłem to jeszcze, ale jeśli zrobię to działa (co myślę, że będzie wymagać przebudowy Pixmapy z danych binarnych), zaktualizuję to odpowiedzą – Jyro117

+0

@ Jyro117 Dodałem moje aktualne rozwiązanie jako odpowiedź, zachęcamy do poprawy! – johlo

Odpowiedz

1

Dodawanie mojego rozwiązania jako odniesienia. Teraz rejestruję obiekt Image i obiekt Pixmap wraz z moim managerem, na reload() Texture jest ponownie tworzony z Pixmap i ustawiam nową Texture dla starego Image. Działa dla mnie, ale bardziej eleganckie rozwiązania są mile widziane.

import java.util.Map.Entry; 
public class DynamicTextureManager { 
    private static final class MapData { 
     Pixmap pixmap; 
     int width; 
     int height; 
    } 

    private static WeakHashMap<Image, MapData> theMap = new WeakHashMap<Image, MapData>(); 

    public static void reload() { 
     Set<Entry<Image, MapData>> es = theMap.entrySet(); 
     for (Entry<Image, MapData> e : es) { 
      Image i = e.getKey(); 
      MapData d = e.getValue(); 

      Texture t = new Texture(d.pixmap); 
      TextureRegion tr; 
      if(d.width == -1 || d.height == -1) { 
       tr = new TextureRegion(t); 
      } 
      else { 
       tr = new TextureRegion(t,d.width, d.height);     
      } 
      TextureRegionDrawable trd = new TextureRegionDrawable(tr); 
      i.setDrawable(trd); 
     } 
    } 

    public static void register(Image i, Pixmap p) { 
     MapData d = new MapData(); 
     d.pixmap = p; 
     d.width = -1; 
     d.height = -1; 
     theMap.put(i, d); 
    } 

    public static void register(Image i, Pixmap p, int width, int height) { 
     MapData d = new MapData(); 
     d.pixmap = p; 
     d.width = width; 
     d.height = height; 

     theMap.put(i, d); 
    } 

} 
Powiązane problemy