Как стать автором
Обновить
134
15.1
Искандер @quasilyte

https://www.quasilyte.dev/ebiten/ru/

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

Делаем RPG на Go: часть 0.5

Уровень сложности Средний
Время на прочтение 14 мин
Количество просмотров 3.7K

В предыдущей статье мы начали знакомство с Ebitengine.


В этой части структура игры будет доработана и переведена на сцены.


Читать дальше →
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 3

Делаем RPG на Go: часть 0

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 12K

Один из самых частых вопросов в нашем сообществе разработке игр на Go — это с чего начать.


В этой серии статей мы будем изучать движок Ebitengine и создадим RPG в процессе.


Читать дальше →
Всего голосов 38: ↑37 и ↓1 +36
Комментарии 8

Самый быстрый поиск пути на Go без аллокаций и СМС

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

Алгоритмы важны. Но реализовать их можно очень по-разному.


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


Любите оптимизации, специализированные структуры данных и трюки с битами? Тогда скорее под кат!


Читать дальше →
Всего голосов 39: ↑38 и ↓1 +37
Комментарии 33

Битва за производительность: SparseMap vs GenerationsMap

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 5K

Есть такая занимательная структура данных, описанная в статье Russ Cox — sparse map.


Она используется, например, в недрах компилятора Go. А ещё в некоторых пакетах его стандартной библиотеки.


У неё есть много интересных свойств и, чем больше я о ней думаю, тем больше применений нахожу в своих задачах. Казалось бы, всё так хорошо, что лучше быть просто не может. Однако сегодня я расскажу вам о секретной штуке, которая будет экономить ещё больше бесценных наносекунд!


Читать дальше →
Всего голосов 33: ↑32 и ↓1 +31
Комментарии 8

Разработка игр на Go: шейдеры

Уровень сложности Средний
Время на прочтение 14 мин
Количество просмотров 8K

Давненько я не писал никаких статей на Хабре.


Я планировал вести серию заметок о разработке игр на Go и начал я с рендеринга текста, но меня не хватило даже на второй текст. Что же, настало время возвращаться, ведь с того момента я успел создать ещё несколько игрушек.


Сегодня я расскажу вам о шейдерах в Ebitengine. Большая часть примеров будет взята из Roboden и Decipherism (обе игры имеют открытые исходные коды и вы можете найти их на гитхабе).


Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 5

Улучшенный benchstat для оптимизирующих гоферов

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

Привет!


Если вы писали бенчмарки и пытались понять, что там ускорилось и на сколько, то наверняка вы пользовались утилитами вроде benchstat.


Мне очень нравится эта утилита, но временами я понимаю, что некоторые её особенности работают против меня. Сегодня я расскажу вам о своей обёртке над benchstat, которая добавляет улучшения, полезные в моей работе.


Читать дальше →
Всего голосов 8: ↑7 и ↓1 +6
Комментарии 0

Текстовые шаблонизаторы и их реализация

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

Многие из нас пользовались шаблонизаторами текстов. Twig в PHP, text/template в Go, Jinja в Python — их сотни.


Но задумывались ли вы, как они устроены внутри? Какие вообще есть способы исполнить шаблон со сложными конструкциями? В этой статье разбираются возможные оптимизации и проблемы, которые могут возникнуть в той или иной реализации, а также то, как на наши решения может влиять язык программирования, на котором мы создаём этот шаблонизатор.


Наиболее детально рассмотрим KTemplate, который я написал для KPHP (на PHP он тоже работает без проблем).


Читать дальше →
Всего голосов 46: ↑46 и ↓0 +46
Комментарии 7

Встраиваем Lua в PHP через FFI

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

Foreign Function Interface — это перспективная альтернатива для традиционных PHP-расширений.


Сегодня мы будем разбирать FFI-библиотеку для работы с liblua5 из PHP, которая позволит исполнять скрипты на Lua из нашего приложения.


Читать дальше →
Всего голосов 43: ↑42 и ↓1 +41
Комментарии 11

Go ebiten: разбираемся с рендерингом и позиционированием текста

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

Перед вами первая заметка на тему разработки игр на Go с использованием библиотеки ebiten (также известный как Ebitengine).


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


Читать дальше →
Всего голосов 16: ↑15 и ↓1 +14
Комментарии 18

Используем SQLite в KPHP и PHP через FFI

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


Сегодня я расскажу о новой библиотеке, которая позволяет использовать SQLite сразу из PHP и KPHP.


Создавать FFI пакеты — не просто. Под катом будут ответы на следующие вопросы:


  • Как упростить установку и сделать библиотеку кроссплатформенной?
  • Как не допустить утечек ресурсов?
  • Как сделать библиотеку совместимой с KPHP и PHP?
  • Какова производительность FFI решений?

Мы не только попробуем новую библиотеку в действии, но и выработаем ряд практик, которые при широком распространении могут улучшить ситуацию с FFI пакетами в сообществе.

Читать дальше →
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 1

Анализируем bound checks в Go по CPU профилю

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

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


Читать дальше →
Всего голосов 26: ↑23 и ↓3 +20
Комментарии 0

Ускоряем hugo на 20% простым изменением в пакете reflect

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

Найти значительное узкое место в производительности стандартной библиотеки или зрелого приложения — это редкость.


