Как стать автором
Поиск
Написать публикацию
Обновить
0
0
Светлов Александр @Mehalich

Пользователь

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

Работа с освещением в Unity — теория и практика

Время на прочтение13 мин
Количество просмотров188K
В видеоиграх красивое освещение в реальном времени сильно бьёт по производительности, что особенно заметно на мобильных устройствах. Таким образом, разработчики вынуждены искать методы обхода этой проблемы. Lightmapping — технология, сохраняющая информацию об освещении в текстуру, что позволяет высвободить вычислительные ресурсы под другие нужды.
В этой статье я познакомлю читателя с теорией освещения в играх, опишу процесс создания “лайтмапа” в Unity 5 и поделюсь рядом советов.
image
Читать дальше →

Создание нативного iOS плагина для Unity3d. Недокументированные возможности

Время на прочтение6 мин
Количество просмотров8.7K
В Unity3d существует возможность подключения нативных плагинов к приложению. На официальном сайте Unity3d есть документация по взаимодействию с нативным кодом на iOS. Данная документация ограничивается описанием того, как вызвать ту или иную функцию из плагина, который вы собрали сами и как сделать обратный вызов. В документации описано каким правилам должна соответствовать описываемая функция и немного о том, как передать в нее параметры. В конце статьи с документацией есть ссылка, по которой можно скачать пример под названием Bonjour.

К сожалению в документации не описано, что делать в случае если вашему плагину необходимо перехватить событие о том, что пользователь подписался на Push Notification или приложение перешло в бэкграунд (AppDidEnterBackgound), тогда как доступ к этим событием бывает необходим для некоторых плагинов, которые вы возможно захотите написать.
Читать дальше →

DI в сложных приложениях. Как не утонуть в зависимостях

Время на прочтение5 мин
Количество просмотров10K
Всем привет.

При конструировании приложений хорошим тоном является использование Dependency Injection(внедрение зависимостей). Данный подход позволяет делать код слабо связанным, а это в свою очередь обеспечивает легкость сопровождения. Также облегчается тестирование и код становится красивым, универсальным и заменяемым. При разработке наших продуктов с самого начала использовался этот принцип: и в высоконагруженной DSP и в корпоративном Hybrid. Мы писали модули, подключали интеграцию с различными системами, количество зависимостей росло и в какой-то момент стало сложно поддерживать само конфигурирование приложения. Плюс к этому добавлялись неявные регистрации(например, кастомный DependencyResolver для Web Api задавался в настройках Web Api) и начали возникать сложности с порядком вызова модулей конфигурации. В конце концов мы выработали подход для регистрации, конфигурации и инициализации модулей в сложном приложении. О нём и расскажу.

image
Читать дальше →

Трансформации AST — Первый шаг к тяжёлым веществам

Время на прочтение7 мин
Количество просмотров20K
А давайте сделаем magic с вашим Java кодом. Вот такой:


Берем это:
import groovy.transform.Canonical
import groovy.transform.TupleConstructor

@Canonical
@TupleConstructor
class Person {
    int id
    String firstName
    String lastName
    Date birthdate
}

Компилируем, и в байткоде получаем аналог вот этого:
Адский бойлерплейт на Джаве на 100 с лишним строк
import java.util.Date;
import java.util.Map;

public class Person {
    private int id;
    private String firstName;
    private String lastName;
    private Date birthdate;

    //Эта штука добавлена @TupleConstructor-ом
    public Person(Map parameters){
        this.id = (int) parameters.get("id");
        this.firstName = (String) parameters.get("firstName");
        this.lastName = (String) parameters.get("lastName");
        this.birthdate = (Date) parameters.get("birthdate");
    }

