В моем приложении для Android, которое представляет собой игру OpenGL ES 2.0, я включил 4 набора графических ресурсов, например:
- ldpi
- mdpi
- hdpi
- xhdpi
Теперь в моей папке xhdpi самый большой актив, который у меня есть, - 2560 x 1838, поскольку я нацелен здесь на большие экраны (например, планшет Google Nexus 10, который получает свои ресурсы из папки XHDPI). До сих пор все работало на устройствах, на которых я тестировал (Google Nexus 10, Samsung Galaxy S3, S4 и S5, Nexus 4 и 5 и т. Д. И т. Д.).
Недавно я получил известие от пользователя, который столкнулся с проблемами при запуске этого на телефоне HTC One X + (я считаю, что для этого есть и другие причины, помимо той, о которой я говорю здесь, поэтому у меня есть отдельный вопрос, открытый для других проблем) .
Дело в том, согласно: this, максимальный размер текстуры для этого телефона составляет 2048x2048, но согласно this этот телефон получает свои ресурсы из папки XHDPI.
Таким образом, он не будет отображать текстуры из этого атласа (это атлас фонов, содержащий 6 отдельных фонов размером 1280 * 612.
Теперь у меня есть два известных мне способа исправить это:
Уменьшите размер фона. Исключено, так как это снизит качество на устройствах с большим экраном (например, Nexus 10)
Разделить на 2 атласа предпочел бы не делать этого, поскольку хотел бы сохранить все фоны в 1 атласе для оптимизации скорости загрузки (и просто для того, чтобы все было в порядке)
Есть ли другие варианты? Могу ли я предоставить в подпапке xhdpi другую папку, которая соответствует лимитам 1X +? И если да, то как мне заставить устройство брать оттуда ресурсы?
Я делаю это вслепую, так как у меня нет 1X +, на котором можно это проверить, но из того, что я читал, я считаю, что наличие ресурсов размером более 2048 x 2048 вызовет проблемы на этом устройстве.
Это мой код для наложения текстур:
public static int LoadTexture(GLSurfaceView view, Bitmap imgTex){
//Array for texture
int textures[] = new int[1];
try {
//texture name
GLES20.glGenTextures(1, textures, 0);
//Bind textures
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
//Set parameters for texture
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
//Apply texture
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, imgTex, 0);
//clamp texture
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
} catch (Exception e){
}
//Increase texture count
textureCount++;
//Return texture
return textures[0];
}