3 лучших языка программирования для разработчиков Java
Если вы программист на Java и думаете об изучении еще нескольких языков программирования, чтобы расширить свои знания и навыки, но не уверены, какие языки программирования выбрать, то вы попали в нужное место.
В этой статье я расскажу о 3 языках программирования JVM, которые могут изучить Java-программисты, и о том, почему вам следует их изучить. Быть разработчиком Polyglot — это хорошее качество, которое часто высоко ценится на собеседованиях.
Это также расширяет ваше мышление, потому что разные языки программирования имеют разные функции, которые упрощают определенные вещи.
Изучение нового языка дает вам опыт и знания для сравнения плюсов и минусов двух языков программирования, что, по сути, позволяет вам писать лучший код.
Большинство языков, которые я предлагаю изучить Java-разработчикам, основаны на JVM, потому что их легче освоить Java-программистам. Они связаны с Java так или иначе, поэтому они помогают расширить кругозор любого Java-разработчика.
Scala, Groovy и Kotlin
Вот мой список из трех языков программирования, которые разработчики Java должны изучить в 2020 году.
Почему я включил только 3 языка, а не 10 или 5?
Что ж, выучить новый язык не так-то просто — изучение нового языка программирования требует времени и усилий, и даже если вы можете выучить только один, этого будет более чем достаточно.
1. Scala
Scala существует уже довольно давно, и когда он только появился, его рекламировали как лучший язык для замены Java. Что ж, этого не произошло, особенно после некоторого функционального программирования.
такие функции, как лямбды и поток, были введены в Java 8, но Scala по-прежнему остается языком, которым следует учиться для разработчиков Java.
За последние пару лет Scala выросла, и все больше компаний и стартапов начали использовать его, например Uber, Sony, Amazon, Autodesk и т. Д., Что делает его одним из самых востребованных навыков.
Популярные фреймворки Scala, такие как Play, Akka и Spark, также помогают компаниям внедрять Scala для веб-разработки и решений для больших данных. Неудивительно, что разработчикам Scala в среднем платят более 120 тысяч долларов.
Если вы ищете увлекательную работу и хотите изучить функциональный язык программирования, то Scala должен быть вашим первым выбором. А если вы решите изучить Scala, тогда Rock the JVM! Scala и курс функционального программирования для начинающих на Udemy идеально подходят для начала.

Если вам нравятся книги, то я рекомендую книгу «Скала для нетерпеливых» от Кея С. Хорстмана. Мне нравится его стиль, и я прочитал многие из его книг, например, Java SE 9 для нетерпеливых, Core Java 1 и 2 и т. Д. Как и другие, эта книга также охватывает ключевые концепции Scala и помогает быстро приступить к работе.
2. Kotlin
Kotlin был представлен в 2011 году блогом команды JetBrains (разработчиком IntelliJ IDEA, PyCharm и многих других ведущих IDE), но немногие программисты обратили внимание на него, пока Google не объявил его официальным языком для разработки Android в Google IO 2017 года.
Подобно Groovy и Scala, Kotlin также работает на JVM и компилируется до байт-кода Java; вы можете начать возиться с Kotlin в существующем проекте Java или Android, и все будет работать нормально.
Итак, если вы заинтересованы в изучении разработки под Android, хотите обезопасить свое приложение от исключения NullPointerException, хотите придать своей функции некоторую чистоту, написать несколько функций высшего порядка или какое-то функциональное программирование, тогда вам следует изучить Kotlin в 2020 году.
Начнем с того, что Kotlin для разработчиков Java — неплохой курс. Он охватывает основные концепции простым языком и предоставляет реальные примеры, которые помогут вам понять их.

Если вам нравятся книги, то вы можете прочитать «Котилин в действии». Его легко читать и достаточно полно, чтобы охватить важные детали.
Вы также найдете все упражнения и решения для этой книги на официальном сайте Kotlin, где также есть онлайн-редактор для практики программ Kotlin.
3. Groovy
Я изучал ландшафт Groovy в 2017 году и на основании этого опыта могу сказать, что каждый разработчик Java должен изучить Groovy.
Он действительно дополняет Java своим кратким синтаксисом и мощным
функции программирования, такие как литералы коллекции, def для определения чего угодно,
и многострочные струны.
Изучив Groovy, я понял, что все, что я могу сделать, — это 50 строк кода. Он серьезно сократил объем кода, необходимого для выполнения каких-либо действий, если сравнить его с Java, и лучшая часть Groovy — это то, что это Java.
Одной из причин, по которой я изучил Groovy, был фреймворк Spock — описательный и основанный на спецификациях фреймворк модульного тестирования. Это значительно упрощает модульное тестирование на Java, а также расширяет возможности JUnit.
Если вы решили изучить Groovy, то для начала вам подойдет Полный курс разработчика Apache Groovy на Udemy. Этот курс объясняет основные функции Groovy простым языком.

