Как стать автором
Обновить
4
0

Full-stack Software Developer

Отправить сообщение

В том-то и дело, что поскольку интерфейс объявляется и обрабатывается внутри контекста OpenGL, window manager, windows gui, cocoo и что там еще не будет задействован для этого самого GUI. И задача "рендерить заново весь кадр или взять его из кеша и нарисовать курсор поверху" перекладывается либо на разработчика, либо на фреймворк. И теперь только этот самый фреймворк решает, сколько ему понадобится времени, чтобы нарисовать все те же виджеты.

Подозреваю, что основное отличие заключается не в процессе создания объекта на этапе создания проекта, а именно в процессе рендеринга этого самого контрола — в Qt все элементы создаются в момент создания окна (родительского виджета, если угодно), в то время как в ImGUI, насколько я понял, каждый контрол/виджет создается заново каждый кадр.


Но это ровно настолько, насколько я понял из статьи и никоим образом не отражает истинное положение вещей.


Если все же я прав, то это скорее камень в огород ImGUI:


  • если не кешировать созданные контролы/функции-обработчики событий, то чем сложнее GUI, тем более тормознутым будет рендеринг

  • множество вещей менее важных для большинства домашних редакторов игровых уровней, но тем не менее, весьма полезных в некоторых случаях, не получится реализовать на показанном API:

if (ImGui::Button("Update window title")) {
    // этот код выполняется, когда юзер жмёт на кнопку
}

// а вот теперь попробуйте реализовать разные обработчики для OnLeftMouseClick и OnRightMouseClick =)

Вот из статьи это никак не следует

Ну вот на закладке с хаброй запустил — ну выводит себе "А" да и все… А потом подумал, что скорей всего, конкретно твиттер (или любой другой ресурс) попросту может определить свойство в прототипе Object, ну или, на крайняк, переопределить метод escape().


Код запускал в Хроме, если что


UPD: в хроме же, на странице твиттера ничего подобного так же не наблюдаю. Зато заметил любопытный оверрайд методов объекта console:


> for (A in {A:0}) console.log(unescape(escape(A).replace(/u.{8}/g, [])));
undefined

> for (A in {A:0}) console.error(unescape(escape(A).replace(/u.{8}/g, [])));
VM381:1 A

Так ведь конкретно "химики и биологи" — варят кофе для биомассы

Говорят, существует такой сайт, как codepen, только специально для шейдеров

Как-то туториалы на этой неделе больше смахивают на парочку советов, достойных максимум твиттера. В данном случае всю статью можно свести к твитту "Э, народ, зацените тулы для PWA bit.ly/link1 bit.ly/link2"

В последнее время также увлекся обработкой изображений, но с целью экономии времени пишу код на Python. А так как opencv для python очень тесно связан с numpy, то и всяческие операции с изображением (которое по сути является матрицей numpy) много удобнее производить именно в матричном виде. В вашем случае я бы


  1. использовал threshold из opencv (пример могу привести позже, когда не с телефона сидеть буду) для отделения пикселей по значению нужного канала h/s/v и тут же для закрашивания их в какой-то цвет (я бы предпочел черный; почему — см. п.2)


  2. не красил изображение, а сперва сформировал бы dilated/"улучшенную" маску, а потом плпросту наложил бы ее на изображение с помощью бинарных операторов opencv (and в данном случае)

Сейчас забавы ради пишу скрипт, склеивающий стек изображений с разной плоскостью фото (для (супер-)макро нужно), там использую это подход с большим успехом =)

Я надеялся что компилятор сделает это за меня — это ведь настолько очевидная оптимизация!


Поэтому я создал два метода (по сути — добавил "оптимизированную" версию в существующий класс) чтобы это проверить:


public class Chaining {

    private String a1 = "111111111111111111111111";
    private String a2 = "222222222222222222222222";
    private String a3 = "333333333333333333333333";