    public Person(int id, String firstName, String lastName, Date birthdate) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthdate =birthdate;
    }

    public Person(int id, String firstName, String lastName) {
        this(id, firstName, lastName, null);
    }

    public Person(int id, String firstName) {
        this(id, firstName, null, null);
    }

    public Person(int id) {
        this(id, null, null, null);
    }

    public Person() {
        this(0, null, null, null);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (id != person.id) return false;
        if (birthdate != null ? !birthdate.equals(person.birthdate) : person.birthdate != null) return false;
        if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) return false;
        if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (firstName != null ? firstName.hashCode() : 0);
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        result = 31 * result + (birthdate != null ? birthdate.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", birthdate=" + birthdate +
                '}';
    }

    public int getId() {
        return this.id;
    }

    public void setId(int paramInt) {
        this.id = paramInt;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String paramString) {
        this.firstName = paramString;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String paramString) {
        this.lastName = paramString;
    }

    public Date getBirthdate() {
        return this.birthdate;
    }

    public void setBirthdate(Date paramDate) {
        this.birthdate = paramDate;
    }
}



Ну, как-бы да, приятно. Но ничего уникального, вот-же есть Lombok, не говоря уже о способности любого хорошего IDE сначала генерить, а потом прятать всесь этот бойлерплейт.

Так зачем именно Groovy, почему AST transformations?
В этой статье я попробую вкраце обосновать, зачем пользоваться Groovy AST transformations в Java проектах, и (опять-же вкраце) рассказать какие AST transfromations есть в Groovy сегодня. Если вы уже знаете зачем, и хотите только «как и что», смело листайте к «Введение в AST transformations».
Читать почему и как AST transformations

Как компьютер сам свой код улучшал, или программируем процесс программирования

Время на прочтение9 мин
Количество просмотров34K
На носу было придумывание темы для диплома, на кафедре популярностью пользовались различные варианты идей связанных с генетическими алгоритмами, а мне самому хотелось сделать что-нибудь этакое. Так и родилась идея, давшая начало данному проекту, а именно генетическому оптимизатору программного кода.



Цель была довольно амбициозной — в идеале сделать такую штуку, которой на вход подается программа, а дальше она ее крутит так и сяк и пытается всячески ускорить отдельные ее фрагменты без участия человека, попутно собирая себе базу для последующих оптимизаций. Сразу скажу что хотя в целом задача была решена, практической пользы я из нее извлечь не смог. Однако некоторые полученные в процессе результаты показались мне достаточно интересными чтобы ими поделиться.

Например вот такая забавная оптимизация набора арифметических инструкций (взятых из какой-то подвернувшейся под руку математической библиотеки), соответствующих формулам: , которая на 6 джаве с выключенным JIT у меня давала около 10% ускорения, при этом на первый взгляд даже не очевидно что эти формулы эквивалентны (ОТКУДА ТУТ OR? ЭТО ВООБЩЕ ЗАКОННО?!), хотя это так. Под катом я расскажу, как именно получались такие результаты и каким образом компьютер придумывал лучший код чем тот, который мог написать я сам.
Читать дальше →

Использование Global Illumination в собственных шейдерах в Unity 5

Время на прочтение9 мин
Количество просмотров16K
image
Привет, Хабр! Unity 5 предоставляет нам из коробки систему глобального освещения (Global Illumination, GI), которая позволяет в реальном времени получать действительно очень приятную картинку, что разработчики продемонстрировали в своем нашумевшем ролике The Blacksmith. Наряду с системой глобального освещения универсальный материал Standard перевел в разряд устаревших все прежние материалы. Несмотря на крутость стандартного материала (а он, ни много ни мало, основан на физической модели), я задался вопросом, а можно ли подключить систему глобального освещения к собственному поверхностному шейдеру. Что из этого получилось, а также с чем мне пришлось столкнуться в процессе, читайте под катом.
Читать дальше →

Пишем простую* игровую физику самолёта

Время на прочтение9 мин
Количество просмотров29K
* — в трёх измерениях.


Предупреждение: дальнейшие рассуждения вполне могут быть ошибочными, мой опыт ограничивается игрой в авиасимуляторы и курсом теоретической механики. Знания в аэродинамике и игровых физических движках весьма скудные. Картинка для привлечения внимания — фотография, а не скриншот.