А если вы по-прежнему предпочитаете книги, то я рекомендую книгу «Создание Java Groovy». Это помогло мне написать сценарии Groovy всего за несколько часов.
Это была книга, которую я прочитал, когда начал работать с Groovy, а за ней последовал Groovy в действии, но если вам нужно больше вариантов, вы можете обратиться к этому списку лучших книг по Groovy.
Это все о трех языках программирования на основе JVM, которым Java-разработчики могут научиться, чтобы продвинуть свою карьеру. Если вы хотите перейти к функциональному программированию, то Scala — лучший выбор.
Если вы заинтересованы в разработке мобильных игр и приложений, Kotlin поможет вам, а если вы хотите создавать сценарии, Groovy — отличный язык. Это очень помогает в модульном тестировании и автоматизации сборки.
Поскольку Groovy компилируется в Java, он эффективно дополняет язык программирования Java.
Спасибо, что прочитали эту статью. Если вам нравятся эти языки программирования и вы видите ценность их изучения, поделитесь этой статьей со своими друзьями и коллегами.
Актуальность языка Java: почему стоит начать с него
Педагог, копирайтер и тьютор. Люблю читать, писать, размышлять и помогать людям и профессиям находить друг друга. А еще писать просто о сложном, объяснять неочевидное, находить недоступное, анализировать то и это
Java — универсальный язык и нашёл применение практически во всех областях экономики и IT-специализациях. На нём создают десктопные и мобильные приложения, софт для умной техники, программное обеспечение и игры. Java применяют банки, торговые и строительные фирмы, образовательные организации, государственные структуры и IT-корпорации. В этой статье мы разберёмся, стоит ли учить Java новичку, как долго придётся осваивать этот язык и где потом можно будет работать.
Содержание статьи скрыть
Особенности Java
Java — это объектно ориентированный язык, на котором пишут серверный софт, программы и мобильные приложения. Это один из основных языков для разработки под Android.
Популярность. Около 7 млрд устройств по всему миру используют приложения, созданные на джава. Миллионы программистов владеют языком программирования java и спрос на таких специалистов остаётся высоким.
Универсальность и гибкость. Джава применяют в научных разработках, мобильных приложениях, геймдеве, создании десктопного ПО, веб-сайтов и софта для встраиваемых систем. На джава создают программы любой сложности: банковские приложения, интернет-магазины, софт для умной техники и умных домов.
Сообщество. Благодаря большому числу программистов и реализованных решений, а также библиотек и дополнений практически любую проблему можно решить, обратившись за помощью к коллегам на форумах.
Кроссплатформенность. Для джава создана специальная виртуальная машина JVM, исполняющая код. У неё две функции — запускать джава-приложения на любых ОС и устройствах и управлять памятью приложений. Единожды написанный код будет работать с любой операционной системой и на любой платформе.
Надёжность. Джава — строго типизированный язык. Это значит, что всякая переменная или выражение имеют определённый тип и программа-компилятор проверяет код и не даёт совершать ошибки разработчику.
Простота изучения. Для понимания java необходимы базовые знания. Нужно понимать специфику объектно-ориентированного программирования, разбираться в компьютерном «железе», изучать достаточно сложный синтаксис и учиться работать с дополнительными программными инструментами.
Ежедневные советы от диджитал-наставника Checkroi прямо в твоем телеграме!
Подписывайся на канал
Подписаться
Где применяется Java
Джава — один из самых часто употребляемых языков программирования. На нём создают микроконтроллеры, сайты и мобильные приложения, игры для ПК, смартфонов и консолей, софт для производства и сферы услуг.
На джава созданы приложение Google Docs, игра Minecraft, серверная часть большинства приложений Netflix, социальные сети и линкедин, сервис такси Uber и веб-сервисы компании Amazon. А ещё на джава проектируют системы виртуальной и дополненной реальности, средства разработки программного обеспечения, файловые системы и контроллеры беспилотных автомобилей.
Зарплаты разработчиков
Средняя заработная плата в РФ — 140 000 руб. в месяц. Доход java-разработчика зависит от его опыта и квалификации:
- новичок — джуниор — 25 000-60 000 руб. в зависимости от региона: в Москве и Московской области 50 000-60 000 руб., в Новосибирске — 25 000-30 000 руб.;
- специалист с опытом — мидл — от 60 000 до 130 000 руб., причём в этом сегменте разницы между столицей и регионами по зарплате нет;
- руководитель команды — тимлид — от 130 000 руб. до 400 000-500 000 руб., крупные и иностранные компании готовы платить 700 000 руб. в месяц.
Данные по зарплатам джава-программистов с сайта russia.trud.com
Чтобы устроиться на позицию джуниора, достаточно иметь минимальный опыт разработки. Некоторые компании готовы взять специалиста без опыта и прокачивать его самостоятельно под свои задачи. На позицию мидла могут рассчитывать программисты со стажем от 2 до 5 лет и с качественным портфолио. Тимлид помимо высокой квалификации и опыта должен уметь руководить командой разработчиков, ставить задачи подчинённым и вести проекты самостоятельно от старта до запуска.
Как выучить Java
Можно учить джава самостоятельно без вузов, школ и наставников. Это процесс длительный по времени, сложный, но выполнимый. Вот простой пошаговый план, который поможет:
Шаг 1. Изучайте литературу по программированию и компьютерным системам. Вам понадобятся в будущей работе знания принципов программирования, понимание устройства компьютеров и знание сетевых технологий. Начните с книги «Программирование: введение в профессию» Столярова А.В. — издание подходит школьникам старших классов и студентам, преподавателям и всем кто хочет стать квалифицированным программистом.
Шаг 2. Зарегистрируйтесь на профильных форумах. Это поможет окунуться в среду. На форумах опытные коллеги отвечают на вопросы начинающих программистов. Если самостоятельный поиск в сети не помог разрешить ваши проблемы, обратитесь за помощью к форумчанам.
Шаг 3. Учитесь разбираться в чужом коде. Изучая чужую работу, вы эффективней и быстрее научитесь программировать сами. Примеры кодов есть в учебниках, на форумах и в Github — системе управления проектами.
Шаг 5. Пробуйте свои силы на фриланс-проектах. Теперь пора начинать собирать портфолио для потенциального работодателя. Фриланс-биржи для этого вполне годятся. Откликайтесь на первых порах на низкобюджетные заказы. Ваша задача — получить клиента и выполнить работу, которая «прокачает» практические навыки и пополнит портфолио.
Шаг 6. Пройдите обучение. Несмотря на обилие учебных пособий и видеоуроков, выучить любой язык программирования с нуля самостоятельно сложно. Если вы хотите уже через 2-3 месяца найти свои первые заказы или устроиться стажёром в компанию, выбирайте обучение в одной из ведущих онлайн-школ страны. Таким образом вы избежите большинства ошибок начинающих программистов, получите документ об образовании, наполните проектами портфолио и сможете рассчитывать на поддержку при трудоустройстве.
Топ-3 курса для java-разработчиков
На курсе «Основы Java» от IMBA за 3 месяца научитесь самостоятельно писать программы на Java и понимать уже написанный код. Вы познакомитесь с системой Git и приготовитесь к сдаче экзамена от Oracle OCA Java 8
На курсе «Java-разработчик» от Skillbox за 6 месяцев вы научитесь создавать код и писать сайты и десктопное ПО на джава, познакомитесь с Git и языком запросов SQL. Вы сможете управлять большими объёмами данных, изучите принципы объектно-ориентированного программирования. В качестве дипломного проекта создадите поисковых движок — аналог Яндекса
На курсе «Программист Java» от GeekBrains за 7 месяцев вы с нуля до продвинутого уровня изучите язык джава. Вы разберётесь с базовыми понятиями программирования, научитесь работать с Git, проектировать базы данных. Вы освоите язык гипертекстовой разметки HTML/CSS, чтобы создавать и верстать сайты. В конце обучения пройдёте стажировку и в составе команды выполните сложный проект
Бесплатные курсы и дополнительные материалы для изучения Java вы можете найти в нашей специальной подборке.
Подведём итоги
Язык Java применяют в веб-разработке, геймдеве, разработке мобильных приложений для банков и интернет-магазинов. Новички зарабатывают от 25 000 руб., специалисты с опытом от 60 000 руб., тимлиды — от 130 000 руб.
Минимальный срок обучения на java-разработчика — 3 месяца. За это время реально разобраться в объектно-ориентированном программировании, изучить синтаксис языка, познакомиться с переменными, научиться писать и структурировать свой код и разбираться в чужом.
JAVA day для желающих изучить этот язык программирования

Во вторник, 20 февраля гости JAVA day в IT-Центре МАИ смогут узнаеть о программе курса, карьерных перспективах, с пользой провести время, а также получить скидку 10% на стоимость курса.
JAVA day начнётся в 17:00. ГУК, зона «А», 3 этаж, комната 9.
Разделы
Рубрики
В этот день было
На орбиту выведен первый модуль Международной космической станции — ФГБ «Заря»
Первый полёт самолёта с солнечной электросиловой установкой
Родился Хенрик А.Э.Конарковски
МАИ
Образование
Наука
Кампус 360°
Пресс-центр
Контакты
- О портале
- Персональные данные
- Сведения о доходах
- Карта сайта
- Интернет-магазин
- Памятка личной безопасности
- Противодействие терроризму
- Противодействие коррупции
МАИ использует файлы cookie. Продолжая работу с mai.ru, вы подтверждаете использование сайтом cookies вашего браузера, которые помогают нам делать этот сайт удобнее для пользователей. Однако вы можете запретить сохранение файлов cookie в настройках своего браузера.
Мы используем cookies
МАИ использует файлы cookie. Продолжая работу с mai.ru, вы подтверждаете использование сайтом cookies вашего браузера, которые помогают нам делать этот сайт удобнее для пользователей. Однако вы можете запретить сохранение файлов cookie в настройках своего браузера.
Не удалось отправить форму
Вероятно, в полях формы имеются ошибки или не все обязательные поля были заполнены. Пожалуйста, проверьте форму ещё раз.
Как правильно изучать Java

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

