Pull to refresh
7
0
Игорь Михайлов @igormich88

Прoгрaммиcт

Send message

Я пытаюсь делать комикс с помощью Midjourney (у SD меня не устраивает качество и менее понятная лицензия в общем случае).

https://acomics.ru/~two2one

Так как у возможностей для обучения Lora или DreamBoothу Midjourney нет, то приходится плясать с бубном. Для повышения стабильности персонажей я обычно использую.

  • Имена актеров

  • Варьирование картинки с удачной внешностью чтобы использовать на соседних кадрах, особенно если сцена довольно статичная.

  • Запрос со ссылкой на картинку с удачной генерацией (насколько я понимаю при этом строится не текстовый запрос, а вектор признаков картинки). Я бы сказал что этот способ немного на похож Embedding в SD.

  • Режим Vary(Region) - аналог Inpaint в SD, для деталей одежды или перерисовки лиц (получается хуже), при это сочетаю разные версии Midjourney - так как генерация лучше у 6 версии, а стиль рисовки мне больше нравится у 5 (ну или я не понял как добиться такого стиля от 6 версии).

  • Простой коллаж - фон с одной генерации, а персонажи с другой.

  • Ручная правка деталей - удаление лишних украшений, татуировок, копирование характерных деталей одежды.

PS так же для того чтобы было проще различать персонажей использую разный цвет волос и цвет одежды.

Конкретно в этом примере размер "номерка" совпадает с размером "чемодана".

По моему если дать объединенной аннотации хорошее имя, то это будет более читабельно чем разбирать столбик из десятка аннотаций, но тут надо рассматривать конкретные примеры кода. Например пример из статьи с AuthRequired выглядит достаточно убедительно.
PS Спринг по моему в принципе про написание аннотаций вместо кода.

Я правильно понимаю статья про скорее про Spring, а не про чистую Java?

Примерно из таких соображений в Котлине к коллекциям прикрутили метод расширение isNotEmpty в дополнение к стандартному isEmpty, чтобы вероятность ошибиться была меньше.

Чтобы получить строку для которой выполняется s.isEmpty() && !s.equals(""), достаточно этого:

breakIt(" ").trim();

Это происходит из за того что метод trim не меняет поле coder для UTF16-строк, что логично, так как он удаляет из начала и конца строки символы с кодом меньше или равным коду пробела (20) не трогая остальные и таким образом не может повлиять на компактность строки.
PS насколько я понял большинство других методов работы со строками (если не все) делают дополнительные проверки и могут изменить coder.

Выложил оптимизированный код на Котлине, который работает быстрее чем вызов кода на C++
Главное изменение это вынос объекта Complex за тело цикла и его повторное использование.
https://github.com/igormich/JNIvsKotlin/blob//app/src/main/java/ru/tusur/nativevskotlin1/model2/MandelbrotOptimized.kt
Результаты на POCO M3 Pro (без прогрева, значения плавают, но порядок величин сохраняется)

  • Kotlin - 17681ms

  • Оптимизированный Kotlin - 1085ms

  • C++ - 1708ms

PS: PullRequest сделал, интересно как код поведёт себя на других конфигурациях.

А как анализатор узнаёт что возвращаемое значение является "важным"? В нем прописаны такие функции для стандартной библиотеки?

В таком случае в случае использования нестандартной пользовательской функции clamp предупреждения бы не было?

Возник такой вопрос можно ли передать лямбду параметром native метода и есть ли в этом смысл (в первую очередь в плане производительности)?

Возможно не совсем по теме, но вот пример довольно интерересной оптимизации: https://habr.com/ru/post/305894/

По моему идея для игры неплохая (сам думал о такой посмотрев тематические каналы на ютубе), но это будет уже не сталкер.