«Что может быть проще самолёта? Подъёмная сила пропорциональна квадрату скорости, двигатель тянет вперёд, всё просто» — такая мысль пришла в мою голову летом, и я сел писать игру. Лето прошло, было собрано несколько граблей, а списочек того, что я планировал добавить в проект, очень сильно вырос.

В данной статье я попробую написать именно о физической составляющей, не отвлекаясь на графику и прочие штуки. Надеюсь, кому-то это поможет — в интернете не очень много информации на эту тему.

Читать дальше →

Редактор Urho3D (часть 2)

Время на прочтение8 мин
Количество просмотров11K
Продолжаем постигать редактор Urho3D. В этом уроке мы научимся работать с физикой, познакомимся с префабами, освоим редактор частиц и заставим нашу пушку стрелять. А также, в качестве бонуса, научимся упаковывать ресурсы игры.
Читать дальше →

Редактор Urho3D (часть 1)

Время на прочтение5 мин
Количество просмотров18K
Продолжаем разбираться с движком Urho3D. На этот раз я хочу остановиться на редакторе. Он достаточно прост в использовании, но некоторые моменты определенно требуют пояснений, а официальная документация их не раскрывает. Ну и заодно напишем небольшую игрушку. Приступим.


Читать дальше →

Создание искусственного интеллекта для игр — от проектирования до оптимизации

Время на прочтение32 мин
Количество просмотров143K

Сегодня – первое сентября. А значит, многие читатели хабры начинают прохождение нового уровня одной древней известной игры – той самой, в которой требуется прокачать интеллект, и, в итоге, получить магический артефакт – аттестат или диплом, подтверждающий ваше образование. К этому дню мы сделали реферативный перевод статьи про реализацию искусственного интеллекта (ИИ) для игр – от его проектирования до оптимизации производительности. Надеемся, что она будет полезна как начинающим, так и продвинутым разработчикам игр.
Читать дальше →

Пишем настоящий шум Перлина

Время на прочтение7 мин
Количество просмотров77K
По поисковому запросу шум перлина сразу попадается этот перевод на Хабре. Как справедливо заметили в комментариях к публикации, речь идёт вовсе не о шуме Перлина. Возможно, автор перевода и сам был не в курсе.

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

Обычный шум (из той самой статьи):
image

Шум Перлина:
image

И увеличением количества октав первую картинку ко второй никак не приблизишь. Я не буду описывать достоинства шума Перлина и область его применения (потому что статья о программировании, а не о применении), а постараюсь объяснить как он реализован. Думаю, это будет полезно многим программистам, ведь хакерские исходники Кена Перлина мало объясняют даже при наличии комментариев.
Читать дальше →

Основы Urho3D

Время на прочтение6 мин
Количество просмотров50K
С удивлением обнаружил, что на Хабре отсутствует информация о таком замечательном движке как Urho3D. Поэтому спешу исправить это досадное упущение. В этой вводной статье я постараюсь заострить внимание на тех вещах, которые пригодятся новичкам сразу же, но в тоже время не буду залезать в глубокие дебри, чтобы сходу не перегрузить большим объемом информации.

image

Что это за зверь?