Определитесь с конечной целью изучения Java
Для начала вам необходимо определиться со своими целями и выбрать тот язык программирования, что вам максимально подходит. Это является самой важной рекомендацией для тех людей, кто ранее не программировал, но имеет желание присоединиться к IT-сообществу.
Как понять, подходит ли вам Java
Было бы намного легче, имей мы среди языков программирования явного лидера рынка, что способен по функционалу и своим возможностям заменить все остальные языки на рынке, тогда бы и вопроса первого языка программирования не стояло бы вовсе. Но в нынешних реалиях этого не происходит.
Если время позволяет, советую понять конечные задачи, решать которые вы хотите посредством программирования, далее разобраться какие именно языки программирования могут эти задачи выполнять, составить список из таких языков и уделить по одной неделе на изучение каждого языка. За месяц вы сможете сложить хоть и крайне отдаленное, но частичное понимание того, как вам дается тот или иной язык, вследствие чего всё вышеперечисленное может помочь вам с решением какому языку программирования вы хотите отдать предпочтение.
Вы должны понимать, что языки программирования являются в первую очередь «инструментами» для решение поставленных задач. Одним из языков, что способен на решение большого количества разного плана задач, является Java.

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

Основные ошибки новичков в Java, которые вам необходимо избежать
1. Попытка изучить всё и сразу. Ни в коем случае не пытайтесь хвататься за всё и сразу. Вы выгорите. Человеку всегда нужно время на то, чтобы информация усвоилась в голове, поэтому идеальным будет составить себе план-изучения, идя последовательно по которому вы будете ориентироваться в том, что вы прошли и что вам предстоит пройти. Последовательность будет давать вам то чувство стабильности, что необходимо новичку.
2.Обучение без конкретики и поставки конечной цели. Чтобы ваше обучение шло успешно, вы должны ответить — зачем вам это надо? Если ваши намерения серьезные и вы готовы к тому, что в течении года вы будете уделять по 3-4 часа самостоятельному изучению языка, то обучение не будет для вас в тягость. Если же целей конкретных у вас нет — еще раз задайте себе вопрос, надо ли вам это всё.
3.Изучать Java закрывшись от сообщества Jav’истов. У нас у всех был и есть синдром самозванца. Это не моё, надо мною будут смеяться и я неспособен и тому подобное. Из за этого начинающие программисты постигают всё в одиночку, столкнувшись с чередой трудностей при изучении и при неимении возможности задать вопрос более опытным коллегам по цеху, выгорают и бросают дело. Вы должны понимать, что программисты привыкли работать в команде и все были такими же новичками, как и вы. Не стесняйтесь и задавайте вопросы на тематических форумах, чатах. Главное перед этим не один десяток раз попробуйте сами решить свою проблему. Только после этого уже обращайтесь. Команда — командой, но самостоятельность никто не отменял.

Пример учебного плана по изучению Java
— Установка JDK (Java Development Kit) с веб-сайта Oracle и Установка среды выполнения Java (IntelliJ IDEA, Eclipse или NetBeans);
— Изучение синтаксиса Java;
— Изучение Java Core;
— Изучение коллекций Java;
— Изучение популярных библиотек и фреймворков;
— Изучение часто используемых API (например, сервлетов, JSP, JDBC, JUnit);
Вашей задачей является сохранение баланса между практикой и теорией. Запомните, программирование — это в первую очередь навык, который требует своего применения каждый день.

Источники для изучения Java
Не забывайте о такой прекрасной платформе, как YouTube. Это ваш прекрасный помощник в изучении любой интересующей вас тематики, в том числе и Java.
Онлайн-курсы по изучению Java с геймификацией. Подходит далеко не всем. Но у кого-то же наоборот успешно обучение проходит на первых порах именно на таких платформах, через форму игры. В любом случае, попробовать стоит. Подписки какие-либо покупать на первых порах не стоит. Не реагируйте никак на скидки, представленные на сайте, поработайте в бесплатном режиме с сайтом, если поймете что это ваше, то тогда можете уже задуматься об инвестиции в своё самообразование на подобных платформах.
Платформа с громадным количеством практики. Она подходит больше для тех, у кого уже есть минимальным опыт программирования, поэтому как только почувствуете , что Java для вас уже не страшный зверь, а инструмент, работу которого вы уже частично представляете, добро пожаловать

Подводя итог — определитесь с тем , для чего вам Java и Учите английский язык
Как итог к данной статье хочу также дать универсальный совет для тех, кто видит себя в будущем программистом. Учите английский язык. Громадные объемы рабочей документации на английском, описания новых технологий языка также на английском. Тонны информации на английском. Поэтому, не забывайте про англ.яз. и уделяйте ему время, независимо от того, какой язык программирования вы выбрали.
Успехов вам в самообразовании, коллеги!
Если вас интересует IT его перспективы в РФ ,
публикую также свои статьи и интервью на канале t.me/it_begin
Подписывайтесь, если будет интересно 😉
Поддержать

1 год назад
«Советы универсальны и их концепция подойдёт к любому языку программирования.» — в принципе на этом можно и закончить чтение )))
1 год назад
Написав приложение на Java, вы запустите его на любом устройстве.
На iOS жаву завезли? Можно на Swift положить болт и кросплатформу на жаве написать?
раскрыть ветку
Похожие посты
1 день назад

Так станет проще работать

1 день назад

Как проклятие невидимой стены ждало меня 20 лет
- Автор:kesn
- Больше интересных фото и комментариев воригинале материала

Когда на меня накатывает хандра, я бросаю всё и пилю свой игровой движок. Это неблагодарное занятие, но меня прёт.
В самом начале у меня были такие планы: вжух-вжух, щас возьму ведро, накидаю туда всяких библиотек для графики, физики и звуков, добавлю сетевую библиотеку по вкусу, перемешаю всё с какой-нибудь системой сообщений, и готово. Приключение на 15 минут.
И вот я тут спустя 5 лет.
Ладно, если быть честным, то я почти не уделял времени разработке, потому что постоянно спотыкался на всяких бесящих меня ошибках: то сериализация не работает с наследованием, то потоки не хотят нормально разделять память, то обновление языка ломало совместимость… Я могу, блин, целую Камасутру написать про соитие с игровым движком. Все эти ошибки сильно демотивируют, потому что хочется уже наконец-то заняться делом, а не ковыряться с байтиками.
Это не моё видео, но оно очень точно передаёт, как у меня происходит разработка:
С другой стороны, конечно, когда эти проблемы решаешь, чувствуешь себя богом и королём жизни, и после этого ты вроде как опять хочешь программировать. И даже кажется, что это была последняя трудность. Ха-ха, наивный. Но мне это нравится. Типа как альпинисты идут в гору и страдают, когда можно пойти в бар с друзьями и попить пивко. Каждому своё.
Ну и вот про одну такую ошибку я хотел поговорить. Есть такой движок — ODE (Open Dynamics Engine). Он появился где-то в палеолите, динозавры его накодили, от документации остались только царапины на скалах. Но он работает, он простой в использовании, и у него есть сишные заголовки, поэтому я мог просто написать враппер на Nim и использовать его в своём движке. В Nim вообще ни хрена нету, поэтому канонический способ — это взять какую-нибудь библиотеку из Си, научиться её вызывать, а потом говорить всем, что ты написал крутую программу на Nim.
Итак, сначала я просто добавил кубики на сцену и отрисовал их. Физический движок был в полной гармонии с графическим, и когда мне графика отрисовывала, что я приближаюсь к кубу и толкаю его, кубик действительно отлетал и вращался. Короче говоря, всё шло так, как я и планировал.
Разумеется, если вы не планируете делать Minecraft, то вам может понадобиться что-то поинтересней, чем кубик. В ODE есть специальный класс Trimesh, который как раз позволяет вам сделать сложную геометрию. Фактически, вы можете создать любое тело из набора треугольников. Типа такого:

