Интересная новость: согласно годовому отчету Codecov по анализу покрытия OpenSource-кода, D стал резко популярнее. За 2020 год использование языка возросло в 2.18 раз, он находится на третьем месте по динамике роста, уступая Objective-C и Groovy.

Интересная новость: согласно годовому отчету Codecov по анализу покрытия OpenSource-кода, D стал резко популярнее. За 2020 год использование языка возросло в 2.18 раз, он находится на третьем месте по динамике роста, уступая Objective-C и Groovy.
Одно из моих хобби — 3D-моделирование. С 2018 года я создаю модели для продажи на стоковых площадках. Я делаю это не столько ради дохода, сколько ради изучения рынка: веду статистику продаж, осваиваю маркетинг, работу с клиентами и инструментами аналитики. Стоки вообще являются отличным способ попробовать себя в микробизнесе, не уходя с основной работы и практически ничем не рискуя (кроме, разве что, своим свободным временем). А рынок 3D-моделей, как мне кажется, более привлекателен, чем те же фотографии или векторные иллюстрации — здесь не такие высокие комиссии, меньше формальных требований к качеству и заметно более низкая конкуренция, поэтому начать что-то продавать можно с первых же шагов.
Может показаться, что продажа файлов — это пассивный доход, но это не совсем так. Да, популярный продукт может продаваться много раз, однако у любой модели есть некая нефиксированная «продолжительность жизни», если можно так выразиться: технологии не стоят на месте, из года в год стандарты компьютерной графики повышаются, и старые модели постепенно теряют востребованность. Например, появление физически обоснованного рендеринга (PBR) в real-time графике полностью изменило стоковый рынок: PBR-модели с реалистичными материалами имеют несопоставимое преимущество перед моделями предыдущего поколения. К тому же, чем старше модель, тем глубже она появляется в поисковой выдаче. Необходимо постоянно следить за рынком и создавать новые конкурентоспособные продукты — на это будет уходить много времени и сил, поэтому, если моделирование не является вашей основной деятельностью, и вы относитесь к роялти как к пассивному доходу, то на регулярные продажи рассчитывать не стоит.
Также я понял, что стоки — это не место для чистого творчества. Конечно, вы можете моделировать все, что приходит вам в голову, и любая качественная творческая работа обязательно получит свою порцию лайков и положительных комментов. Но хорошо продаются, в первую очередь, самые обыкновенные, даже скучные вещи: мебель, предметы быта, техника, архитектура — словом, все, что вы видите вокруг себя каждый день. Причина тому простая: покупателями стоковых моделей являются дизайнерские фирмы, которым нужно быстрее выполнять их проекты. Модели, которые они у вас покупают, становятся частью разнообразных производных работ: это дизайн интерьеров, рекламные ролики, иллюстрации для сайтов и изданий, окружение в компьютерных играх и т.д. Задайтесь вопросом, нужен ли ваш уникальный персонаж в рекламном буклете какого-нибудь автосалона? Уникальный контент дизайнерские конторы делают всегда сами, а покупают они все остальное, чтобы сэкономить на них трудозатраты и сосредоточиться на более важных составляющих проекта.
Несомненный плюс стоков — вы можете работать с несколькими маркетплейсами одновременно, выкладывать везде одни и те же продукты. По моему опыту, самая большая клиентская база на сегодняшний день у двух магазинов — CGTrader и TurboSquid. Серьезное преимущество CGTrader — высокий процент роялти, который к тому же повышается в зависимости от набранных вами баллов и достигнутого уровня репутации. Всего есть 13 уровней, а роялти повышается от 70% до 80%. CGTrader награждает авторов качественного и популярного контента: баллы набираются за продажи и лайки ваших моделей, а также за позитивные отклики покупателей и активность на форуме. У TurboSquid базовый процент роялти — 40%. Эта цифра повышается до 60% в зависимости от вашей суммарной прибыли, но только для эксклюзивных партнеров. CGTrader не требует эксклюзивности.
Бесценная фича CGTrader — доступ к аналитике: при достижении определенного уровня репутации можно увидеть самые популярные поисковые запросы, сравнить свои цены со средними по рынку и т.д. CGTrader вычисляет конверсию ваших продуктов — отношение числа покупателей к числу просмотров: зная, какие из ваших продуктов обладают высокой конверсией, вы можете в дальнейшем создавать более востребованные модели. Также всем моделям присваивается рейтинг от 0 до 10 (его видите только вы), зависящий от формальных критериев качества: количества форматов модели, наличия превью-изображений и подробного описания. Этот рейтинг не всегда коррелирует с объемом продаж, но он помогает сравнивать продукты в целях их улучшения.
Еще один полезный показатель — ликвидность категории. Далеко не все категории моделей одинаково хорошо продаются в любое время и в любом месте — это зависит от площадки, ее аудитории и даже от времени года. Существуют столь «замусоренные» конкуренцией категории, что в них лучше вообще не соваться. К сожалению, разобраться в этом с нуля практически невозможно, понимание приходит только с опытом. Рекомендую выкладывать только то, что у вас хорошо получается, и отслеживать, что из этого наиболее востребовано.
Пара слов о том, как сделать из модели продающийся продукт. Хорошая модель состоит из треугольников и сделана так, что ее легко передавать между программами без потери информации. Модель должна иметь масштаб «не от балды» — то есть, единичное расстояние в системе координат вершин должно соответствовать какой-то стандартной единице (метр, сантиметр и т.д.), и модель должна быть изготовлена в соответствующем масштабе. Я рекомендую соответствие единицы метру как наиболее универсальный вариант.
Отдельный вопрос — в каких форматах выкладывать модель. Какого-то единого стандартного формата, к сожалению, до сих пор нет. Самыми основными считаются OBJ, 3DS, FBX, MAX, STL, DAE. Я считаю, что в обязательном порядке нужно предоставлять модель в собственном формате программы, в которой она сделана. Обменные же форматы зависят от назначения модели. Например, если это игровой ассет, то не лишним будут варианты в виде Unity-пакета и glTF. Модели для 3D-печати — это, безусловно, STL. Такие устаревшие форматы, как 3DS и OBJ, не сохраняют определенные виды информации — например, скелет, развесовку, данные о материалах и т.д. Тем не менее, они популярны, и прилагать их тоже нужно, но они не должны быть единственными. В целом, чем больше выбор форматов, тем лучше для покупателя.
Необходимо стремиться к тому, чтобы модель выглядела одинаково в разных программных средах, поэтому не стоит полагаться на специфические возможности вашего рендер-движка и создавать сложные хитроумные материалы. Вместо этого лучше делать PBR-текстуры (albedo, roughness, metallic) и стандартные карты нормалей в пространстве касательных. Я рекомендую использовать текстуры в разрешении степеней двойки (512, 1024, 2048), так как они лучше всего подходят для игровых движков. Наиболее оптимальное разрешение текстур под PBR — 2048х2048. Текстур не должно быть слишком много, лучше объединять их в атласы. В идеале модель должна иметь всего один атлас — в противном случае могут быть сложности с импортом.
Конечно, на стоках вы много не заработаете, если только уже не являетесь профи с многолетним стажем и известностью в 3D-сообществе. Серьезно зарабатывают, как правило, на регулярных индивидуальных заказах. Но ваш профиль в маркетплейсе даст вам невероятное конкурентное преимущество. Заказчик охотнее пойдет к тому, чью работу можно оценить и пощупать — продукт, имеющий реальный спрос, значительно круче, чем просто картинки в портфолио. Кроме того, вы получаете опыт работы с рынком и представление о том, что нужно потребителю — переоценить это тоже сложно.
Близится конец года, и это значит, что наступило время для традиционного подведения итогов по проектам.
Ну и, конечно, не могу не назвать самые значимые для меня события в мире CG, СПО и геймдева:
После полутора лет разработки вышла новая версия игрового движка Dagon. Релиз примечателен серьезным рефакторингом большинства компонентов, в первую очередь — системы рендеринга. Устранена сцепленность кода, теперь рендеринг логически отделен от остальной части движка, стало возможно написать свой собственный конвейер и подключить его к приложению. Улучшена производительность многих эффектов и шейдеров.
Из прочих крупных изменений отмечу следующие:
В грядущем Dagon 0.11 будет поддерживаться дополнительный метод тональной компрессии схожий по результату с тем, что используется в Blender 2.8 (Filmic View Transform). Ниже — сравнение рендеров Eevee в Blender 2.82 и Dagon на примере сцены со шлемом из коллекции примеров glTF. Моя картинка чуть более контрастна, но зато нет «передержаных» бликов.
Я переношу все свои личные проекты на домен timurgafarov.ru, так что блог отныне будет доступен как https://gamedev.timurgafarov.ru/. Старый адрес в ближайшем будущем сохранится, но будет перенаправлять на новый.
Наконец-то у dlib появилась онлайн-документация, генерируемая из исходников при помощи Dub: https://gecko0307.github.io/dlib/docs/dlib.html
Пока, разумеется, подробно задокументированы далеко не все модули, к большинству функций и классов есть только краткое описание — но я надеюсь, то, что есть, уже может кому-то пригодиться. Документирующие pull request’ы приветствуются (dlib использует синтаксис ddoc).
Mozilla туда же. На приветственной странице с предложением установить Facebook Container и Firefox Monitor в очередной раз слово «хакер» используется в негативной коннотации:
Не ожидал такого от компании, которая разрабатывает СПО. Запомните уже: хакер — это компьютерщик-эксперт, относящийся к программированию как к искусству, умеющий и любящий решать нетривиальные задачи. Прекратите называть хакерами киберпреступников! Это выдает в говорящем дилетанта и филистера. Взломщик — это крэкер (cracker), вор паролей — фишер (phisher), создатель вирусов — вирусописатель (virus writer), а тот, кто практикует социальную инженерию — просто мошенник.
Глагол «hack», вопреки массовому пониманию (и даже определениям в некоторых словарях), не означает «взламывать». Изначально этим словом обозначалось внесение в код быстрого исправления с целью обойти некую проблему без серьезных архитектурных изменений. Отсюда «хак» — ловкое решение, обходной прием, фокус.
Понятно, что неодобрительный смысл слова сложился исторически — некоторые хакеры дискредитировали себя, и многие продолжают делать это до сих пор — но это не значит, что следует поддерживать это недоразумение. Отождествлять компьютерных экспертов и компьютерных злоумышленников — некорректно и оскорбительно. Слово до сих пор активно используется самими хакерами в первоначальном его смысле, поэтому, пожалуйста, используйте слово «хакер» согласно определениям Jargon File. Некорректное определение тоже упомянуто, но выделено как таковое.
Если этого недостаточно, то привожу цитату из статьи Эрика Реймонда «Как стать хакером»:
«Существует сообщество, некая общая культура, состоящая из опытных программистов и сетевых чародеев, история которой прослеживается вплоть до первых миникомпьютеров с разделением времени и самых ранних экспериментов с сетью ARPAnet. Члены этой культуры и дали рождение термину «хакер». Хакеры создали Интернет. Хакеры сделали операционную систему Unix тем, чем она является сегодня. Хакеры поддерживают Usenet. Хакеры обеспечивают работу WWW. […]
Также есть и другая группа людей, громко именующих себя хакерами, но не являющихся таковыми. Это те люди (преимущественно молодые люди мужского пола), которым достается за взлом компьютерных и телефонных систем. Настоящие хакеры называют таких людей «крэкерами» и не хотят иметь с ними ничего общего. Настоящие хакеры в большинстве своем считают крэкеров ленивыми, безответственными и не особо умными людьми. То, что человек способен взломать систему безопасности, не делает его хакером, точно так же как умение угонять тачки не делает вас автомобильным мастером. К несчастью, многие журналисты и писатели введены в заблуждение и используют слово «хакер» для описания крэкеров, и это бесконечно раздражает настоящих хакеров. […]
Главное различие в следующем: хакеры создают, а крэкеры ломают».
Выложил новую статью на Medium — «Const-correctness in D», посвященную особенностям квалификаторов const, immutable и inout. Будет полезна тем, кто хочет писать на D многопоточные или асинхронные приложения с разграничением доступа.
Начинающим изучать язык также пригодится статья «Getting started with D», в которой пошагово описывается процесс инициализации минимального DUB-проекта.