Şu anda kullanıcının SD Kartında bulunan tüm görüntülerin bir alt kümesini oluşturan bir 3B görüntüleyici uyguluyor. Ben düşünürdüm yakın eşleşen ürün Cooliris'i olacaktır:Android OpenGL dokular: anında oluşturma ve silme
Bu sadece her yeni fayans ekranına girip yeni görüntüler gösteren ile farklı görüntüler gösteren ekranda N karoların bir kaydırma kurulu göstermektedir.
Şimdi benim problemim için: Programın dörtlüleri güzelce çalışmasına ve oluşturmasına sahibim. Dörtlü ekrandan çıktığında, geri dönüştürülür/bırakılır. Ve yeni dörtlü ekrana girmeden önce kiremit panosuna eklenmeye devam ediyor.
Yüzlerce resim olabileceğinden, dokular uçta oluşturulmalı ve silinmelidir (böylece bellek tükenmez). Sahip olduğum problem, dokuları sildikten sonra, yeni oluşturulan dokuların şu anda kullanımda olan bazı dokulardan bazılarının kimliklerini almasıdır.
Benim render döngü şöyle görünür:
TileBoard {
Image[] allImages;
Tile[] board;
}
Tile {
Image image;
}
Image {
String path;
int textureId;
int referenceCount;
}
Doku oluşturma kodu:
void render(GL10 gl) {
0. Move the camera
// Tile board maintenance
1. Remove tiles out of screen
2. Add new tiles which are about to enter screen
// Texture handling
3. glDeleteTextures on all unused textures followed by glFlush
4. For newly used images
- Create corresponding Bitmap
- Create the OpenGL texture, followed by glFlush
- Release the Bitmap
// Rendering
5. Render the tile (using a textured quad)
}
veri nasıl düzenlendiğini daha iyi bir fikir vermek için, burada sınıfların bir bakış
protected void loadSingleTexture(GL10 gl, long objectId, Bitmap bmp) {
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
gl.glFlush();
if (bmp != null) bmp.recycle();
if (listener != null) listener.onTextureLoaded(gl, objectId, textures[0]);
}
Doku silme kodu:
// pendingTextureUnloads is a Set<Integer>
if (pendingTextureUnloads.size() > 0) {
int[] textureIds = new int[pendingTextureUnloads.size()];
int i = 0;
Iterator<Integer> it = pendingTextureUnloads.iterator();
while (it.hasNext()) {
textureIds[i] = it.next();
}
gl.glDeleteTextures(textureIds.length, textureIds, 0);
gl.glFlush();
}
GlGetError'u herhangi bir yerde arayarak mı denediniz? – Tim