Машина глупая, поэтому мы не можем ей сказать «нарисуй зайца», мы можем ей сказать «вот такие есть вершины, соедини их вот так-то, и это будет называться зайцем». Я, естественно, не стал рубить с плеча и решил вместо зайца сделать простой треугольник и проверить, что всё корректно с ним работает.

Я создал треугольник, он успешно отрисовался на сцене, я начал ходить по миру… и обнаружил, что треугольник не в том месте, где нарисован, а где-то непонятно где.
Так и появилась эта дурацкая невидимая стена.
Фактически, я мог ходить по сцене, и где-то я упирался в тот самый треугольник, который вообще-то должен был быть там, где нарисован. Я в принципе даже что-то такое и ожидал, потому что, как я уже где-то писал, только три раза в своей жизни я написал код, который заработал с первого раза. Наверняка я где-то перепутал координату — вместо X передал Y, или наоборот, ну что-нибудь такое. Эти программисты, вы знаете!
Отрисовать этот треугольник я не мог, потому что координаты были правильные, графический движок всё отрисовывал правильно, но вот физический движок как-то неправильно интерпретировал мои правильные данные. Поэтому я стал ходить по миру и пытаться определить очертания этой невидимой стены. В конце концов я её нашёл (она была достаточно странной), и я решил немного подвигать треугольник, чтобы посмотреть, как он влияет на эту стену. Казалось бы, если я просто где-то перепутал координаты, то подвинув треугольник, я немножко подвину эту стену. Но хрен мне там! Стена исчезала и появлялась совершенно случайно, прыгала далеко даже от малейшего изменения координат, и я не мог понять, почему.
И тут я вспомнил эту недалёкую женщину из заЩИТников! Если кто не знает, она сделалась невидимой и решила спрятаться в дожде. Отличный план, надёжный, как швейцарские часы:

Я подумал, что это прям мой случай, и решил полить свою стену дождём, чтобы увидеть её. Дождя у меня не было, зато были кубики, поэтому я создал штук 50 и стал кидать их вниз. При касании стены они к ней прилипали, и я мог видеть её очертания. А когда что-то видишь — отлаживать в разы легче!

Что ж… Это была хорошая попытка понять, по какому закону стена появляется в том месте, где она появляется, но это мне ничего не дало. Даже видя эту стену, я не находил никакой закономерности.
Если нужно где-то найти таких же неудачников, как я, то самое лучшее место для этого — интернет. И я нашёл его — единственного человека, который отстрадал своё и рассказал об этом. Представляете, в 2006 году у какого-то чувака из Германии пятая точка горела точно так же, как у меня сейчас! Не знаю, что он выкурил (похоже, что исходники), но, ОКАЗЫВЕТСЯ, физический движок ожидает от вас трёхмерные точки, но передавать их надо как четырёхмерный вектор, просто в четвертой координате надо поставить мусор, типа так: [x1, y1, z1, 0, x2, y2, z2, 0, . ]. Скажите, как по const dReal* Vertices я должен понять, что там ждут в гости четырёхмерные вершины?

За что я люблю опенсорс — можно всегда докопаться до истоков всего. Я полез в исходники, и вот что обнаружил.
В 2003 году пришёл Russel Smith и добавил всю эту функциональность с trimesh collisions, в том числе интересующую меня строчку:

Тут всё понятно, потому что в определении чётко говорится, что dVector3 — это четырёхмерный вектор (есть некий шарм в этой логике).
А потом через пару месяцев врывается Erwin Coumans и переписывает так, чтобы тип был непонятен:


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

Вообще этот пост был задуман как развлекательный, типа «смотрите, погромист опять страдает, хахаха». Но мне кажется, что он поднимает достаточно глубокую проблему: как только вы выкладываете код, он начинает свой долгий путь сквозь время. Никто не знает, когда и кто его будет читать — может, вы или ваш коллега через пару месяцев, может, тысячи независимых разработчиков через пару лет, может, какой-то парень с горящим продом.
Получается такой вот эффект бабочки, как с этой невидимой стеной. Поэтому когда вы в следующий раз сядете писать код, представьте, что какой-то разраб через 20 лет будет в нём разбираться, и, пожалуйста, постарайтесь сделать жизнь этого чувака хоть чутоку легче. Ведь однажды этим кем-то можете оказаться вы сами.
Не только лишь все могут смотреть в будущее, но вы сможете, если подпишетесь на мой уютненький канал Блог Погромиста.
А ещё я держу все свои яйца в одной корзине (в смысле, все проекты у одного облачного провайдера) — Timeweb. Поэтому нагло рекламирую то, чем сам пользуюсь — вэлкам.
Показать полностью 9 1
2 дня назад

Если ты ростом ниже 185, то даже знание плюсов тебе не поможет

2 дня назад

А как починил то?
Восстанавливал щас ноут после неудачного обновления Win.
Раньше, после ремонта техники, на вопрос «А что было то? Как починил?» честно перечислял как было: «Да через LiveUSB проверил физическое состояние накопителя викторией, целостность загрузчика, прогнал chkdsk на системной ФС. Откатил неудачное обновление, восстановил целостность ОС с помощью sfc и DISM /Online /Cleanup-Image /RestoreHealth, перенакатил обновление. » ну и в таком духе.
Сейчас отвечаю: «Да черт его знает чо там было. Я случайные клавиши нажимал до тех пор пока не заработало». Уходят довольные)
4 дня назад

Совместимость витаминов: приложение
Я тут решил начать принимать витамины и выяснил что многие витамины и минералы друг с другом не совместимы. И нужно разносить время приема в течении дня. А некоторые наоборот работают лучше вместе. Кое-какие минералы и витамины нужно принимать в определенное время дня для лучшей усваимости. Есть куча таблиц, с помощь которых тратится куча времени на компановку своей таблетницы. Решил поискать приложение, которое бы все рассчитывало за тебя, а оказалось что такого и нет.
В общем в итоге я написал свое приложение на основе статей и таблиц совместимости. Просто выбираете витамины или минералы из списка и оно все планирует и даже умеет создавать PDF с графиком приема.
Пока что вы можете найти его в RuStore или GooglePlay. Для РФ советую качать из RuStore, так как там оно полностью бесплатное и все фишки доступны с коробки. Надеюсь, что скоро и Apple одобрит приложение.
Буду рад критике и отзывам!
Так же буду рад, если есть предложения по улучшению.
4 дня назад

Интересно, а сколько разработчиков в мире используют только свой код?

Показать полностью 1
9 дней назад

Раздача игры Medieval After Summer на Itch.io в жанре стратегии-симулятора
Medieval After Summer — стратегия-симулятор средневековых рыцарских боев


Перед боем у вас есть выбор: перепрыгнуть или атаковать врага, после победы выбор: подобрать один из предметов врага или улучшить свой.
Автоматический бой всадников с возможностью помощи своему персонажу делает бой более требовательным в плане правильного выбора предметов и противника.
Синергия и противодействие предметов делают игру невероятно сложной, где нет места росту в стиле «рогаликов» .
- Обновлено : 6 дней назад
- Опубликовано : 28 мая 2023 г.
- Статус : выпущен
- Платформы : Windows, macOS, Linux, Android
- Оценка: 5,0 из 5 звезд
- Автор : SereDim
- Жанр : Стратегия
- Теги : авто, автобой, выбор, бой, жесткий, Инди, быстрый, езда, выбор, Простой
Показать полностью 2
Поддержать
9 дней назад

