Как стать автором
Обновить
42
0
Александр @Apetrus

Разработчик

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

Потому что текстура черно-белая в формате GL_LUMINANCE

А нет ли плагина, который добавит объектам custom properties, которые экспортировались бы потом в SVG(XML)?
Просто использую Sketch для дизайна игровых уровней и сейчас все кастомные свойства приходится лепить в имя...

У меня пока нет полной статистики, чтобы сравнить с чистым адмобом. Могу сравнить между агрегаторами: Fyber, Appodeal, Heyzap, Adtoapp. Последние два оказались совсем хиленькие. А Fyber и Appodeal примерно на равне.

Они пиарятся за счет конкурсов, в условия которых прячут уловки. Лично мое отношение к ним это подорвало.

Такое вполне допустимо и встречается почти во всех SDK. Например:


  • save/load прогресса на своих серверах
  • сегментация игроков для кастомизации игры (покупающим игрокам показываем один магазин, остальным — другой)
  • проверка in-apps на сервере (при обнаружении взлома имеет смысл обнулить прогресс игрока)
  • A/B тестирование
  • загрузка/обновление конфигов/уровней

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

В следующий раз, пожалуйста указывайте, что в конкурсе могут участвовать только граждане РФ!
Здорово, что это указано в пункте 4.1 в PDF, которую непонятно где вообще смотреть, не подкопаешься.
Но на вашу репутацию это плохо влияет.
p.s.: 1е, 3е и 4е места занимают мои статьи.
Depth test в нашем случае отключен т.к. рендерим плоский квад. Сам discard не так страшен, как if(gradient<=0.0), в который он помещен. Однако после discard у нас еще идут 5-8 вызовов texture2D(), которые в сумме более тяжелые для GPU чем один if(). На глаз это никак не определить, нужны только тесты на девайсах. И именно тесты показали, что в этом шейдере от discard польза таки есть.
Помню вашу игру и статью :) Рескин пошел игре заметно на пользу, поздравляю с выходом на tvOS!
У вас смотрю поверхностное натяжение довольно точно реализовано, здорово выглядит! На счет ценности — у нас из этого игра вышла :)
Кстати вот капельки в динамике

Согласен, discard вообще стоит избегать. Проверял на всевозможных девайсах и именно в этом шейдере на iPad2 без дискарда FPS падал до 40. Все таки после discard идет 5-8 выборок из текстуры (в зависимости от кол-ва материала) и это перевешивало тормоза от бранчинга.

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

Поправил в статье. Однако в шейдере с рамкой один clamp все же нужен, чтобы был цвет рамки/переход/цвет текста.

Код упаковки хороший, спасибо! Плз поправьте меня, если я не верно понял. SDF шрифт мы все равно делаем заранее (в том числе читаем .fnt файлы) и видимо как-то его все таки режем или здоровенной одной текстурой храним? А потом в рантайме, когда нам попадаются новые символы, добавляем их в кеш-текстуру? Или же заранее смотрим какие у нас будут строки и строим кеш-текстуру? А потом точно так же рендерим текст, но уже из кеш-текстуры. Верно?

params.y — это контраст и значение будет около 10-20. Этот результат мы потом умножаем на прозрачность текста. Вот для чего нужен clamp, иначе выставив прозрачность 50% мы ее не получим. Можно заменить на min(1.0, ...).

Ок, прикинем по кол-ву операций и их примерной тяжести:


а) Генерация надписи в FBO и ее последующий вывод без ресайза и контраста.


  • Часто надпись динамическая. Например выводим очки юзеру "Score: 142" и цифры бегут. Каждый фрейм изменять FBO будет явно медленнее. К тому же на этом FBO тоже надо шрифт как-то выводить. Замкнутый круг.
  • Если же шрифт битмапный статический, то ресайз у него занимает ровно столько же времени, сколько и в SDF. Однако хороший статический битмап будет по размеру раза в два больше (считаем что для хорошего качества на retina нам нужен скейл 2х). А вывод бОльшей текстуры однозначно будет медленнее, к тому же тут будет даунскейл в 2 раза, а в SDF текстура будет примерно совпадать.
  • Итак разница только во фрагментном шейдере. Добавили clamp, умножение и сложение. На FPS это никак не повлияло ни на одном из девайсов.

б) Векторный шрифт. Если нам не нужна рамка, то может быть и быстрее будет.


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

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

В любом случае, спасибо за UBFG! Так же хочу порекомендовать вашу утилиту Cheetah-Texture-Packer для запаковки текстурных атласов. Именно на ее основе я добавил в сборщик проекта автогенерацию атласов из папки.

Да, конвертирую в WEBP без потери качества "-lossless -q 100".
Остановился на SDF, потому что альтернативы:
а) генерируют битмап шрифт на лету. А это время, ресурсы, зачем? И все равно для хорошего качества атлас должен быть здоровый. Да и бордюров нет.
б) рендерят векторный шрифт. Тут у меня много вопросов к скорости. И опять так бордюры :)
За stb спасибо! Смотрю у них много других полезных библиотек есть.

Взял последнюю доступную версию для мака 1.1. Вот сравнение:



Видно, что в UBFG радиус размытия больше. И это может быть хорошо, если нужна широкая рамка. Но для ровных краев не подходит. Конечно можно скейлить в 8 раз и в UBFG. Но сделать SDF в UBGF для шрифта размером 400pt занимает очень много времени! ImageMagick пока что лидер по скорости и качеству создания SDF.


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

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

Информация

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