    public String typicalChaining() {
        return new StringBuilder().append(a1).append(a2).append(a3).toString();
    }

    public String noChaining() {
        StringBuilder sb = new StringBuilder();
        sb.append(a1);
        sb.append(a2);
        sb.append(a3);
        return sb.toString();
    }

    public String concatenationWithExtraVar() {
        String result = a1 + a2 + a3;
        return result;
    }

    public String concatenationWithoutExtraVar() {
        return a1 + a2 + a3;
    }
}

Метод с дополнительной переменной мы уже видели:


  public java.lang.String concatenationWithExtraVar();
    Code:
       0: new           #8                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
       7: aload_0
       8: getfield      #3                  // Field a1:Ljava/lang/String;
      11: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: aload_0
      15: getfield      #5                  // Field a2:Ljava/lang/String;
      18: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: aload_0
      22: getfield      #7                  // Field a3:Ljava/lang/String;
      25: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: invokevirtual #11                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      31: astore_1
      32: aload_1
      33: areturn

А вот когда я увидел байткод метода без дополнительной переменной, я был несколько удивлен:


  public java.lang.String concatenationWithoutExtraVar();
    Code:
       0: new           #8                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
       7: aload_0
       8: getfield      #3                  // Field a1:Ljava/lang/String;
      11: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: aload_0
      15: getfield      #5                  // Field a2:Ljava/lang/String;
      18: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: aload_0
      22: getfield      #7                  // Field a3:Ljava/lang/String;
      25: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: invokevirtual #11                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      31: areturn

Отличие едва заметно — различны только последние три строки, но тем не менее, компилятор Java, похоже, не потрудился сделать это самостоятельно (по умолчанию).


Основываясь на моих небольших похождениях по StackOverflow, компилятор Java не оптимизирует (или очень незначительно оптимизирует) байткод; вместо него это делает JIT.


Поэтому я пошел дальше и сгенерировал ассемблерный выхлоп JIT. Но на его расковыривание уйдет больше времени, чем обеденный перерыв на работе =)

Для любопытных я сгенерировал байткод для указанного сниппета (под заголовком статьи): https://gist.github.com/shybovycha/9431c5b82c826ced439490c100bfb093

А вот мне было бы интересно увидеть, сколько постов написаны, так сказать, "от чистого сердца", то бишь без тега "Блог компании X"

Или можно сделать таблицы с кликальными ссылками =) User experience же!

То, что ссылки в таблицах представлены полным URL и при этом не кликабельны — вызывает несколько меньшее количество удовольствия.

Ловушки ES7 Async/Await

Может, лучше "Подводные камни async/await ES7"?

Насколько я помню, обновлять/устанавливать сам XCode не обязательно — достаточно наличия XCode Command Line Tools. А они, в свою очередь, занимают аж 158 МБ (пруф). Основную массу и у рубей, и у ноды, и у иных составляют именно что зависимости.

Так а о чем статья-то? О методах работы с коллекциями? О монадах? map vs flatMap? Не нашел ни описания что такое функтор, что такое монада… Не хватило чего-то, в общем.

По-моему вы не поняли, что я пытаюсь донести. Высказывание "краткость — сестра таланта" хорошо работает для Твиттера. На блогах вроде Хабра или Медиума, как мне кажется, пользователи хотят видеть статьи, раскрывающие какую-либо тему. Ссылку на репозиторий гитхаба можно уместить и в 140 символов.

Ну так почему бы не не уместить это все в статью?

Судя по комментариям в этом треде, напрашивается мысль "I had 99 problems. Then I used React. Now I have 101 problem."


В чем суть статьи? Показать, как худо-бедно сделать драфт? Или как использовать все вышеперечисленные библиотеки (react-helmet, redux-act, redux-thunk)? Но ведь ничего из этого нету в статье...

Информация

В рейтинге
Не участвует
Откуда
Австралия
Зарегистрирован
Активность