2015-07-07 2 views
0

Я пишу код, который загружает ad-hoc-текстуры во время выполнения. Загружаемая текстура указана пользователем, поэтому я не знаю об этом до ее загрузки.JVM вылетает при использовании MipMaps на небольших текстурах в Windows

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

Texture texture = new Texture(imageFile, true); 

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

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

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

+0

Просто к сведению: это не виртуальная машина умирает. LibGDX неизбежно перейдет к внешнему внутреннему коду, который будет взаимодействовать с OpenGL, и если этот родной код выйдет из строя, в результате произойдет сбой JVM. API OpenGL точно не известен своей внутренней проверкой ошибок, если вы передадите ему мусор, авария, как правило, будет результатом. Таким образом, окончательный «обходной путь» заключается в том, чтобы найти, как вы запускаете LibGDX, чтобы делать все неправильные вещи в своем интерфейсе OpenGL и исправлять это. Или сообщите об этом как об ошибке для команды LibGDX. – Gimby

+0

Спасибо за комментарий @Gimby: Да, я знал, что это был собственный код - это было ясно из дампа потока, и именно так я обнаружил, что это было mipmapping, которое вызывало проблему. Libgdx использует Lwjgl, поэтому я предполагаю, что это тот проект, который может сделать с усилением обработки ошибок. Тем не менее, создание MipMaps для текстур с шириной или высотой 1 почти никогда не будет полезной задачей, так как ошибки идут довольно незначительно. –

+0

«Почти никогда» - я бы просто пошел на это и сказал «никогда». Таким образом, в этом отношении ваш собственный ответ на самом деле является правильным решением, а не обходным путем. – Gimby

ответ

1

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

Вот что я закончил с ...

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); 
Смежные вопросы