Я был удивлён, когда в top10 списке CPU-профиля hugo при сборке digitalgov.gov на первой позиции находился метод reflect.Type.MethodByName().


      flat  flat%   sum%        cum   cum%
     8.84s  6.28%  6.28%     57.85s 41.10%  reflect.(*rtype).MethodByName
     7.93s  5.63% 11.92%      8.50s  6.04%  reflect.name.readVarint
     7.56s  5.37% 17.29%    111.79s 79.43%  reflect.Value.call
     7.53s  5.35% 22.64%     23.33s 16.58%  runtime.mallocgc
     7.29s  5.18% 27.82%     16.10s 11.44%  reflect.name.name

В этой статье я расскажу вам о том, как так вышло и что с этим можно было бы сделать.

Читать дальше →
Всего голосов 28: ↑27 и ↓1 +26
Комментарии 11

profile-guided поиск по коду

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

Если объединить структурный поиск по коду через gogrep и фильтрацию результатов через perf-heatmap, то мы получим profile-guided поиск по коду.


Данная комбинация позволяет находить все совпадения по шаблону поиска, а затем показывает только те результаты, что лежат на "горячем" пути исполнения.


Через perf-heatmap также можно аннотировать файл с учётом того, насколько строка исходного кода "горячая".


Читать дальше →
Всего голосов 20: ↑18 и ↓2 +16
Комментарии 0

gocorpus: открытый корпус Go кода, поддерживающий запросы

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

На днях я запустил wasm-приложение, которое позволяет запускать gogrep шаблоны на относительно крупном корпусе Go кода (~11 миллионов строк кода).


В этой заметке я напишу как этим пользоваться и зачем оно вообще может быть нужно.


Звёздочки нести сюда Исходный код можно найти здесь.


Читать дальше →
Всего голосов 33: ↑32 и ↓1 +31
Комментарии 4

Создаём игру на KPHP с помощью FFI и SDL

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

KPHP теперь поддерживает механизм Foreign Function Interface (FFI). Мы с Владом решили продемонстрировать его возможности и за сутки написали первую в мире графическую игру на KPHP.


Игру делали с использованием библиотеки SDL:


  • работали со звуком,
  • обрабатывали события клавиатуры,
  • рисовали шрифты, спрайты, UI.

API и семантика нашего FFI идентичны PHP. Поэтому созданная игра запустится и на KPHP, и на PHP.


Если вам интересны детали реализации, заглядывайте под кат!


Читать дальше →
Всего голосов 49: ↑45 и ↓4 +41
Комментарии 9

Заметки KPHP: тестирование и бенчмарки

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

Перед вами первая статья из серии "Как использовать KPHP в open source?"


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


В сегодняшнем выпуске:


  • Базовое использование composer с KPHP
  • Как писать и запускать unit-тесты для KPHP
  • Бенчмаркинг KPHP-кода (профилирование мы затронем в другой раз)
  • Как правильно сравнивать результаты бенчмарков
Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 4

Релиз ruleguard v0.3.0

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

Релиз ruleguard v0.3.0


А что, если я скажу вам, что линтеры для Go можно создавать вот таким декларативным способом?


func alwaysTrue(m dsl.Matcher) {
    m.Match(`strings.Count($_, $_) >= 0`).Report(`always evaluates to true`)
    m.Match(`bytes.Count($_, $_) >= 0`).Report(`always evaluates to true`)
}

func replaceAll() {
    m.Match(`strings.Replace($s, $d, $w, $n)`).
        Where(m["n"].Value.Int() <= 0).
        Suggest(`strings.ReplaceAll($s, $d, $w)`)
}

Год назад я уже рассказывал об утилите ruleguard. Сегодня хотелось бы поделиться тем, что нового появилось за это время.


Основные нововведения:



Читать дальше →
Всего голосов 16: ↑15 и ↓1 +14
Комментарии 0

Статический анализ: baseline файлы vs diff

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

В статических анализаторах рано или поздно приходится решать задачу упрощения интеграции в существующие проекты, где поправить все предупреждения на legacy коде невозможно.


Эта статья — не помощник по внедрению. Мы будем говорить о технических деталях: как такие механизмы подавления предупреждений реализуются, какие у разных способов плюсы и минусы.


Читать дальше →
Всего голосов 22: ↑22 и ↓0 +22
Комментарии 3

gogrep: структурный поиск и замена Go кода

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

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


В этой заметке я расскажу как использовать gogrep, а также о VS Code расширении для более удобной работы с gogrep прямо из редактора.


Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 2

Парсеры Пратта для чайников

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

Рекурсивный спуск работает идеально, когда вы можете принимать решение относительно разбираемого куска кода с помощью текущего контекста и токена.


Картину портят выражения: постфиксные, инфиксные и прочие. Проблема: вы не можете понять, какого типа выражение вы обрабатываете до тех пор, пока не разберёте его первую половину. Зачастую для вас также важны приоритет операции и её ассоциативность, чтобы построенное AST имело правильную структуру.


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


Читать дальше →
Всего голосов 18: ↑16 и ↓2 +14
Комментарии 14
1

Информация

В рейтинге
356-й
Откуда
Грузия
Зарегистрирован
Активность