Сбой JVM при использовании MipMaps на небольших текстурах в Windows

Я пишу код, который загружает специальные текстуры во время выполнения. Текстура, которую я загружаю, определяется пользователем, поэтому я ничего не знаю о ней до ее загрузки.

Некоторые текстуры могут быть довольно большими и сильно масштабироваться, поэтому я использую TextureFilter.MipMapLinearNearest в качестве минимального фильтра. Следовательно, я загружаю текстуру с параметром useMipMaps, установленным в true...

Texture texture = new Texture(imageFile, true);

Проблема в том, что в Windows моя JVM умирает с фатальной ошибкой, если пользователь указывает изображение высотой всего в один пиксель.

Одним из решений было бы то, что я мог бы проверить это, загрузив текстуру без включенных MipMaps, чтобы проверить размер, а затем перезагрузить ее с включенными MipMaps, если размер больше 1, однако я бы хотел избежать загрузки дважды .

Есть ли более эффективный способ обойти эту проблему?


person Phil Anderson    schedule 07.07.2015    source источник
comment
Просто отметим: это не смерть JVM. LibGDX неизбежно будет переходить к внешнему собственному коду, который будет взаимодействовать с OpenGL, и если этот собственный код выйдет из строя, в результате этого произойдет сбой JVM. API OpenGL точно не известен своей внутренней проверкой ошибок, если вы передадите ему мусор, результатом обычно будет сбой. Таким образом, окончательный обходной путь - найти, как вы запускаете LibGDX, чтобы делать все неправильные вещи в своем интерфейсе OpenGL, и исправить это. Или сообщите об этом как об ошибке команде LibGDX.   -  person Gimby    schedule 07.07.2015
comment
Спасибо за комментарий @Gimby: Да, я знал, что это был нативный код - это было ясно из дампа потока, и именно поэтому я обнаружил, что проблема вызывается мипмаппингом. Libgdx использует Lwjgl, поэтому я думаю, что этот проект мог бы улучшить обработку ошибок. Тем не менее, генерация MipMaps для текстур с шириной или высотой 1 почти никогда не будет полезной, так как ошибки в ней довольно незначительны.   -  person Phil Anderson    schedule 07.07.2015
comment
Почти никогда - я бы просто пошел на это и заявлял никогда никогда. Так что в этом отношении ваш самостоятельный ответ на самом деле является правильным решением, а не обходным путем, на мой взгляд.   -  person Gimby    schedule 07.07.2015


Ответы (1)


Я нашел лучший обходной путь. Я могу загрузить файл один раз как растровое изображение, а затем использовать его для условного построения текстуры.

Вот что у меня получилось...

Pixmap pixmap = new Pixmap(imageFile);
boolean useMipMaps = pixmap.getWidth() > 1 && pixmap.getHeight() > 1;
Texture texture = new Texture(pixmap, useMipMaps);
texture.setFilter(useMipMaps ? Texture.TextureFilter.MipMapLinearNearest 
                             : Texture.TextureFilter.Linear,
                  Texture.TextureFilter.Linear);
person Phil Anderson    schedule 07.07.2015