2013-02-10 1 views
5

sto scaricando immagini in rete e aggiungerli al mio libgdx UI come attori immagine usando questo:Come ricaricare libgdx Texture non gestito dopo la perdita di contesto OpenGL

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

Dato questo ho bisogno di qualche modo per ricaricare la trama dati da quando è perso quando il contesto OpenGL è perso (ad esempio perché lo schermo va a dormire).

Ho provato a fare la mia classe di manager, aggiungendo

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

al frammento di sopra, e in resume() faccio:

DynamicTextureManager.reload(); 

La classe dirigente:

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

Ma questo non aiuta - finisco con la texture che viene scaricata e le aree bianche invece della i mago.

Come dovrebbe essere fatto? Non sono stato in grado di trovare alcun codice che dimostri questo!

+0

La mia ipotesi è che una 'Texture' non _magicamente_ ricrei l'handle di texture sottostante. Prova a ricreare la 'Texture' stessa, o passa ai cosiddetti dati texture _managed_ (controlla le sottoclassi di' TextureData'; 'PixmapTextureData' non supporta questa nozione. –

+0

Ho un compito che è molto simile a questo. lo faccio ancora, ma se riesco a farlo funzionare (che penso coinvolgerà la ricostruzione della Pixmap dai dati binari) aggiornerò questo con una risposta: – Jyro117

+0

@ Jyro117 Ho aggiunto la mia soluzione attuale come risposta, sentitevi liberi di migliorare! – johlo

risposta

1

Aggiunta la mia soluzione come riferimento. Ora registro l'oggetto Image e l'oggetto Pixmap con il mio manager, su reload() la Texture viene ricreata dalla Pixmap e ho impostato la nuova Texture per la vecchia immagine. Funziona per me, ma le soluzioni più eleganti sono benvenute.

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

}