29.12.2014, 22:12. Просмотров 262. Ответов 0
Забавы ради я пилю маленькую игрушку под Android, для графики пользуюсь Open GL ES 1. Для удобства обработки текстур у меня есть пара методов, инкапсулирующих необходимые действия Open GL. Вот они:
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| public void load() {
GL10 gl = glGraphics.getGL();
int[] textureIds = new int[1];
gl.glGenTextures(1, textureIds, 0);
textureId = textureIds[0];
InputStream in = null;
try {
in = fileIO.readAsset(fileName);
Bitmap bitmap = BitmapFactory.decodeStream(in);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
bitmap.recycle();
}
catch(IOException e) {
throw new RuntimeException("Couldn't load texture '" + fileName + "'", e);
}
finally
{
if(in != null)
{
try {
in.close();
}
catch (IOException e) { }
}
}
}
public void reload() {
load();
setFilters(minFilter, magFilter);
glGraphics.getGL().glBindTexture(GL10.GL_TEXTURE_2D, 0);
}
public void setFilters(int minFilter, int magFilter) {
this.minFilter = minFilter;
this.magFilter = magFilter;
}
public void bind() {
GL10 gl = glGraphics.getGL();
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, minFilter);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, magFilter);
}
public void dispose() {
GL10 gl = glGraphics.getGL();
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
int[] textureIds = { textureId };
gl.glDeleteTextures(1, textureIds, 0);
} |
|
Работа с текстурным атласом начинается с создания экземпляра класса, содержащего эти методы, и вызова load(). Перед отрисовкой спрайтов с текстурами вызывается bind(). Когда есть вероятность потери контекста, я вызываю reload(). Метод dispose() хоронит атлас.
В игре постоянно используются 2 атласа 1136 x 640. Один из них загружается 1 раз и навсегда. А вот другой иногда подменяется аналогичным, но выполненным в других цветах. Происходит это при рестарте уровня, выбор новой раскраски делается рандомно.
Проблема заключается в том, что если юзер часто делает рестарт уровня (насколько часто возможно делать комбо вызов меню + кнопка рестарта + ОК), то раз через 5 уровень начинает грузиться заметно медленнее и медленнее, а потом игра крэшится. Метод dispose() срабатывает вовремя, метод finalize() для класса срабатывает вовремя. И я уже несколько дней ума не приложу в чём может быть проблема. Буду рад, если у кого-то есть дельные мысли.