Новые возможности Apple

10 дней назад

Гилфойл ерунды не скажет

Показать полностью 1
11 дней назад

Что заставляет программистов писать вирусы
Материал был взят и переведен с Рэддита. Приятного прочтения!
1. В 7 классе я ходил на кружок программирования, который фактически превратился в кружок по созданию вредоносных программ. Мы с другом написали программу, которая постоянно открывала на компьютере один сайт для взрослых и врубала звук на полную мощность. У нескольких человек этот сайт открылся прямо на уроке. Было весело.
2. Я написал эту программу ради азарта. Это был аддон для Воркрафта. Он запускался, когда персонаж входил в игру. А потом персонаж получал приглашение в гильдию от игрока с заряженным аккаунтом и сам становился главой гильдии. После этого можно было идти в игровой банк и забрать оттуда все ценное. Написать код было просто, но вот протестировать его работу с помощью приемов социальной инженерии очень сложно. Но мне повезло с первого раза. Прилив адреналина был колоссальным, но я также понимал, что меня, скорее всего, забанят в этой игре. Моей следующей целью была высшая рейдерская гильдия на сервере. Чтобы убедить лидера гильдии участвовать в моем тестировании, понадобился час разговоров по скайпу. Он попался на крючок, и все почти получилось. Я знал, что у этой гильдии игровых ценностей на сотни тысяч долларов. Глава установил аддон, но потом я понял, что он вошел через альтернативного персонажа, не имевшего доступ к богатству гильдии. Так у меня все провалилось. Меня выгнали из гильдии и забанили. Позже мне удалось вернуть свой аккаунт, но без тех ценностей, которые я награбил раньше.
3. В юности я создал несколько троянов удаленного доступа. С их помощью воровал аккаунты в разных играх и продавал их в интернете. Когда я впервые запустил троян, было 200 загрузок и 90 заражений. Половину угнанных аккаунтов я отдал другу, который помогал писать программу. Потом продал два акка и купил попугая, потому что люблю птиц. А потом старший брат объяснил, что все это плохо и незаконно, и я остановился.
4. Раньше вирусы создавались ради демонстрации крутости и были не особо вредными, это во времена Дос и вплоть до Виндовс XP. Потом появились черви для кражи паролей. Потом ботнеты, а они уже только ради денег. Они крадут данные, пароли, откровенные фотки, все подряд, для последующей продажи. Потом киберпреступники научились использовать сторонние компьютеры для майнинга, взлома сайтов и прочего дерьма.
5. У меня есть друг, который мошенничал с кредитками, крал личные данные, информацию с компьютеров, используя для этого кейлоггер, замаскированный под ссылку для скачивания. В школе он начал продавать вещи и одежду всем, включая меня. А через два года за ним приехали из ФБР и увезли, хотя он и был несовершеннолетним. Ему пришлось заключить сделку и вернуть товаров на 50 тысяч долларов. А еще он взломал главу отдела безопасности Xbox, про это есть видео на ютубе.
6. Когда-то я любила троллить людей в чатах, рассказывая, что у меня есть постеры с Бритни Спирс, но для их закачки надо открыть файл, который я пришлю. Так я получала доступ к компьютерам жертв. Могла полностью просматривать жесткий диск, скачивать, что мне надо, удалять с компьютера файлы. Однажды я стала удалять кучу всего с компьютера парня, с которым в это время общалась в чате, и он заплакал. Мне стало жаль его, и я прекратила, и больше никогда этим не занималась.
7. Я занимался этим ради денег. Уже в старших классах я занимался черным СЕО и восстановлением сайтов. Потом я познакомился с парнем, который придумал, как через песню из альбома вшить ссылку. Эта программа случайным образом одну из песен на компьютере превращала в ссылку. Когда человек хотел прослушать ее, всплывала надпись, что надо скачать кодек. Он скачивал, и я получал 10 центов. Свою ссылку мы размещали на торрентах, скачиваний было много, денег хватало. Позже я стал нанимать индусов, чтобы они распространяли по торрентам файл с этой ссылкой. Мне тогда было 16, и я за месяц заработал 4 тысячи долларов. Это было круто, учитывая, что на черном СЕО и сайтах у меня выходило около тысячи в месяц. А через несколько месяцев все пошло наперекосяк, и я стал заниматься другими делами.
Похожие подборки без цензуры и купюр ежедневно выходят на моем канале https://t.me/realhistorys
Всем здоровья и добра!
Показать полностью
Поддержать
11 дней назад

World TV — Бесплатное тв со всего мира

Приветствую всех любителей тв.
Давненько я не писал постов.
Появилась свободная минутка и я решил поделиться последними новостями об изменении в работе приложения.
Наиболее важными были изменения:
-Добавлены несколько новых встроенных плееров
— Исправлены баги
— Увеличена скорость обработки плейлистов
— Расширена база каналов
Для тех кто ранее не пользовался приложением в кратце расскажу.
World Tv — приложение под Android.
Содержит в себе тысячи каналов со всего мира рассортированных по категориям: Страны, языки, регионы категории.
Проект не коммерческий. Делаю для себя и для всех желающих.
Буду рад если ознакомьтесь и оставьте отзыв здесь на плей маркете.
Скачать можно в Google Play: https://play.google.com/store/apps/details?id=io.kodular.mai. . (старая версия)
Актуальную версию 2.7 можно скачать в телеграмме: https://t.me/worldtvandroidclient
Показать полностью
Поддержать
11 дней назад
Дорогу осилит идущий
Я учу людей языку программирования Java. Бесплатно. Совсем бесплатно. Прям даром. И даже без рекламы. Совсем без рекламы. Вот вообще.
Ссылка на тг: Дорогу осилит идущий. Java
С чего все началось: Помогу с изучением Java. Бесплатно. Не реклама:)
В свое время я опубликовал пост, в котором предлагал помощь в изучении Java всем желающим. Сегодня этой инициативе исполняется год.

Год бесконечных, по крайней мере, в моем восприятии, статей, обсуждений и ревью. Год новых знакомств, холиваров и необычного опыта.
Год, за которое сформировалось уютное, как мне кажется, и живое комьюнити. Комьюнити, готовое помогать новичкам в чатах, отвечать на вопросы и делиться опытом.
В этом посте не будет итогов или стенаний об усталости. Лишь благодарность людям, которые поддерживали меня и канал все это время.
Тем, кто готов делиться знаниями и тратить на это свое время. Совсем недавно мы провели первый вебинар и в скором времени планируем второй. Надеюсь, все участники остались довольны:)
Тем, кто готов разбавлять публикации уроков чем-то необычным — например, интервью с подписчиком. Кажется, оно получилось отличным и, во многом, мотивирующим.
Тем, кто добровольно вычитывает статьи, находя бесконечные грамматические ошибки. Именно благодаря этим людям я кажусь не совсем безграмотным:)
Тем, кто задает вопросы и искренне пытается разобраться в изучаемых темах. И тем, кто на эти вопросы отвечает и не менее искренне пытается помочь.
Тем, кто пишет слова благодарности и поддержки.
Именно благодаря всем этим людям «Дорогу осилит идущий» живет и развивается.
Мы уже прошли долгий путь — от самых основ синтаксиса, через Java Core, многопоточность и SQL. Начали знакомство с системами сборок.
Конечно, идти хотелось бы быстрее. И поэтому отрадно видеть людей, которые начинали (или продолжали), когда канал только зарождался, а теперь уже стали Java-разработчиками. Они все еще в пути, но уже намного дальше:) Вдвойне приятно, когда эти люди остаются активны и уже сами помогают новичкам. Или пишут и советуются уже по вопросам, связанным с коммерческой разработкой.
А у нас все еще впереди. И свою дорогу мы тоже проползем пройдем!
Как и всегда, буду искренне рад тем, кто захочет присоединиться:) Вместе шагать веселее
P.S. Когда-то я говорил, что блек джек и шлюхи тоже будут. У ребят, которые устроились на работу — уже есть, для остальных — пока только показываем