Ну если PERFORMANCE_MODE поставить в 1, то ситуация резко улучшается, а артефактов появляется не так много. Думаю если поиграться с параметрами руками (а тем более с кодом) можно попробовать найти приемлемый баланс для своей задачи.
PS GTX 1660 — 15 фпс на 800х450, это прямо benchmark получается))
А что вы скажете про Half-life 1? Там конечно можно ходить в вагончике, но и длится не 5 секунд, а около 5 минут.
В дальнобойщиках 2, насколько я могу судить, для сильно отстающих противников вообще не рассчитывалась физика и их координата просто менялась вдоль трассы что бы догнать игрока.
PS залог победы проезд на красный прямо перед точкой назначения (не повторяйте в реальной жизни).
Andrey2008, было бы интересно узнать результаты проверки этого кода PVS-Studio))
Но наверное, публиковать результаты проверки утекшего кода опасно с точки зрения закона.А жаль.
Как раз нашёл статью где сравниваются два подхода — instanceOf и enum, с instanceOf медленнее, хоть и красивее. habr.com/ru/post/430014
По моему идея прятать не очень красивые, но более эффективные решения в глубины кода в целом неплохая. А то если совсем не заглядывать под капот, то можно получить проблемы с производительностью (но тут речь скорее про библиотеки, а не прикладные программы)

Ну из за особенностей синтаксиса я не мог написать на котлине точно так же как на Scala. Со сложными случаями выглядит интересно, спасибо почитаю.
Насколько я понимаю конструкция
_ match {
  case Circle(x, y, radius) => println(s"$x, $y, $radius")
  case Rectangle(x0, y0, x1, y1) => println(s"$x0, $y0, $x1, $y1")
}
внутри содержит instanceof (посмотрел декомпилированный код). А я как раз хотел показать пример где instanceof не используется и компилятор нуждается в подсказке.
Код на котлине эквивалентеый вашему коду на Scala
when(figure){
   is Circle -> with(figure) { println("$x $y $radius") }
   is Rectangle -> with(figure) { println("$x0 $y0 $x1 $x1") }
}
С одной стороны когда допилят компилятор такие штуки станут не особо нужны. Но с другой стороны мы можем проверять тип неявно, но при этом быть уверены что тип будет именно тот который нам нужен. Например мы добавляем всем потомкам поле type, по которому можем узнать класс. (Я не уверен насколько оправдано такое решение, но вроде бы оно может быть быстрее чем «x is A»)
код
enum class FigureType {
    CIRCLE, RECTANGLE
}

sealed class Figure {
    internal abstract val type: FigureType
}

class Circle(val x: Int, val y: Int, val radius: Int) : Figure() {
    override val type = FigureType.CIRCLE

}

class Rectangle(val x0: Int, val y0: Int, val x1: Int, val y1: Int) : Figure() {
    override val type = FigureType.RECTANGLE
}

@ExperimentalContracts
fun Figure.isCircle(): Boolean {
    contract {
        returns(true) implies (this@isCircle is Circle)
    }
    return type == FigureType.CIRCLE
}

@ExperimentalContracts
fun Figure.isRectangle(): Boolean {
    contract {
        returns(true) implies (this@isRectangle is Rectangle)
    }
    return type == FigureType.RECTANGLE
}

@ExperimentalContracts
fun test(figure: Figure) {
    when {
        figure.isCircle() -> {
            println(figure.x)
            println(figure.y)
            println(figure.radius)
        }
        figure.isRectangle()-> {
            println(figure.x0)
            println(figure.y0)
            println(figure.x1)
            println(figure.y1)
        }
    }
}

Само по себе не сработает, но для этого в Kotlin есть специальная штука — контракты (тут важно заметить что компилятор не проверяет гарантии и можно всё сломать). И я не уверен, но у них вроде бы еще экспериментальный статус (как раз потому что можно всё сломать ими).
fun isNotEmptyString(obj: Any):Boolean {
    contract {
        returns(true) implies (obj is String)
    }
    return (obj is String) && obj.isNotEmpty()
//return (obj is Int) && obj > 0 //still valid with contract 
}

Тут подробнее

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity