Pull to refresh
0
0
Владимир Савин @WowaBBS

User

Send message

Пост-эффекты в мобильных играх

Reading time8 min
Views27K


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

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

Помимо того, что пост-эффекты (точнее — их не очень грамотное использование) являются предметом ненависти среди игроков, они также едва ли не единственный способ быстро и дешево «оживить» и «освежить» картинку. Насколько качественным получится это «оживление» и не обернется ли оно в результате «свежеванием», зависит по большей части от художников.
Читать дальше →

Исключения в Windows x64. Как это работает. Часть 4

Reading time25 min
Views8K
Опираясь на материал, описанный в первой, второй и третьей частях данной статьи, мы продолжим обсуждение темы обработки исключений в Windows x64.

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

Свои потоки ввода-вывода в C++ с помощью std::streambuf

Reading time16 min
Views87K
В статье на примерах объясняется, как реализовать поддержку потокового ввода-вывода из стандартной библиотеки (<iostream>) для своих классов.

В тексте статьи будет часто встречаться слово «поток», что означает именно поток ввода-вывода ((i/o)stream), но не поток выполнения (thread). Потоки выполнения в статье не рассматриваются.


Введение


Потоки из стандартной библиотеки — мощный инструмент. Аргументом функции можно указать поток, и это обеспечивает ее универсальность: она может работать как со стандартными файлами (fstream) и консолью (cin/cout), так и с сокетами и COM-портами, если найти соответствующую библиотеку.

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

Нейросеть генерирует движения персонажа видеоигры в реальном времени

Reading time4 min
Views37K
image

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

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

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

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

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

Исследователи из Эдинбургского университета разработали новую систему обучения, называемую фазово-функциональной нейронной сетью (PFNN), которая использует машинное обучение для анимации персонажей в видеоиграх и других приложениях.

Что нового в работе с исключениями в C++11

Reading time8 min
Views43K
В интернете довольно много говорят о новых возможностях C++11: auto, lambda, variadic templates. Но как-то обошли стороной новые возможности работы с исключениями, которые предоставляет язык и стандартная библиотека.

От предыдущей версии стандарта остался механизм генерации исключений (throw), проверка того, что мы находимся в процессе обработки исключения (std::uncaught_exception), механизм остановки, если исключение не было обработано. Также есть иерархия стандартных исключений на базе класса std::exception.

Новый стандарт добавляет к этим вещам еще несколько сущностей, которые, на мой взгляд, могут существенно упростить работу с исключениями в C++.

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

Бинарная сегментация изображений методом фиксации уровня (Level set method)

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

В этой статье я кратко рассмотрю понятие метода фиксации уровня и неявно заданных динамических поверхностей (level set method). Также рассмотрю роль этого метода в бинарной сегментации с введением и определением математических конструкций, таких как SDT (Signed Distance Transforms), маркированной карты расстояний.

Слева — исходное изображение, справа — сегментированное
Читать далее...

Android Architecture Components. Часть 1. Введение

Reading time7 min
Views71K
image

На Google I/O 2017, было представлено набор библиотек под названием Android Architecture Components. В нескольких словах — это ряд вспомогательных библиотек, которые призваны помочь с такими вещами как, проектирование, тестирование и сопровождение приложений. То, что команда разработки Android начала акцентировать внимание на архитектуре не может не радовать, поскольку проблема является действительно актуальной. Ведь изначально не было предоставлено никаких требований или гайдлайнов по проектированию, и разработчику приходилось отталкиваться от своего предыдущего опыта. Что, в свою очередь, вызывало сложности в сопровождении проекта, а также сомнительные решения для специфических для ОС ситуаций. По факту это не первые шаги в этом направлении. Ранее уже Google представил репозиторий android-architecture с примерами применения разных архитектурных концептов. Надеемся, что развитие будет дальше и может на следующем Google I/O мы сможем увидеть полноценный фреймворк.
Читать дальше →

Цветовая сегментация для чайников

Reading time3 min
Views37K
Это статья рассчитана на новичков, которые только начинают осваивать методы обработки изображений. Сама я часто сталкиваюсь с отсутствием легких примеров, особенно на русском языке, поэтому надеюсь данный материал окажется полезным.

Как-то встала передо мной следующая задача. У меня было много фотографий болгарских перцев и необходимо было отделить растение от фона. На примере этой задачи я покажу один из самых примитивных способов как это можно сделать при помощи openCV 2.4.

Суть задачи: закрасить белым все что не является растением.


Исходная фотография (слева) и то что должно получиться (справа).
Читать дальше →

Введение в процедурную анимацию: инверсная кинематика

Reading time16 min
Views34K

Часть 4. Введение в градиентный спуск


Эта часть представляет собой теоретическое введение в инверсную кинематику и содержит программное решение, основанное на градиентном спуске (gradient descent). Эта статья не будет всеобъемлющим руководством по этой теме, это всего лишь общее введение. В следующей части мы покажем настоящую реализацию этого алгоритма на C# в Unity.

Серия состоит из следующих частей (части 1-3 представлены в предыдущем посте):

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

nstd — C++ библиотека — «джентельменский набор» полезных классов

Reading time4 min
Views12K

Всегда хотел иметь под рукой определённый «джентельменский набор» библиотечных классов, с малой зависимостью, которые можно легко совмещать с другими библиотеками и фреймворками и легко переносить в другие проекты. Как говориться — включил и забыл. И самое главное — «не плати за то, что не используешь» (С) С++

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

Постквантовая реинкарнация алгоритма Диффи-Хеллмана: прошлое и настоящее

Reading time11 min
Views16K

Как известно, последняя революция в криптографии случилась в 1976 году из-за статьи “New Directions in Cryptography” американских ученых Уитфилда Диффи (Whitfield Diffie) и Мартина Хеллмана (Martin Hellman).

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

Сглаживание изображений фильтром анизотропной диффузии Перона и Малика

Reading time9 min
Views21K
Фильтр анизотропной диффузии Перона и Малика — это сглаживающий цифровые изображения фильтр, ключевая особенность которого состоит в том, что при сглаживании он сохраняет и «усиливает» границы областей на изображении.

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


Крайнее левое изображение — оригинальное, справа от оригинального — фильтрованные с различными параметрами.
Читать дальше →

LSTM – сети долгой краткосрочной памяти

Reading time8 min
Views258K

Рекуррентные нейронные сети


Люди не начинают думать с чистого листа каждую секунду. Читая этот пост, вы понимаете каждое слово, основываясь на понимании предыдущего слова. Мы не выбрасываем из головы все и не начинаем думать с нуля. Наши мысли обладают постоянством.

Традиционные нейронные сети не обладают этим свойством, и в этом их главный недостаток. Представим, например, что мы хотим классифицировать события, происходящие в фильме. Непонятно, как традиционная нейронная сеть могла бы использовать рассуждения о предыдущих событиях фильма, чтобы получить информацию о последующих.

Решить эту проблемы помогают рекуррентые нейронные сети (Recurrent Neural Networks, RNN). Это сети, содержащие обратные связи и позволяющие сохранять информацию.
Читать дальше →

«Магическая константа» 0x5f3759df

Reading time9 min
Views127K
В этой статье мы поговорим о «магической» константе 0x5f3759df, лежащей в основе элегантного алгоритмического трюка для быстрого вычисления обратного квадратного корня.

Вот полная реализация этого алгоритма:

float FastInvSqrt(float x) {
  float xhalf = 0.5f * x;
  int i = *(int*)&x;  // представим биты float в виде целого числа
  i = 0x5f3759df - (i >> 1);  // какого черта здесь происходит ?
  x = *(float*)&i;
  x = x*(1.5f-(xhalf*x*x));
  return x;
}

Этот код вычисляет некоторое (достаточно неплохое) приближение для формулы

image

Сегодня данная реализация уже хорошо известна, и стала она такой после появления в коде игры Quake III Arena в 2005 году. Её создание когда-то приписывали Джону Кармаку, но выяснилось, что корни уходят намного дальше – к Ardent Computer, где в середине 80-ых её написал Грег Уолш. Конкретно та версия кода, которая показана выше (с забавными комментариями), действительно из кода Quake.
В этой статье мы попробуем разобраться с данным хаком, математически вывести эту самую константу и попробовать обобщить данный метод для вычисления произвольных степеней от -1 до 1.

Да, понадобится немного математики, но школьного курса будет более, чем достаточно.
Читать дальше →

Описание алгоритмов сортировки и сравнение их производительности

Reading time24 min
Views718K

Вступление