Показать полностью 2
11 дней назад

Как понимать мемы про айти?

11 дней назад

3D видеокарта-«декселератор» из 90-х. Как работала S3 ViRGE «под капотом»?

Друзья! Многие ли из вас застали такую легендарную видеокарту, как S3 ViRGE? Когда-то этот GPU стоял чуть ли не в каждом втором офисном компьютере: благодаря дешевизне и заявленной поддержке 3D-ускорения, эту видеокарту просто сметали с полок магазинов. Далеко не все могли себе позволить ATI Rage, Riva TNT и уж тем более 3dfx Voodoo и очень разочаровывались в свежекупленной видеокарте, когда пытались поиграть в новомодные игры тех лет. На момент написания статьи, в сети слишком мало материала о том, как работали видеокарты 90-х «под капотом», однако мне удалось найти даташит на видеочип, SDK для программирования 3D-графики специально под него и некоторую документацию. Я решил исправить это недоразумение и начать развивать отдельную рубрику о работе старых видеочипов: начиная от S3 ViRGE и заканчивая GPU PS2 и PSP. Сегодня мы с вами: вспомним о S3 ViRGE, узнаем о том, как работали видеокарты в 90-х годах, затронем 2D и 3D режим и почему они тесно связаны между собой, посмотрим на проприетарное графическое API S3 ViRGE и раскроем причину, почему же этот GPU был таким медленным!
❯ 3D графика на ПК: начало
В начале 90-х годов 3D-графика на обычных домашних компьютерах была редкостью. Профессиональные GPU применялись только на дорогущих графических станциях, которые использовались в кинематографе или различных симуляциях, а также на дорогих японских игровых автоматах. У простого обывателя не было доступа к аппаратным средствам рендеринга 3D-графики.

Однако это не значит, что 3D-графики не было вообще. Прогресс развития домашних процессоров шёл семимильными шагами и гиганты рынка —Intel,AMDи в некоторой степени Cyrix, выпускали всё новые и новые процессоры с повышенными тактовыми частотами, а ближе к середине 90-х — и с SIMD (MMX). Поскольку многие техники для отрисовки трехмерного изображения были разработаны ещё в 60-х — 70-х годах, игроделы к началу-середине 90-х во всю использовали некоторые наработанные техники из кинематографа для растеризации 3D-графики прямо на процессоре — так называемыйсофтварный рендеринг.

Одной из самых известных техник 90-х являлась 2.5D графика с использованием рейкастинга — когда картинка на экране выглядит как трёхмерная, однако по факту весь мир представлен в виде 2D-координат, а эффект «пола и потолка» был как бы фейковым. Принцип его работы довольно прост: от глаз игрока для каждого горизонтального пикселя (т. е. при разрешении 240х320, у нас будет 240 проходов) пускаются «лучи» и ищется пересечение с ближайшей стеной относительно угла обзор из глаз игрока. Из этого пересечения берется дистанция до этой стены (на основе дистанции и угла считается «высота» данной строчки стены) и считается какую строчку текстуры необходимо вывести в этой точке. Одними из первых игр с применением этой технологии стал Hovertank и Wolfenstein 3D, а технология применялась практически до конца 90-х. Одной из самых лучших реализаций рейкастинга — движок Duke Nukem 3D, Build Engine, написанный Кеном Сильверманом.

Однако не одним 2.5D мы были едины. Шли годы, в СНГ многие люди продолжали наслаждаться 8-битными и 16-битными играми на клонахNESи SMD. У некоторых уже появлялась PS1, которая позволяла играть в игры с довольно хорошей 3D-графикой, однако на ПК 3D-игры были доступны не всем. Но в 1996 году выходитQuake— новейший шутер от первого лица от id Software с настоящей, трушной 3D-графикой и переворачивает всю индустриюFPSс ног на голову. Посудите сами: Джон Кармак умудрился реализовать достаточно быстрый софтварный рендерер, который мог вполне сносно работать на Pentium 75Мгц в разрешении 320×240. А ведь помимо отрисовки кадра, игре нужно было просчитывать логику монстров (довольно примитивную, к слову), обрабатывать столкновения, просчитывать видимую геометрию с помощью BSP-дерева и обрабатывать клиент-серверную логику самой игры. Это была самая настоящая революция в мире 3D игр на ПК.

В 1997 году, id Software выпустили glQuake — порт Quake с софтрендера на OpenGL, плюс своеобразную прослойку для совместимости с API 3dfx Glide (на видеокартах Voodoo) и подмножества OpenGL, используемым в игре. Порт на OpenGL позволял разгрузить ЦПУ, перенеся всю отрисовку графики с процессора на 3D-ускоритель. Сам по себе, OGL как графическое API, представлял из себя лишь набор спецификаций, который мог быть реализован как в программном виде, так и в аппаратном производителем видеокарты (на примере Windows — OpenGL32.dll это программная реализация, которая при необходимости обращается к atioglxx.dll/nvoglvxx.dll — аппаратной реализации OpenGL от вендора видеочипа). Однако, OpenGL корнями уходил именно в отрисовку промышленной графики, а DirectX всё ещё находился в зачаточной форме, из-за чего многие производители разрабатывали собственное графическое API: из известных мне, могу подчеркнуть ATI CIF (C Interface), 3dfx Glide и проприетарное SDK S3 ViRGE. Некоторые вендоры поддерживали целые игровые движки — например, BRender и RenderWare.

Отдельные 3D-акселлераторы потихоньку начали завоевывать сердца геймеров и создавать новый сегмент рынка. Серьезные видеокарты от известных производителей, такие как 3dfx Voodoo, ATI Rage и Riva TNT стоили достаточно дорого и многим были не по карману. Зато существовало множество видеокарт с 3D-ускорителями от других производителей, про некоторые из них вы могли даже не слышать: отдельные дискретные видеокарты Intel (i740), видеокарты от производителя чипсетов SiS и конечно же, видеокарты от S3 с сериями ViRGE и Savage. Видеочипы от Intel и SiS делали упор на D3D 7.

S3 ViRGE была весьма неплохой видеокартой с точки зрения 2D-ускорения. Сейчас 2D принято считать частным случаем 3D (по факту, 2D-спрайты — это 3D-квады, состоящие из двух треугольников), однако в то время для работы с памятью видеокарты и аппаратного ускорения некоторых операций, таких как блиттинг (BitBlt) существовало отдельное графическое API — DirectDraw. С этим у ViRGE было всё хорошо — он поддерживал довольно высокое разрешение экрана (при желании, объём видеопамяти можно было нарастить и установить разрешение ещё выше) и умел ускорять часть операций как DDraw, так и GDI.
Однако, ViRGE разочаровывал многих геймеров 90х своей производительностью в 3D-графике. На коробке с бюджетной видеокартой красовались красивые надписи о 3D-графике следующего поколения, а на фотографии можно было увидеть некую игру про мехов с невиданной графикой!

