# [LWJGL] Textur / File wieder freigeben



## Times (14. Sep 2015)

Hallo Community,

beim freigeben einer Textur mittels OpenGL habe ich das Problem das die Textur-ID zwar freigegeben wird, aber die Datei auf der Platte weiterhin in Benutzung ist, solange wie das Spiel noch läuft.

Textur wird geladen mittels:

```
public int loadTexture(String fileName){
        try {
            Texture texture = TextureLoader.getTexture("PNG", new FileInputStream("res/textures/"+fileName+".png"));
            GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
            GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
            GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.5f);
            int textureID = texture.getTextureID();
            this.textures.add(textureID);
            return textureID;
        } catch (IOException ex) {
            Logger.getLogger(ModelLoader.class.getName()).log(Level.SEVERE, null, ex);
        }
        return 0;
    }
```

Textur wird in OpenGL freigegeben mit:

```
public void unloadTexture(int id){
        GL11.glDeleteTextures(id);
        this.textures.remove(id);
    }
```

Hat jemand eine Idee oder vielleicht eine Lösung wie ich die Datei nun wieder freigeben kann? Am besten wäre wenn dies auch mittels der id gehen würde, sprich ohne Dateinamen.

Vielen Dank


----------



## InfectedBytes (15. Sep 2015)

folgendes könnte vielleicht schon reichen:

```
FileInputStream fis = new FileInputStream("res/textures/"+fileName+".png");
Texture texture = TextureLoader.getTexture("PNG", fis);
// ...
fis.close();
return textureID;
```


----------



## Times (15. Sep 2015)

Hey,

zunächst danke für die Antwort, aber das funktioniert leider nicht, Ergebnis bleibt das selbe.


----------



## truesoul (15. Sep 2015)

Hallo,

vielleicht sowas wie :


```
import java.io.IOException;
import java.io.InputStream;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
public class TextureExample {
  
  /** The texture that will hold the image details */
  private Texture texture;
  
  
  /**
  * Start the example
  */
  public void start() {
  initGL(800,600);
  init();
  
  while (true) {
  GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
  render();
  
  Display.update();
  Display.sync(100);
  if (Display.isCloseRequested()) {
  Display.destroy();
  System.exit(0);
  }
  }
  }
  
  /**
  * Initialise the GL display
  *
  * @param width The width of the display
  * @param height The height of the display
  */
  private void initGL(int width, int height) {
  try {
  Display.setDisplayMode(new DisplayMode(width,height));
  Display.create();
  Display.setVSyncEnabled(true);
  } catch (LWJGLException e) {
  e.printStackTrace();
  System.exit(0);
  }
  GL11.glEnable(GL11.GL_TEXTURE_2D);  
  
  GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
  
  // enable alpha blending
  GL11.glEnable(GL11.GL_BLEND);
  GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
  
  GL11.glViewport(0,0,width,height);
  GL11.glMatrixMode(GL11.GL_MODELVIEW);
  GL11.glMatrixMode(GL11.GL_PROJECTION);
  GL11.glLoadIdentity();
  GL11.glOrtho(0, width, height, 0, 1, -1);
  GL11.glMatrixMode(GL11.GL_MODELVIEW);
  }
  
  /**
  * Initialise resources
  */
  public void init() {
  
  try {
  // load texture from PNG file
     InputStream resourceAsStream = ResourceLoader.getResourceAsStream("image.jpg");
  texture = TextureLoader.getTexture("JPG", resourceAsStream);
  
  System.out.println("Texture loaded: "+texture);
  System.out.println(">> Image width: "+texture.getImageWidth());
  System.out.println(">> Image height: "+texture.getImageHeight());
  System.out.println(">> Texture width: "+texture.getTextureWidth());
  System.out.println(">> Texture height: "+texture.getTextureHeight());
  System.out.println(">> Texture ID: "+texture.getTextureID());
  
  resourceAsStream.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  /**
  * draw a quad with the image on it
  */
  public void render() {
  Color.white.bind();
  texture.bind(); // or GL11.glBind(texture.getTextureID());
  
  GL11.glBegin(GL11.GL_QUADS);
  GL11.glTexCoord2f(0,0);
  GL11.glVertex2f(100,100);
  GL11.glTexCoord2f(1,0);
  GL11.glVertex2f(100+texture.getTextureWidth(),100);
  GL11.glTexCoord2f(1,1);
  GL11.glVertex2f(100+texture.getTextureWidth(),100+texture.getTextureHeight());
  GL11.glTexCoord2f(0,1);
  GL11.glVertex2f(100,100+texture.getTextureHeight());
  GL11.glEnd();
  }
  

  public static void main(String[] argv) {
  TextureExample textureExample = new TextureExample();
  textureExample.start();
  }
}
```

Und die Zeile: 

resourceAsStream.close();

ist das entscheidene. Getestet und für gut empfunden.


----------



## Times (15. Sep 2015)

Guten Abend 

Das hat doch auf anhieb funktioniert, vielen Dank 
Finde es nur komisch das es mit dem FileInputStream nicht funktioniert!

Grüße


----------