Не будет преувеличением сказать, что Urho3D по возможностям сопоставим с Unity3D и работать с ним так же легко. При этом он бесплатен без каких-либо оговорок (лицензия MIT), доступен для многих платформ (Windows, Linux, Mac OS X, Android, iOS, Raspberry Pi, HTML5), невероятно быстр и легковесен. Позволяет писать игры на AngelScript (синтаксис похож на C#), LUA и C++. Если вы заинтересовались, то добро пожаловать под кат.
Читать дальше →

Выбираем фотоаппарат: ситуация на рынке и почему нет смысла покупать мыльницу или зеркалку

Время на прочтение6 мин
Количество просмотров114K
Несколько лет назад одним из самых популярных фотохостингов мира был Flickr. Люди выкладывали тысячи снимком в секунду, что позволяло сервису вести очень и очень интересную статистику. Так, к примеру, было ясно, что большинство обладателей «зеркалок» обожают фирму Canon. Или что многие любили снимать на идущие в комплекте (так называемые китовые) объективы и не заморачивались со сменой оптики. Так было, повторюсь, еще буквально три-четыре года назад.

А знаете, какой производитель камер сейчас самый популярный? Я вас удивлю – фирмы Apple, фотоаппараты iPhone 6, 5S и так далее. Знаете какой фотопроизводитель второй по популярности? Samsung Galaxy. Если вы сейчас скептически хмыкните, я удивлю вас еще раз. Вот эти две фотографии сняты на iPhone 6. И если они плохи, то, пожалуйста, бросьте в меня камень.

Читать дальше →

Атмосферное рассеяние в ролике The Blacksmith

Время на прочтение4 мин
Количество просмотров25K
Еще на стадии планирования The Blacksmith мы отказались от встроенных в Unity режимов тумана в пользу более гибкого и комплексного решения. Чтобы передать глубину и масштаб крупных сценических шотов, нам было нужно максимально реалистичное атмосферное рассеяние.


Читать дальше →

Философия программирования 7 — практицизм

Время на прочтение6 мин
Количество просмотров4.8K
Программный практицизм.

В данной работе я пытаюсь ввести в оборот понятие «программный практицизм», и дать ему более-менее формальное определение, но в то-же время простым читаемым языком.
Читать дальше →

Удачная модель ветвления для Git

Время на прочтение10 мин
Количество просмотров1M
Перевод статьи Vincent Driessen: A successful Git branching model

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



В качестве инструмента управления версиями всего исходного кода она использует Git.

Читать дальше →

Модель ветвления и управления модулями git для большого проекта

Время на прочтение9 мин
Количество просмотров37K
Без малого два года назад мы начали использовать в разработке нашего флагманского проекта СУБД ЛИНТЕР новую модель ветвления и управления подмодулями git-а. Десятки тысяч коммитов, сделанные за это время группой разработчиков, позволяют с определенной долей уверенности считать нововведения успешными. Эта статья — краткий обзор принципов организации хранилища исходных кодов в большом проекте на базе альтернативной реализации модулей git, сложившейся стратегии ветвления и инструментария linflow.


Читать дальше →

Взрывной GameDev. История создания моей игры

Время на прочтение8 мин
Количество просмотров35K
Вот, наконец, дошли руки присоединиться к армии разработчиков под мобильные платформы и написать сюда статью о том, как в эту тему попал я. Сразу напишу, что для написания игры был выбран движок Unity3d, чтобы люди понимали, что я собрался описывать.

Об идее


Самая интересная часть истории заключается в том, что первоначальная идея абсолютно не совпала с итоговой реализацией. Почему? Да все просто. Сначала у меня была идея создания головоломки с использованием машины Тьюринга.
Читать дальше →

MMORPG без лишних деталей: Open Source

Время на прочтение2 мин
Количество просмотров25K


Как говорится: «обещанного три года ждут». Примерно столько лет назад мы начали разработку своей «оригинальной» браузерки. О ней мы уже рассказывали: MMORPG без лишних деталей, как рассказывали и о наших скромных успехах год спустя.

При этом мельком упоминалось, что код игры постепенно открывается. И вот наконец настал тот момент, когда мы открыли его полностью: github.com/Tiendil/the-tale под BSD лицензией. А это значит, что вы вот прямо сейчас можете начать пилить свою собственную браузерку с… ну с чем захотите.

Разработчики игр, будущие владельцы браузерок и просто любопытствующие приглашаются под кат.
Читать дальше →

Beat-chart – лучший друг гейм-дизайнера

Время на прочтение3 мин
Количество просмотров37K
Всем привет!

Я гейм-дизайнер и в данный момент вместе с небольшой командой занимаюсь разработкой двумерной адвенчуры на Unity3D. Цель этой публикации – рассказать о процессе дизайна локаций для нашей игры и приемах, которые я использую.
Ну и параллельно показать вам все стадии развития локации – от схемы до финальной версии.


Забегая немного вперед – так выглядит кусочек уже готовой локации в действии.
Читать дальше →

Информация

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