По факту, ViRGE подходил для 3D-игр не особо хорошо. Конечно в те годы никто особо не плевался от FPS и при желании, игру могли пройти и в 15, и в 20 FPS. Однако производительность софтварного рендерера иногда была даже выше, чем у растеризатора ViRGE, а игры должны были быть специально адаптированы под неё (т. е. портированы для использования S3DTK). Тайтлов с адаптацией по этот GPU было немало: как минимум, Tomb Raider и MechWarrior 2 (который шел в комплекте с игрой). Польские ребята из известной многим Techland даже написали прослойку S3D -> OpenGL, позволявшей запускать Quake на ViRGE. Производительность была не ахти…
Видеокарт от S3 нашлись и у меня, причём сразу несколько — ViRGE в PCI-исполнении и Trio в AGP-исполнении! Иногда я их использую для проверки старых материнских плат, которых у меня не так уж и много — рабочих на PGA370 и ниже у меня совсем нет. Однако остаётся вопрос, как эти видеокарты работали под капотом? Давайте узнаем!
❯ «Под капотом»
Исторически сложилось так, что 3D и 2D акселераторы могли быть отдельными и формально не зависящими друг от друга устройствами. Архитектура IBM PC в зависимости от «поколения», предполагала сразу несколько типов видеоадаптеров, которые были стандартизированы под определенный тип мониторов. Один из таких адаптеров, VGA, стал стандартом на долгие годы, в то время как два других использовались в совсем ранних машинах. Их ключевое отличие было в организации видеопамяти и цветности — CGA/EGA предполагал разбитие пространства экрана на т. н. битплейны (один байт содержал информацию о нескольких пикселях и если не ошибаюсь, для сохранения адресного пространства сегменты экрана необходимо было переключать аля банки памяти) и былпалитровым, в то время как VGA предполагал как палитровый режим, так и полноценный RGB и мог отразить весь фреймбуфер в линейную область адресного пространства. Кроме того, долгое время VGA использовался для обозначения разрешения дисплея: QVGA — половина VGA (320×240), VGA (640×480), широкоформатный WVGA (800×480) и т. п.

Другой особенностью была полная (насколько мне известно) обратная совместимостью друг с другом. Например, GeForce 7xx, как один из последних GPU, который поддерживал Legacy BIOS, теоретически вполне мог работать и с EGA режимами, и с CGA через соответствующие видеорежимы int 10h!
3D-режимы же никак не были стандартизированы и каждый производитель реализовывал работу с ними по разному — как уже говорилось ранее, кто-то реализовывал поддержку совсем молодого D3D и OpenGL (насколько мне известно, лучше всего с OpenGL было у NVidia. Остальные вендоры поддерживали OGL, но были свои болячки — у ATI они тянулись чуть ли не до середины-конца нулевых), а кто-то делал собственное графическое API и работал с видеочипом почти напрямую. Первые 3D GPU использовали шину PCI, которую почти сразу заменила более скоростная, но интерфейсно и софтварно почти идентичная шина AGP, а затем уже появился PCI-E, который оставался тем же PCI в софтовом плане, но был дифференциальным и последовательным, а не параллельным как интерфейсы-предшественники.

Дабы понять, как работают первые видеокарты, необходимо узнать о том, как происходит процесс отрисовки 3D-графики в общем случае. В мире программирования графики это называетсяконвейероми состоит он как минимум из нескольких этапов:
Установка состояний: Программа задаёт источники света на сцене, параметры Z-буфера и Stencil-буфера, какую текстуру(ы) следует наложить на рисуемую геометрию и с какой фильтрацией, какой тип аппаратного сглаживания использовать и т. п.
Ранее, каждый стейт необходимо было устанавливать отдельно, при необходимости — для каждого DrawCall’а. После подготовки состояния, программа вызывает соответствующую функцию отрисовки.
Обработка геометрии: Геометрия не поступает в растеризатор «как есть», в мировых координатах. Растеризатор оперирует вершинами в нормализованныхClip Spaceкоординатах — обычно, это [-1, -1… 1, 1], где 0.5 — центр экрана по каждой оси. Именно поэтому сначала необходимо провести этап трансформации геометрии для перевода из некой глобальной системы координат (которая может выражаться в метрах или, например, в пикселях) в Clip Space. Для этого чаще всего координаты (корректнее — трансформации) представляются в виде трех перемноженных матриц — model (мировые координаты геометрии), view (положение «глаз» в мире, или по простому камера. Умножая model на неё, мы получаем координаты объекта в пространстве камеры) и projection (матрица проекции, которая преобразовывает координаты из пространства глаз в тот самый Clip Space. Именно в этой матрице задается FOV для перспективной проекции и виртуальные размеры экрана для ортографической матрицы). После этого, координаты каждой вершины трансформируются полученной ModelViewProjection матрицей и получается финальная позиция для Clip Space. Звучит как сложный учебник матану, по факту всё очень просто. 🙂

Детали реализации низкоуровневого матана, в том числе перемножения матриц и построения матриц трансформаций и проекции знать желательно, но необязательно. Сейчас этим занимаются очень удобные математические библиотеки — например, glm, dxmath или d3dx.
Кроме того, ранее именно на вершинном этапе считалось освещение для уровня. В некоторых видеочипах была возможность аппаратного расчета источников света, в некоторых — только программная на ЦПУ.
На видеокартах тех лет, в том числе и S3 Virge, трансформацией вершин занимался центральный процессор, из-за чего было довольно серьёзное ограничение на количество вызовов отрисовки и число треугольников в одной модели. Видеокарты с аппаратной, но всё ещё не программируемой трансформацией вершин появились лишь к GeForce 2 — называлась эта технология T&L (Transform and Lightning) и её преимущество было в том, что у видеокарты были специализированные векторные сопроцессоры, способны быстро пересчитывать векторные операции (а у ЦПУ, в свою очередь, развивались SIMD наборы инструкций, позволяющие выполнять несколько операций над float одновременно). В некоторых случаях, был даже отдельный программируемый векторный сопроцессор как, например, в PlayStation 2, что позволяло реализовать вершинные шейдеры ещё в 2000 году! На современных видеокартах, этапом трансформации в самом простом случае управляют вершинные шейдеры. Помимо этого, есть возможность создания геометрии «на лету» с использованием тесселяции и геометрических шейдеров, а совсем недавно появились Mesh-шейдеры, которые объединили несколько подэтапов конвейера в один.

Растеризация: Сам процесс отрисовки геометрии на дисплей с данными, полученными с прошлого этапа. Именно на этом этапе треугольники (или иные геометрические примитивы) закрашиваются определенным цветом или на них накладывается текстура. В процессе растеризации есть такое понятие, как интерполятор — специальный модуль, который интерполирует несколько значений в барицентрических координатах растеризуемого треугольника, дабы текстурный юнит мог наложить определенный участок текстуры на фрагмент треугольника.
В современных видеокартах этот этап конвейера программируется пиксельными (или фрагментными) шейдерами. В старых видеочипах (исключение — вроде-бы частично программируемый GPU Nintendo 64, поправьте в комментариях, если не прав) этот процесс строго определен в каждом GPU и не программировался. Именно поэтому такой подход к рисованию графики назывался Fixed function pipeline. Были ещё комбайнеры, но они появились заметно позже — когда в видеокартах появилось уже несколько текстурных юнитов, способных смешивать несколько текстур одновременно.

