ImageIO

Версия Minecraft
0.1+
1,111
47
420
Крч есть у меня такой вот код:
Scala:
override def bindTexture(resource: Resource): Unit = {
    if (!resource.isTexture) throw new RuntimeException(s"$resource is not a texture")
    textures.get(resource) match {
      case Some(texture) =>
        texture.bindAsTexture()
      case None =>
        getInput(resource) match {
          case Some(input) =>
            val image = ImageIO.read(input)
            val unit = image.toGLTexture
            textures.put(resource, unit)
            unit.bindAsTexture()
          case None =>
            bindTexture(emo)
        }

    }
  }
Да, да тригеритесь на скалу. Суть в том что он должен был бы загрузить картинку из потока, но он тупа даже не входит в метод read (ImageIO.read(input)). Вопрос собсвенна пачему?
 

CumingSoon

Местный стендапер
1,634
12
269
То же самое на котлине, примерно такая же длина кода, лишено всех перечисленных мной проблем, генерирует 0 мусора при вызове bindTexture для уже загруженной текстуры

Kotlin:
val missingTexture = loadTexture(emo) ?: throw RuntimeException("Missing texture not found")

override fun bindTexture(resource: Resource) {
    textures.getOrPut(resource) {
        loadTexture(resource) ?: missingTexture
    }.bindAsTexture()
}

