• Архитектура приложения или как испортить карму на Хабре

    Можно много говорить об архитектуре приложения, SOLID, принципах ООП, о таких архитектурных патернов как слоистая или луковая и д.р. шаблоны проектирования. В течение своего опыта я понял одно сколько людей столько и мнений. Когда ты начинающий программист у тебя много амбиций, чуть растешь в квалификации у тебя ощущение что ты все знаешь, и все что сделано до тебя «плохо», и ты обязательно сделаешь лучше… Но годы идут и набранный опыт говорит об обратном. Под катом я попытаюсь кратко, и главное простыми словами, рассказать вам о том как хорошую архитектуру. Как минимум расширяемую и поддерживаемую, за подробностями прошу под кат…
    Читать дальше →
  • 13 самых заминусованных статей минувшего года

      Учиться лучше на чужих ошибках и мысленно благодарить тех, кто такую возможность предоставляет. Под катом несколько типичных примеров того, чего не стоит делать на Хабре. И что делать в случае, если сливают.


      Читать дальше →
    • Почему трава зеленая, а программисты крутые



        Я люблю находить на новостных ресурсах статьи о том, что программисты получают очень много денег. Я сразу пролистываю их до комментариев и с теплом в душе читаю гневные отзывы о том, что программисты ничего не делают и не заслуживают таких денег. Но после прочтения возникает мысль: знают ли они, кто такие программисты? Или они исходят в своих суждениях из неверного знания, даже не подозревая об этом. Например, мало кто знает, почему трава зеленая. Подумайте об этом. Следует ли из ваших объяснений зелености травы именно зеленый цвет?
        Читать дальше →
      • Unreal Engine 4 — шейдер горения

        • Translation
        • Tutorial
        Это небольшой шейдер, который появился, когда я думал о различных методах применения flowmap. Существуют много эффектов перехода/растворения, но большинство из них выглядит довольно статично, так как они используют статические текстуры. Данный шейдер далек от совершенства, но плавное движение делает его визуально привлекательным как плавный эффект горения.

        Сам шейдер чрезвычайно прост, ниже я опишу процесс его создания. Как и с большинством моих шейдеров, я обернул его в функцию материала, чтобы его можно было использовать с любыми существующими материалами.
        Читать дальше →
      • Форсаж: ускорение работы Forza Horizon 4 благодаря шейдерам окон

        • Translation
        image

        Гарет Харвуд — технический арт-директор Playground Games

        Действие Forza Horizon 4 происходит в прекрасной Британии, заполненной мгновенно узнаваемыми местами и достопримечательностями, в том числе и моделью города Эдинбурга в версии Playground Games.

        В большинстве игр с открытым миром особое внимание нужно уделять скорости потоковой передачи данных, иForza Horizon 4 с её детализированным и пёстрым городом не стала исключением. Для отрисовки зданий Эдинбурга необходимы были новые возможности сборки ресурсов, рендеринга, а также функционал движка, позволяющий загружать модели при движении со скоростью 300 миль в час.
        Читать дальше →
      • Написание шейдеров в Unity. GrabPass, PerRendererData

        Привет! Я хотел бы поделиться опытом написания шейдеров в Unity. Начнем с шейдера искажения пространства (Displacement/Refraction) в 2D, рассмотрим функционал, используемый для его написания (GrabPass, PerRendererData), а также уделим внимание проблемам, которые обязательно возникнут.

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


        Читать дальше →
        • +53
        • 14.6k
        • 8
      • Может ли существовать тороидальная планета?

        • Translation
        image

        После публикации моей статьи о том, какой была бы Земля, будь она в два раза больше, у читателей появился вопрос: «А что насчёт тороидальной Земли»? Вопрос не самый оригинальный, эту тему уже обсуждали в онлайне и проводили её моделирование. Но я люблю всё делать сам, так что я попытался провести свой собственный анализ.

        Может ли существовать тороидальная планета?


        Стабильность тороидальной планеты неочевидна. С практической точки зрения планеты можно рассматривать как жидкие шарики без поверхностного натяжения – прочность камня не сравнить с весом планеты. Они обладают эквипотенциальными гравитационными поверхностями с учётом центробежного потенциала. Если бы это было не так, то на них встречались бы места, которые могли бы уменьшить свою энергию перетеканием в сторону понижения потенциала. Ещё один очевидный факт – существование верхней границы скорости вращения, после которой планета развалится: центробежная сила на экваторе превышает гравитацию и материал улетает в космос.
        Читать дальше →
      • Охота на кремлевского демона

          image


          Нельзя сказать, что я не искал с этим демоном встречи. Я дождался пока он вылезет и выследил его логово. Поиграл с ним немного. Потом демон исчез, как обычно, по расписанию — в 9.00. Я успокоился и занялся своими бытовыми делами.


          Дело было в том, что у нас в Питере не найти в книжных магазинах рабочую тетрадь по английскому языку "Планета знаний" 3 класс. Ну как в Союзе было, дефицит. И мне жена дала задание — зайти в книжные в Москве. Дескать, в столице все есть, тетки на форуме оттуда заказывают, платят 500 рублей за доставку, а ты, пользуясь случаем, купишь сам и сэкономишь для семьи. Хоть какой-то толк от неудачника будет. Я включаю Гугль-карту, задаю фразу "книжные магазины" и не понимаю. Ни Красной площади, ни реки, какие-то непонятные улицы.


          Черт! Он вылез опять! Я ведь еще успел только до Варварки дойти.


          И, повинуясь зову природы, я расчехлил опять свое оружье.

          Читать дальше →
        • Новые скафандры для новых кораблей

            На прошедшей неделе в Инстаграм Илона Маска появилась фотография нового скафандра SpaceX для пилотируемой версии корабля Dragon. По плану, новые корабли Boeing CST-100 и Dragon v2 полетят в следующем году, логично, что сейчас нам начали показывать скафандры. В чем полетят астронавты недалекого будущего?

            Читать дальше →
          • «Java-разработчики не осознают проблему с профайлерами»: Андрей Паньгин и Нитсан Вакарт о Java-профилировании



              Легко подумать, что от профилирования не стоит ожидать больших новостей: поскольку разработчики профилируют уже десятилетиями, до чего там можно было ещё не додуматься? Но в Java-профилировании кроются серьёзные подводные камни вроде safepoint bias, и появляются новые инструменты для решения подобных проблем.

              Андрей apangin Паньгин (Одноклассники) недавно создал один из таких инструментов: на конференции JPoint в апреле он представил опенсорсный проект async-profiler, которому safepoint bias не страшен. Другой эксперт в этой теме — Нитсан Вакарт: о той же проблеме с safepoints многие узнали благодаря его блог-посту «Why (Most) Sampling Java Profilers Are Fucking Terrible».

              Мы решили поговорить с ними обоими сразу, начав разговор с последних новостей об async-profiler, а позже перейдя к состоянию Java-профилирования в целом.
              Читать дальше →
            • Как мы суслика яблоками кормили или эффективный backend на Go для iOS


                Как и обещал, рассказываю о том, как мы мигрировали свой бэкенд на Go и смогли уменьшить объем бизнес логики на клиенте более, чем на треть.


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


                Читать дальше →
              • 11 вещей которые я узнал, читая спецификацию flexbox

                • Translation

                Я всегда считал, что с flexbox довольно легко работать — глоток свежего воздуха после стольких лет float'ов и clearfix'ов.


                Правда недавно я обнаружил что борюсь с ним; что-то растягивалось, когда я не думал, что оно должно тянуться. Я поправил здесь, другой элемент сжался. Я починил это, что-то другое ушло за экран. Какого Джорджа Буша тут происходит?


                В конце концов, все заработало, но солнце село, а мой процесс был привычной игрой с CSS. Или… как называется та игра, где надо ударить крота, а затем другой крот выпрыгивает и надо ударить и его тоже?


                Как бы там ни было, я решил что пора вести себя как взрослый разработчик и выучить flexbox должным образом. Но вместо того, чтобы прочитать 10 очередных блог-постов, я решил отправиться прямиком к исходнику и прочитать The CSS Flexible Box Layout Module Level 1 Spec


                Вот хорошие отрывки.


                Читать дальше →
              • Алгоритм Order-Independent Transparency c использованием связных списков на Direct3D 11 и OpenGL 4

                  imageРеализацию порядко-независимой прозрачности (order-independent transparency, OIT), наверное, можно считать классической задачей программирования компьютерной графики. По сути, алгоритмы OIT решают одну простую прикладную задачу – как нарисовать набор полупрозрачных объектов так, чтобы не беспокоиться о порядке их рисования. Правила смешивания цветов при рендеринге требуют он нас, чтобы полупрозрачные объекты рисовались в порядке от дальнего к ближнему, однако этого сложно добиться в случае протяженных объектов или объектов сложной формы. Реализация одного из самых современных алгоритмов, OIT с использованием связных списков, была представлена AMD для Direct3D 11 еще в 2010 году. Скажу откровенно, производительность алгоритма на широко доступных графических картах тех лет не произвела на меня должного впечатления. Прошло 4 года, я откопал презентацию AMD и решил реализовать алгоритм не только на Direct3D 11, но и на OpenGL 4.3. Тех, кому интересно, что получилось из этой затеи, прошу под кат.
                  Читать дальше →
                • Неожиданная встреча. Глава 8

                    Лекс очнулся и открыл глаза. Его взору предстал всё тот же невесёлый ангар. Недалеко стоял его корабль с открытым люком и выдвинутой аппарелью. Лекс осторожно сел. Голова болела, но он уже не чувствовал слабости в теле, как в своё прошлое пробуждение.

                    «Что-то изменилось», — подумал Лекс. Он покрутил головой. «Точно – стула нет! — отметил он изменения в обстановке. — А вместе с ним исчез и хранитель – может они как-то связаны друг с другом?» Пришедшая в голову мысль настолько развеселила его, что он рассмеялся в пустоту ангара. Искажённое и пугающее эхо заставило его замолчать. Лекс попробовал подняться и у него это легко получилось. Он покрутил головой, но никаких изменений в обстановке ангара больше не заметил.


                    Читать дальше...
                  • Связь между монетизацией игр и поведением геймеров

                    • Translation
                    Недавно я детально изучил отчёт GameAnalytics, содержащий некоторую статистику различного поведения геймеров. Анализируя, можно понять кое-что существенное в этих играх.

                    Помимо большой группы неплатящих геймеров, игроки в этом отчёте подразделяются на 3 типа: «пескари» (игроки «по случаю») (minnows (lowcore)), «дельфины» (регулярные игроки) (dolphins (midcore)) и «киты» (геймеры-фанаты) (whales (hardcore)).

                    Неплатящие игроки стремятся попробовать, как правило, больше различных игр, чем «дельфины» и «киты». «Дельфины» и «киты» являются более сосредоточенными и используют небольшое количество игр или даже всего лишь одну игру. Определение группы игроков дано в отчёте GameAnalytics.


                    Удержание различных игроков (источник: GameAnalytics, 2016)
                    Читать дальше →
                    • +17
                    • 15.9k
                    • 5
                  • Unity: как мы создавали генератор домов для AssetStore или возвращение к хрущёвкам



                    Поводом для написания данной статьи послужила эта публикация про "хрущёвки", в которой была поднята интересная для меня тема программной генерации мешей в Unity.

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

                    Автор не претендует на абсолютное знание предметной области, я лишь хочу рассказать своими словами решение некоторых задач, которые появлялись при создании ассета.
                    Читать дальше →
                  • Чем полезен мономорфизм?

                    • Translation


                    Выступления и посты в блогах о производительности JavaScript часто обращают внимание на важность мономорфного кода, однако обычно не дается внятного никакого объяснения, что такое мономорфизм/полиморфизм и почему это имеет значение. Даже мои собственные выступления зачастую сводятся к дихотомии в стиле Невероятного Халка: «ОДИН ТИП ХОРОШО! ДВА ТИП ПЛОХО!». Неудивительно, что когда люди обращаются ко мне за советом по производительности, чаще всего они просят объяснить, что на самом деле такое мономорфизм, откуда берется полиморфизм и что в нем плохого.

                    Ситуацию осложняет еще и то, что само слово «полиморфизм» имеет множество значений. В классическом объектно-ориентированном программировании полиморфизм связан с созданием дочерних классов, в которых можно переопределить поведение базового класса. Программисты, работающие с Haskell, вместо этого подумают о параметрическом полиморфизме. Однако полиморфизм, о котором предупреждают в докладах о производительности JavaScript – это полиморфизм вызовов функции.

                    Я объяснял этот механизм столькими различными путями, что наконец-то собрался и написал данную статью: теперь можно будет не импровизировать, а просто дать на нее ссылку.

                    Я также попробовал новый способ объяснять вещи – изображая взаимодействие составных частей виртуальной машины в виде коротких комиксов. Кроме того, данная статья не покрывает некоторые детали, которые я посчитал незначительными, излишними или не связанными напрямую.
                    Читать дальше →
                  • Пишем сериализатор для сетевой игры на C++11

                      Написать этот пост меня вдохновила замечательная статья в блоге Gaffer on Games «Reading and Writing Packets» и неуёмная тяга автоматизировать всё и вся (особенно написание кода на C++!).

                      Начнём с постановки задачи. Мы пишем сетевую игру (и сразу MMORPG, конечно же!), и независимо от архитектуры у нас возникает необходимость постоянно посылать и получать данные по сети. У нас, скорее всего, возникнет необходимость посылать несколько разных типов пакетов (действия игроков, обновления игрового мира, просто-напросто аутентификация, в конце концов!), и для каждого у нас должна быть функция чтения и функция записи. Казалось бы, не вопрос сесть и написать спокойно эти две функции и не нервничать, однако у нас сразу же возникает ряд проблем.

                      • Выбор формата. Если бы мы писали простенькую игру на JavaScript, нас бы устроил JSON или любой его самописный родственник. Но мы пишем серьёзную многопользовательскую игру, требовательную к трафику; мы не можем позволить себе отправлять ~16 байт на float вместо четырёх. Значит, нам нужен «сырой» двоичный формат. Однако, двоичные данные усложняют отладку; было бы здорово, если бы мы могли менять формат в любой момент, не переписывая целиком все наши функции чтения/записи.
                      • Проблемы безопасности. Первое правило сетевой игры: не доверяй данным, присланным клиентом! Функция чтения должна уметь оборваться в любой момент и вернуть false, если что-то пошло не так. При этом использовать исключения считается неважной идеей, поскольку они слишком медленные. Мамкин хакер пусть и не сломает ваш сервер, но вполне может ощутимо замедлить его беспрерывными эксепшнами. Но вручную писать код, состоящий из if'ов и return'ов, неприятно и неэстетично.
                      • Повторяющийся код. Функции чтения и записи похожи, да не совсем. Необходимость изменить структуру пакета приводит к необходимости поменять две функции, что рано или поздно приведёт к тому, что вы забудете поменять одну из них или поменяете их по-разному, что приведёт к трудно отлавливаемым багам. Как справедливо замечает Gaffer on Games, it is really bloody annoying to maintain separate read and write functions.

                      Всех интересующихся тем, как Бендер выполнил своё обещание и при этом решил обозначенные проблемы, прошу под кат.
                      Читать дальше →
                    • Мультиплеер в быстрых играх (части I, II)



                      1. Части I, II (синглплеер с авторитарным сервером)
                      2. Часть III (Появление врага)
                      3. Часть IV (Хэдшот!)


                      Предлагаю вашему вниманию перевод статьи Fast-Paced Multiplayer (Part I): Introduction.

                      Разработка игры — само по себе непростое занятие. Но мультиплеерные игры создают совершенно новые проблемы, требующие разрешения. Забавно, что у наших проблем всего две причины: человеческая натура и законы физики. Законы физики привнесут проблемы из области теории относительности, а человеческая натура не даст нам доверять сообщениям с клиента.
                      Читать дальше →