Делая вывод, мы можем понять, что S3 Virge и другие видеочипы были устройствами, которые умели рисовать лишь тот уровень графики, который был заложен производителем с завода. Такой подход называется фиксированным конвейером — Fixed Function Pipeline. Сейчас разработчики видеочипов перешли с фиксированного конвейера на программируемый (шейдерный). Уже начиная с SM2.0-SM3.0, на современных видеокартах появилась возможность создавать крутое и достаточно сложное освещение и различные эффекты, которые стали неотъемлемыми в современных играх.
Кроме того, важно понимать, что в видеопамяти ранних видеочипов хранился только фреймбуфер, а немного позже — текстуры, именно поэтому VRAM в старой документации называют «текстурной памятью». Вообще, некоторые нюансы первых версий OpenGL тянуться именно из особенностей работы первых видеокарт. Вспомнить хотя бы первые функции для старта отрисовки геометрии и загрузке вершин на видеокарту — это были связки glBegin/glVertex/glEnd:
glBegin(GL_TRIANGLES);
glVertex3f(0, 0, 0);
glVertex3f(1, 0, 0);
glVertex3f(1, 1, 0);
glEnd(); // Для одного треугольника
glBegin(GL_TRIANGLES);
for(int i = 0; i
glEnd(); // Для меша
Даже сам glBegin/glVertex/glEnd появились не спроста. Геометрию на видеокарте начали хранить только в начале нулевых (и то не везде — привет встройкам Intel и S3).
Но перейдем к особенностям работы S3 ViRGE. Даташит лежит в свободном доступе, благодаря чему мы можем более подробно ознакомиться с характеристиками этого видеочипа и о том, как он работал под капотом.

В основе у нас лежит 64-х битное ядро, которое могло обрабатывать как 2D-графику с аппаратным ускорением, так и 3D-графику. Ядро работало на частоте 135МГц с встроенным RAMDAC (модуль, отвечающий за вывод картинки на аналоговые разъемы — VGA и DVI, однако выводом на TV-тюльпаны занимался отдельный чип TV-энкодер). Современные видеочипы перешагнули планку 1ГГц, однако сравнение исключительно по частоте некорректны — архитектуры очень сильно отличаются. Помимо этого, видеочип умел декодировать видео с интерполяцией и аппаратно «помогать» процессору с скейлингом видео (например, когда вы разворачиваете плеер на весь экран) и даже рендерить видео в текстуру (что позволяло реализовать, например, телевизоры в играх)!
3D движок поддерживал следующие возможности:
- Затенение по Гур.о
- Маппинг текстур с перспективной коррекцией и билинейной/трилинейной фильтрацией, а также мипмаппингом.
- Depth-буфер, сэмплинг тумана и поддержка альфа-блендинга (прозрачной геометрии).
Чип поддерживал две шины — PCI и менее известную VLB (Vesa Local Bus, очень условно ISA)
Помимо этого, у чипа не было встроенной памяти — к нему необходимо было подключать внешнюю DRAM-память 2/4/8Мб. От её количества зависело максимально-поддерживаемое разрешение экрана. Текстуры при необходимости хранились в ОЗУ.

Видеопамять когда-то расширялась за счёт дополнительных модулей! Эту видеокарту можно расширить аж до 8МБ!
Поддерживаемые разрешения экрана:

Для DirectDraw и ускорения 2D-графики в Windows была реализация аппаратного BitBLT — копирования пикселей в точку на экране. Она поддерживала все режимы, которые были в реализации этой функции в Windows — от монохромных, до 24-х битных. Без альфа-блендинга, само собой. Но тут нет ничего необычного — многие видеочипы тех лет предоставляли простое 2D-ускорение.
Интереснее реализация отрисовки 3D-графики. Каждый треугольник описывался 3-мя регистрами на каждый параметр — координата X, Y для каждой точки, текстурные координаты и т. п. Всего для отрисовки одного треугольника могло потребоваться до 43 регистров! Весьма немало. И именно из-за этого в свое время появились glBegin/glVertex/glEnd!

Параметры сэмплера (текстурного юнита) задавались регистрами, которые определяли формат пикселя текстуры и сам тип фильтрации. Как я уже говорил выше — поддерживалась билинейная и трилинейная фильтрация и проприетарный формат сжатия текстур, который стал стандартом: S3TC или DXT.

Для программирования S3 ViRGE было разработано собственное C SDK — S3DTK, которое состояло из сэмплов и заголовочных файлов для общения с GAPI видеочипа (или видеочипом напрямую, если игра предназначена для DOS). При этом вполне не исключено, что GAPI для Windows работало с видеокартой напрямую, предоставляя PCI-драйвер лишь как прослойку для обмена данными. Поскольку это не D3D, для игр с поддержкой видеоускорения требовалось качать специфические версии. Некоторые игры (как Quake 2) поддерживали мультирендер, но не поддерживали S3 ViRGE.
Весь графический API помещался в один заголовочный файл. API было не простым, а очень простым и понятным — думаю, даже разработчикам-новичкам было легко начать программировать под ViRGE!

Формат вершин был фиксированным и зависел от того, как вы рисовали геометрию на экране:

GAPI поддерживало различные типы треугольных списков, а также точки (POINT для спрайтов и систем частиц) и линии:
#define S3DTK_TRILIST 0
#define S3DTK_TRISTRIP 1
#define S3DTK_TRIFAN 2
#define S3DTK_LINE 3
#define S3DTK_POINT 4
Фактическое API для рисования умещалось в 9 функций и ещё несколько функций для инициализации библиотеки, преобразования адресного пространства и работы с Windows.
Для работы с состоянием видеочипа служили две функции — SetState и GetState. Именно они отвечали за то, как рисовалась геометрия на экране:

А для фактического рисования примитивов служили функции TriangleSet и TriangleSetEx! Да, это альтернатива DrawPrimitives/DrawArrays в современных GAPI. Никаких индексов тогда ещё не использовалось! Функции принимали указатель на массив вершин и их количество, а также на тип рисуемой геометрии (треугольники, линии и т. п.). В Ex версии, можно было «пачкой» установить стейты параллельно с рисованием — такой подход используется в DX10+ API — стейты тоже задаются исключительно «пачками», только теперь они поделены на подгруппы.

Для 2D-рисования были свои, отдельные функции — для блиттинга. Поддерживался ColorKey/хромакей — прозрачным считался определенный цвет, переданный как параметр функции

Основной причиной медлительности S3 ViRGE был низкий филлрейт. При отрисовке примитивов, которые занимают большое пространство экрана, FPS резко просаживался даже с примитивными кубиками и пирамидками. Однако, если не насаживаться на филлрейт и делать что-то типа 2D-поля и 3D-танчиков, то производительность оставалась вполне приемлимой.
❯ Заключение
История S3 закончилась поглощением компанией VIA. После этого, компания разрабатывала интегрированную графику специально для чипсетов VIA, а материнские платы на этих чипах пользовались довольно высоким спросом. Поэтому нередко взяв старый бюджетный ноутбук, года эдак 2005, можно найти в нём VIA Chrome — наследника легендарного S3 Savage! Проблемы у такого подхода тоже были — из-за наследия из конца 90х, ранние Chrome по сути поддерживали только D3D 7.0 и OpenGL ~1.4. Несколько позже, в 2009 году, компания выпустила S3 Chrome 540 GTX — одну из последних видеокарт на собственной архитектуре. Этот видеочип был достаточно современным и поддерживал DX10.1, OpenGL 3.0. Интересно, реально ли найти эту видеокарту сейчас?

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

Насколько я понимаю, неравнодушные инженеры после закрытия 3dfx и слияния S3 с VIA решили «слить» даташиты в сеть, за что им большое спасибо! Ведь теперь мы имеем возможность посмотреть на принцип работы таких устройств сами!
Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня, мой Telegram и @Timeweb.Cloud, чтобы не пропускать новый материал каждую неделю!