private fun loadTexture(resource: Resource): Int? {
    if (!resource.isTexture) throw RuntimeException("$resource is not a texture")
    try {
        // будем считать что getInput кинет IOException, если нетути файла
        getInput(resource).use {
           return ImageIO.read(input).loadToGlTexture()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return null
}
Обрабатывать исключения считается моветоном. Тем более, обрабатывать стандартным путём :p
 
1,111
47
420
Не бывает implicit констант, это в любом случае функция по факту. Просто можно сделать вид что это константа, и написать implicit val вместо def, но тогда оно и вести себя должно как константа: быстро, за константное время, без сайдэффектов. У тебя же выглядит как константа, а ведет себя как функция. Ну или я абсолютно не понял что у тебя делает toGLTexture, можешь код сюда закинуть
Я не понял видимо def в котлине значит что то сильно другое, но в байт коде это выглядит так:
Sass:
L15
    LINENUMBER 81 L15
    GETSTATIC ru/justagod/game/helper/RenderHelper$.MODULE$ : Lru/justagod/game/helper/RenderHelper$;
    ALOAD 10
    INVOKEVIRTUAL ru/justagod/game/helper/RenderHelper$.ImageHelper (Ljava/awt/image/BufferedImage;)Lru/justagod/game/helper/RenderHelper$ImageHelper;
    INVOKEVIRTUAL ru/justagod/game/helper/RenderHelper$ImageHelper.toGLTexture ()I
   L16
    ISTORE 11
   L17
    LINENUMBER 82 L17
    ALOAD 0
    INVOKESPECIAL ru/justagod/game/client/resources/SimpleResourceManager.textures ()Lscala/collection/mutable/HashMap;
    NEW scala/Tuple2
    DUP
    ALOAD 1
    ILOAD 11
    INVOKESTATIC scala/runtime/BoxesRunTime.boxToInteger (I)Ljava/lang/Integer;
    INVOKESPECIAL scala/Tuple2.<init> (Ljava/lang/Object;Ljava/lang/Object;)V
    INVOKEVIRTUAL scala/collection/mutable/HashMap.$plus$eq (Lscala/Tuple2;)Lscala/collection/mutable/HashMap;
    POP
   L18
 
1,111
47
420
Я не понял видимо def в котлине значит что то сильно другое, но в байт коде это выглядит так:
Sass:
L15
    LINENUMBER 81 L15
    GETSTATIC ru/justagod/game/helper/RenderHelper$.MODULE$ : Lru/justagod/game/helper/RenderHelper$;
    ALOAD 10
    INVOKEVIRTUAL ru/justagod/game/helper/RenderHelper$.ImageHelper (Ljava/awt/image/BufferedImage;)Lru/justagod/game/helper/RenderHelper$ImageHelper;
    INVOKEVIRTUAL ru/justagod/game/helper/RenderHelper$ImageHelper.toGLTexture ()I
   L16
    ISTORE 11
   L17
    LINENUMBER 82 L17
    ALOAD 0
    INVOKESPECIAL ru/justagod/game/client/resources/SimpleResourceManager.textures ()Lscala/collection/mutable/HashMap;
    NEW scala/Tuple2
    DUP
    ALOAD 1
    ILOAD 11
    INVOKESTATIC scala/runtime/BoxesRunTime.boxToInteger (I)Ljava/lang/Integer;
    INVOKESPECIAL scala/Tuple2.<init> (Ljava/lang/Object;Ljava/lang/Object;)V
    INVOKEVIRTUAL scala/collection/mutable/HashMap.$plus$eq (Lscala/Tuple2;)Lscala/collection/mutable/HashMap;
    POP
   L18
Вродя бы обычный ISTORE ILOAD
 

CumingSoon

Местный стендапер
1,634
12
269
Всё IO без обработки исключений делаешь? Ну удачи там да
Да, Джава сама кидает исключения. Только кода пишу меньше. Алсо, никакой Вася Пупкин не сможет выпилить e.printStackTrace(), чтобы исключения кидалось вхолостую.
 
808
3
124
Я не понял видимо def в котлине значит что то сильно другое, но в байт коде это выглядит так
def в котлине вообще нет, у нас это fun. Я приебался к toGLTexture (тому, что это implicit val, хотя явно должен быть def), зачем ты байткод другого метода кидаешь? Ну или в скалке можно вызывать функции без параметров не юзая (), тогда вопрос уже к скале, а не к тебе
 
1,990
18
105
Да, Джава сама кидает исключения
Каким образом джава сама спасет тебя от выброшенного IOException, который не должен крашить твою программу, а просто оставить инфу в логе и тихо уйти на упокой?
 
808
3
124
Да, Джава сама кидает исключения. Только кода пишу меньше. Алсо, никакой Вася Пупкин не сможет выпилить e.printStackTrace(), чтобы исключения кидалось вхолостую.
И что же делают твои программы, когда пытаются загрузить текстуру, а её нетути? Падают?
 
1,111
47
420
def в котлине вообще нет, у нас это fun. Я приебался к toGLTexture (тому, что это implicit val, хотя явно должен быть def), зачем ты байткод другого метода кидаешь? Ну или в скалке можно вызывать функции без параметров не юзая (), тогда вопрос уже к скале, а не к тебе
Это тот самый метод. И да в скалке можно и без ()
 

CumingSoon

Местный стендапер
1,634
12
269
И что же делают твои программы, когда пытаются загрузить текстуру, а её нетути? Падают?
Проверяют сначала на наличие файла.
Конечно, если нужно оставить инфу, то следует юзать try-catch. Но для e.printStackTrace()... Не надо, Джава и без тебя сделает это. Надеюсь, я выразился непонятно
 

CumingSoon

Местный стендапер
1,634
12
269
Еп, ты не понял.
Я о том, что писать try-catch{printStackTrace()} - бесполезно, ибо Джава и так это делает. Если тебе нужно что-то обработать, то пихай свой код в catch-блок, почему бы нет. Главное его пустым не оставлять, ибо зашквар
 
808
3
124
И да в скалке можно и без ()
Ну если toGlTexture это таки implicit def, то мой доёб переквалифицируется в доеб к отсутствию () у действия, которое занимает дофига и больше времени. Тоже фу ведь
 
808
3
124
Еп, ты не понял.
Я о том, что писать try-catch{printStackTrace()} - бесполезно, ибо Джава и так это делает
Чево блэд? "И так" джава только прокинет исключение дальше, туда, где оно нафиг не нужно. Не спорю что в обработке исключения логично насрать в лог про поврежденную текстуру с ее названием, printStackTrace тут это намек что исключение уместно обработать, а не пропускать дальше.
 
1,111
47
420
Ну если toGlTexture это таки implicit def, то мой доёб переквалифицируется в доеб к отсутствию () у действия, которое занимает дофига и больше времени. Тоже фу ведь
Да ну гспдя в Скале в которой так дофига оверхэда доебыватся за один неявный класс это уже слишком. Или тебя конкретно отсутствие () бесит?
 
Сверху