На эту тему написано уже немало статей. Однако я еще не видел статьи, в которой сравниваются все основные сортировки на большом числе тестов разного типа и размера. Кроме того, далеко не везде выложены реализации и описание набора тестов. Это приводит к тому, что могут возникнуть сомнения в правильности исследования. Однако цель моей работы состоит не только в том, чтобы определить, какие сортировки работают быстрее всего (в целом это и так известно). В первую очередь мне было интересно исследовать алгоритмы, оптимизировать их, чтобы они работали как можно быстрее. Работая над этим, мне удалось придумать эффективную формулу для сортировки Шелла.

Во многом статья посвящена тому, как написать все алгоритмы и протестировать их. Если говорить о самом программировании, то иногда могут возникнуть совершенно неожиданные трудности (во многом благодаря оптимизатору C++). Однако не менее трудно решить, какие именно тесты и в каких количествах нужно сделать. Коды всех алгоритмов, которые выложены в данной статье, написаны мной. Доступны и результаты запусков на всех тестах. Единственное, что я не могу показать — это сами тесты, поскольку они весят почти 140 ГБ. При малейшем подозрении я проверял и код, соответствующий тесту, и сам тест. Надеюсь, что статья Вам понравится.
Читать дальше →

Перехватываем запуск любого приложения в Windows и пытаемся ничего не сломать

Reading time14 min
Views54K

Если вы много занимаетесь отладкой приложений под Windows — вы, возможно, слышали о таком замечательном механизме, как Image File Execution Options (IFEO). Одна из предоставляемых им возможностей позволяет отлаживать приложение в условиях, более приближенных к боевым. Записав в нужное место в реестре специальный ключик, мы можем вместо программы автоматически запускать её отладчик, позволяя ему делать свои отладочные дела. Однако кто сказал, что этот механизм (фактически — перехвата запуска чего угодно) можно использовать только в подобных целях? Эта статья вовсе не об использовании вещей по назначению.


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

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

Введение в октодеревья

Reading time31 min
Views40K


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

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

Как я боролся с комарами. Личный опыт и тесты на себе

Reading time8 min
Views295K

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


Самодельные домашние батареи на 30-100 кВтч делают из аккумуляторов выброшенных ноутбуков

Reading time3 min
Views123K


В мае 2015 года Илон Маск представил красивые домашние блоки Powerwall, чтобы хранить энергию от солнечных батарей с крыши — и снабжать бесплатным электричеством весь дом днём и ночью. Даже при отсутствии солнечных батарей такое резервное питание для дома особенно ценно, если в квартале отключили электричество. Компьютер и вся техника продолжат спокойно работать.

Вторая версия Powerwall хранит до 13,5 кВтч, чего должно хватить на несколько часов (стандартная мощность 5 кВт, а в пике 7 кВт). Проблема лишь в том, что оригинальная версия от Tesla стоит аж $5500 (плюс $700 за сопутствующее оборудование, итого $6200, плюс работы по установке стоят от $800 до $2000) — очень дорого. DIY-мейкеры решили эту проблему с помощью бэушных батареек, которые лежат бесплатно в выброшенных ноутбуках.

Своими руками можно собрать блок с лучшими характеристиками, чем у Tesla (например, на 30-100 кВтч) — и намного дешевле.
Читать дальше →

Искусственный интеллект помогает ученикам обманывать учителя

Reading time7 min
Views36K
image

Дэниз Гарсия [Denise Garcia] знает, что иногда её ученики обманывают её, но вскрытая ею в феврале ситуация оказалась совершенно необычной. Гарсия, учительница математики в Вест-Хартфорде, Коннектикут, случайно включила нетипично сложное уравнение в набор задач для своего класса, изучающего математику по институтской программе. Однако каким-то образом несколько человек из класса, где занимаются 15 учеников, сумели правильно решить его. Эти ученики продемонстрировали свои работы с решением уравнения, опровергнув обычную схему разоблачения списывания.

Гарсия была сбита с толку, но затем она вспомнила один разговор, происходивший за несколько лет до того. Некоторые из бывших учеников рассказали ей про онлайн-инструмент Wolfram|Alpha, способный за несколько секунд расправляться со сложными уравнениями. Он даёт как ответы, так и последовательные шаги для достижения ответов, поэтому обманщиков никак нельзя было отловить на копировании результата в домашнюю работу.
Читать дальше →

Information

Rating
Does not participate
Location
Самара, Самарская обл., Россия
Date of birth
Registered
Activity