Сообщество - TECHNO BROTHER
Добавить пост

TECHNO BROTHER

1 666 постов 12 547 подписчиков

Популярные теги в сообществе:

RS232 Полный дуплекс по 1(одному) проводу

RS232 Полный дуплекс по 1(одному) проводу Электроника, Схемотехника, Rs232, Дуплекс, Uart

Недавно придумал. В железе правда еще не воплощал, но на модели (MULTISIM) принцип работает.

Может кому идея пригодится, ну и если будет толковая критика - тоже готов выслушать.

Пояснения:

TX - передаваемые данные (от UART),

RX - принятые данные (к UART),

LINE - однопроводная двунаправленная полнодуплексная линия связи. С другого конца которой - предполагается аналогичная схема.

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

D1- ADM3202, MAX232, и т.п. стандартный приемопередатчик RS232

транзисторы - практически любые сигнальные биполярники, например BC847/857, теоретически можно и полевики всобачить, но сдается мне что емкость затвора - тут будет злом в плане быстродействия.

Инвертор - любой логический инвертор. Условно показан 1554ТЛ2 ака 74АС14. Но можно все что угодно.

UPD: По замечаниям в комментах, просимулировал емкостную нагрузку линии. Чуть добавил рассыпухи для устранения влияния емкостных нагрузок.

Подправленный вариант схемы работает до полумегабита при емкости на линии 5000пф и до 300Кбит при 10 000пф на линии.

RS232 Полный дуплекс по 1(одному) проводу Электроника, Схемотехника, Rs232, Дуплекс, Uart

Изначальный вариант схемы - оставлю, т.к. он удобнее для понимания принципа работы. Но если делать - то, естественно, надо брать второй.

Показать полностью 1

Советский "умный дом"

Недавно здесь был пост Ретропонедельник. Реле времени про механическое реле времени советского производства, которое в комментах кто-то назвал "советским умным домом".

Однако в СССР делались и более продвинутые вещи, полноправно претендующие на это звание.
И вот одна из таких вещей : программное устройство с часами и таймером Сигнал-201:

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

Очень похоже на калькулятор или кассовый аппарат. Но внешность обманчива.


Щель над клавиатурой - это не для чеков. Это для специальной крышечки. Очень удобно - клавиши не покрываются пылью и на них не наступит любимая кошка. С крышечкой всё выглядит так:

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

К работе готов!


Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

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


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

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

Индикатор, пищалка, рассыпуха, несколько микрух серии К561. Два бочонка с проводами - герконовые реле.
Рядом с пищалкой, за верхним правым углом индикатора прячется сердце и мозг прибора - микросхема КР1016ВИ1. И она, и остальные микросхемы на плате датированы 1992 годом - то есть, формально, этот прибор уже постсоветский. Возможно, это наложило отпечаток на культуру производства.

Клавиатура сделана на отдельной плате и приклепана заклепками к основной. Не проще ли было выполнить все на одной плате? Разработчики уже вряд ли ответят. Возможно, они использовали уже готовую клавиатуру от другого устройства - чего добру пропадать?
На крепежных винтах нетронутая белая краска - значит, до меня в прибор никто не совался. Это радует. Отвинчиваем их все и снимаем плату.

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

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


Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

А это то, что под платой управления. Три дросселя в цепях питания нагрузок и самого прибора, пара симисторов КУ208, коммутирующих нагрузку. Вот тут разработчики молодцы - никаких подгорающих и греющихся контактов, никакого искрения, никаких помех. Респект!

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

Последнее фото прибора - вид снизу.

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

Вот так устроен этот неплохой для своего времени прибор. А что он умеет?

А умеет он довольно много:

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

Так. Стоп! Но как, ведь розеток у него сзади только две?

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

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

Выносное реле.

Эта черная коробочка включается в розетку, и третья нагрузка включается уже в нее.
Кстати, она может рулить нагрузкой мощностью до киловатта.
а вот те 2 встроенные розетки, согласно паспорту на прибор - не более 300 Вт каждая.
Люстру потянут, телевизор осилят, а вот колодезный насос или электроплитку уже нет.

Теперь о недостатках данного прибора:

То, что в него не лезут евровилки, недостатком не считаю - все таки родом он из СССР, ну не стояло тогда задачи обеспечить его совместимость с зарубежными стандартами.
Намного хуже то, что без питания и время и программы сбрасываются. Чтобы этого не случилось, требовались аж две батарейки Крона. А они денег стоят, и не всегда и не везде их можно было в советские времена найти. В то же время наручные часы с питанием от полуторавольтовой батарейки-пуговки в СССР уже существовали. И работали по паре лет до ее замены - такчто изготовители могли бы и встроить такие вот долгоиграющие RTC в устройство, а еще лучше в саму микросхему-таймер.

Второй недостаток - это сложный процесс управления и задания программ. На одной лишь интуиции даже текущее время выставить не сумеешь, а уж таймеры и программы и подавно.
Во всяком случае, с первого раза. Что такое user-friendly interface - в СССР явно не знали. Ну или не заморачивались этим. Те же бытовые таймеры из Леруа в этом плане гораздо более удобны и понятны.
Здксь же либо идти трудным путем проб и ошибок, либо - RTFM !

Советский "умный дом" Сделано в СССР, Электроника, Часы, Таймер, Реле времени, Красота, Бытовая техника, Длиннопост

Без этой книжки - никуда.

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

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

UPD:

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

При питании от сети он околонулевой - что неудивительно, в схеме применена диодная развязка.
При отсутствии сетевого питания потребляемый от Крон ток при молчащей пищалке колеблется от 3 до 4 миллиампер.
Если верить Википедии, емкость Кроны - около 0.5 А/ч
Так что при отключении сети хватит их меньше чем на неделю непрерывной работы. Но при редких и непродолжительных отключениях хорошие батарейки могут продержаться гораздо дольше - пока не умрут от саморазряда.

Показать полностью 9

Товарищи инженеры, теплотехники

Нужна помощь с расчётом количества конденсата в паропроводе.

Мне необходимо рассчитать потери пара при его транспортировки.

Может кто знает какие либо формулы или учебники где про это написано.

Я надеюсь за такие деньги они хотя бы вибрируют

Я надеюсь за такие деньги они хотя бы вибрируют

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Думаю, большинство моих читателей успела застать эру кнопочных телефонов с поддержкой Java-приложений. Помните ли вы, как мониторили разделы с загрузками на WAP-сайтах и ждали выхода новых игр, которые подойдут под ваш телефон и разрешение экрана? А какой восторг вызывали свежие 3D-игры, где графика с каждым релизом становилась всё лучше и была вполне на уровне PlayStation 1? V-Rally, Galaxy On Fire, Asphalt Urban GT, Deep3D, Sony Ericsson Tennis, Left 2 Die, Counter Terrorism 3D — думаю, хотя бы один из этих тайтлов вам знаком. Но задумывались ли вы, как работали эти игры «под капотом»? Каким образом разработчикам удавалось адаптировать полноценные 3D-шутеры и гонки под железо, где не было 3D-ускорителей (видеокарт), сопроцессора для чисел с плавающей точкой (FPU), а одноядерный процессор, работающий на частоте 100-200МГц, помимо игры обрабатывал ещё и звук, ввод, а также радиомодуль? Сегодня мы узнаем: как разрабатывали игры под J2ME, какие графические API существовали и на каких телефонах поддерживались, почему игры на Sony Ericsson шли лучше, чем на Nokia, а на «закуску» сами с нуля напишем 3D-бродилку в практической части! Интересно? Тогда добро пожаловать под кат!

❯ Предыстория


Обычно принято считать, что полноценные 3D-игры на кнопочных телефонах начали выходить примерно в 2004-2005 году, как раз с выходом графического API M3G. Однако, история мобильного трёхмерного гейминга тянется несколько дальше и уходит корнями в самое начало двухтысячных годов — как раз, когда телефоны только-только начинали обрастать мультимедийным функционалом.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Мы с вами привыкли, что существовали Java-игры для простых кнопочных телефонов и BREW-игры для телефонов Qualcomm. Но на рубеже нулевых сразу несколько перспективных компаний боролось за право стать разработчиком основной мобильной платформы и вытеснить J2ME. Одной из самых известных была Mophun, которая представляла из себя кроссплатформенную виртуальную машину, исполняющую байткод в собственном формате. И уже в ~2002-2003 году, Mophun представили 3D API для разработки очень симпатичных мобильных игр, которые и работали шустро.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Кстати, опробовать Mophun-библиотеку вы можете и сами: в РФ из Mophun-девайсов был как минимум Sony Ericsson T610, которые сейчас можно купить чуть ли не по «сотке» на вторичке.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Помимо Mophun, на французских телефонах производства Alcatel и Sagem была установлена платформа In-Fusio, тоже основанная на J2ME (а может и какой-то собственный сабсет API), однако со своим специфическим набором API, ориентированном на разработку игр. Мы с EXL даже в прошивке OT535 копались, прямо в HEX-редакторе, чтобы найти информацию о встроенной 2.5D-игре-бродилке:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Как можно заметить, спрос на 3D-игры появился практически в тот момент, когда в мобильные девайсы начали ставить достаточно мощные по тем годам процессоры: ~60-100МГц. Разработчики реально верили, что телефоны можно превратить не только в мультимедийное устройство, но и портативную хэндхэлд-консоль с графикой уровня не хуже GBA!

В сегодняшнем материале я хотел бы сосредоточиться именно на трехмерных Java-играх. Очевидно, что вручную рисовать 3D-графику без использования внешнего нативного API, написанного, например, на C, было бы проблематичным — девайс просто не вывез бы оверхеда Java-машины (хотя есть и исключение — некоторые 2.5D игры используют собственный портальный рендерер по типу того, что был в Duke Nukem 3D).

В процессе существования J2ME любая компания могла внести предложение по необязательному расширению мобильной платформы: это называется JCP (Java Community Process), а спецификации в ней — JSR. Таким образом, появилось множество разных расширений: AWT, GLES, M3G, PIM, Bluetooth API и примерно к 2005 году, M3G появился на большинстве кнопочных телефонов. Но мы ведь не одним M3G ограничены! Давайте глянем, какие ещё GAPI существовали на мобилках.

❯ Какие были 3D GAPI?


Под J2ME телефоны существовало сразу три стандартизированных графических API для отрисовки трёхмерной графики, которые были описаны в виде JSR. Вероятно, были ещё какие-то особенные API для телефонов из Азии (где традиционно телефоны акцентировались на играх с крутой 3D-графикой), однако они не поддерживались на обычных устройствах и информации о них очень мало.

Рассмотрим основные GAPI, которые использовались на большинстве телефонов:

  • M3G JSR184: Mobile 3D Graphics — самый популярный графический API, который поддерживался на большинстве Java-телефонов. Известен своей открытостью, функционалом и довольно неплохой производительностью. Строго говоря, M3G — это не только Immediate API для отрисовки треугольников в духе OpenGL или D3D как мы привыкли, но и уже готовый граф сцены (а-ля Unity), формат моделей, система материалов, обработки столкновений, освещения и т. д. Был достаточно хорошо оптимизирован и имел низкий порог вхождения, благодаря чему стал стандартом на мобилках.

  • Mascot Capsule: графический движок, разработанный японской компанией Hi Corp. Использовался в основном на телефонах для азиатского рынка и выдавал очень хороший на момент выхода уровень графики. Во многих аспектах лучше, чем M3G, однако порог вхождения в него несколько выше. Несколько напоминает D3D/OpenGL. Поддерживался на Sony Ericsson и на Motorola.

  • OpenGL ES JSR239: поддерживался только на некоторых моделях и вышел достаточно поздно (в контексте Java-телефонов), из-за чего популярности на простых телефонах не получил, зато активно использовался в смартфонах (стоит взглянуть на игры для iPhone 2G для сравнения). Является самым «тяжелым» и функциональным графическим API из перечисленных. Что интересно: изначально Google полностью перенесли JSR239 на Android, дабы поспособствовать портированию игр с Java-телефонов на смартфоны с зеленым роботом. По первой это, скорее всего, даже помогало.


Большинство читателей застали игры, использующие именно платформу M3G, которая, помимо отрисовки 3D-графики, предоставляла ещё много самых разных фишек: например, уже упомянутый граф сцены с собственным форматом файлов. Поскольку плагины для импорта и экспорта в 3d max были доступны каждому, а сам M3G плохо располагает к тому, чтобы использовать собственные форматы файлов, вскоре на некоторые игры начали повально появляться моды. Пожалуй, одним из рекордсменов по числу модов является игра Left 2 Die, которую как только не переделывали: и под Half-Life, и под Quake, и под обычную Left 4 Dead закос делали… чего только не было

Другой игрой, на которую часто делали моды — это Comcraft, написанная студентом в начале 2010-х годов. Там, в основном, моды имели чисто характер ретекстура а-ля «новые типы блоков». Всё это было возможно благодаря наличию на Java-телефонах различных Zip-архиваторов, благодаря чему молодые моддеры могли перепаковывать ресурсы игр как им угодно.

Ну и третья легендарная игра, которую расковыряли через пару лет после выхода — это, конечно-же, Galaxy on Fire 2. Изначально, она была рассчитана для запуска на мощных устройствах уровня Symbian-смартфонов и телефонов Sony Ericsson. Однако умельцы урезали звуки, музыку и игра запускалась даже на s40!

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

А вот с глобальными модами, меняющими геймплей игры, не задалось. Несмотря на то, что программы на Java легко декомпилируются, большинство разработчиков обфусцировали код при публикации игры. По каким-то причинам никто не хотел копаться и деобфусцировать чужой код (хотя это явно гораздо проще, чем копаться в нативном коде в IDA Pro) и хотя бы попытаться сделать некоторое подобие «SDK для модов». Увы :(

❯ Секреты производительности


Характеристики типичного кнопочного телефона тех лет были не особо впечатляющими:

  • Процессор: 104-200МГц, ARM926EJ-S ядро, иногда с поддержкой нативного выполнения Java-байткода. Без сопроцессора для чисел с плавающей точкой (FPU), без какого-либо видеоускорителя (за некоторыми исключениями) — вся нагрузка ложилась на процессор и иногда вспомогательный DSP.

  • ОЗУ: 8-16Мб SDRAM-памяти. Java-приложениям не доставалась вся память, а лишь её небольшой кусок, называемый кучей (Heap). Обычно размер Heap был от 800Кб до 2Мб. Умельцы даже патчили Java-машины некоторых телефонах, дабы выделить программам больше памяти. От размера кучи зависела работа тяжелый игр и программ: когда heap заканчивался, приложение падало в OutOfMemoryException.

  • Память: 10Мб-8Гб Flash-памяти.

  • Дисплей: CSTN, TN или AMOLED (редко) матрица с разрешением от 128x128, до 480x320 (возможно бывало и выше).


Очевидно, что на устройстве с такими характеристиками классические техники отрисовки 3D-графики не будут работать из-за малого количества памяти. Поэтому в ход шли некоторые интересные хаки, знакомые нам со времен PlayStation 1 и даже более старых консолей!

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

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

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

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

В современных приложениях, для сортировки геометрии по удаленности от наблюдателя используется screen-space техника Z-buffering, которая позволяет «дешево» отсекать невидимую глазу часть геометрии. Принцип её прост: по размерам окна приложения создаётся буфер, где каждый пиксель содержит информацию не о цветности, а о дальности фрагмента в этой конкретной точке. По итогу, во время отрисовки машинки, в Z-буфер будет записана глубина (дальность) конкретного фрагмента (участка геометрии), а когда будет нарисована домик, то видеочип сравнит значение глубины фрагмента машинки с машинкой и если значение глубины, хранящееся в буфере окажется меньше (или больше — зависит от реализации) прошлого значения — тогда часть машинки будет нарисована там, где нужно. Думаю, такое объяснение более чем понятное :)

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Однако, Z-буфер требует драгоценную память (минимум ширина экрана * высота экрана * 2 — число байт в half float — т. е. 153 килобайта для экрана 240х320 как минимум) и наличие FPU для достаточной точности буфера глубины. Если же попробовать использовать обычные числа для этого, то вскоре мы столкнемся с проблемами точности, из-за чего будем видеть depth-fighting и от техники будет больше проблем, чем пользы.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

В телефонах используется точно такая же техника, как и в PS1: сортировка отдельных полигонов. На PS1 с этим помогал отдельный векторный сопроцессор, который управлял трансформацией геометрии, освещением и мог эффективно сортировать треугольники, не нагружая основной процессор. А вот на телефонах этим занят основной процессор, вместе с растеризацией, обработкой игровой логики, звука и радиомодуля. Поэтому для корректной сортировки, вся отрисовка в GAPI на телефонах делится на «батчи», где программист отсылает набор нужных ему команд (отрисовать такую-то модельку с такой-то текстурой и такой-то трансформацией), а API затем уже трансформирует и сортирует вершины наиболее эффективным способом.

Второй интересный момент — это система координат. Как я уже говорил ранее, аппаратной поддержки float-чисел в телефонах зачастую не было. Однако j2me-машина и компилятор C (в те годы для прошивок чаще использовали ADS, чем GCC) предоставляли программную реализацию float-чисел, которая была ощутимо медленнее аппаратного FPU. Поэтому даже такие операции, как вычисление синуса и косинуса могли стать относительно тяжелыми для телефона, чего уж говорить о перемножении матриц.
Для обхода этого ограничения использовалось две техники: fixed-point числа, где число с дробной частью представлено в виде обычного целого чисел, с которым умеет работать процессор (M3G) и обычные целые числа, которые представляют нормализованные числа 0.0… 1.0 (Mascot Capsule). Оба способа имеют ограниченную точность и в некоторых моментах могут давать артефакты, но здесь всё сильно зависит от самой игры. Например, из-за низкой точности при движении персонажа мир может «трясти».

И третий момент — это текстурирование и освещение. Сама концепция идентична той, которая используется в большинстве современных игр, однако из неё исключается важный этап: перспективно-корректное наложение текстур. Если говорить простыми словами, то при линейном наложении текстуры на геометрию «как есть», если подойти к модельке домика слишком близко — мы увидим искажения текстуры на его поверхности. Другой пример — шахматная доска, которая при приближении будет не идеально ровной, а если подойти совсем близко — то мы получим серьезные артефакты, которые полностью исказят визуальное представление. Для перспективной коррекции нужен тоже нужен FPU: это не бесплатная операция, поэтому от неё обычно отказываются (исключение — M3G), потому игры под J2ME иногда выглядят весьма странно:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Один из «универсальных» советов: желательно на этапе проектирования уровня и геймплея не ставить слишком близко друг к другу разные объекты и не давать камере игрока «смотреть» слишком близко на большие объекты.

В процессе подготовки статьи, я декомпилировал и изучил несколько 2.5D-игр из нулевых а-ля Wolfenstein 3D. Многие из них для лучшей производительности использовали пакет Nokia UI с DirectGraphics, который предоставлял некоторые плюшки для 2D-игр и возможность блиттинга произвольных изображений напрямую в экранный буфер. Там разработчики на что только не шли: и классический рейкастинг, и портальный рендерер — и всё это работало довольно шустро :)

Но вы ведь сюда не учебник по «матану» и не OpenGL Red Book пришли читать, верно? Поэтому давайте напишем свою 3D-бродилку под Java-телефоны с нуля! Да, это не совсем игра, но даст явное представление о том, как писали игры в те годы.

❯ Пишем свою «игру» с нуля


А напишем мы не просто что-то совсем примитивное, а основу для 3D-шутера от первого лица! Да, вот так сразу :) Конечно, не уровень Crysis, графика из 90-х, но для кнопочных девайсов вполне неплохо. Более того, эту игрушку я написал за полтора дня: основной рендерер за полдня и ещё какую-то базовую часть геймплея за день.

В качестве графического API я решил использовать Mascot Capsule. Материала о нём в сети относительно мало и для многих вообще остается загадкой, как он работает «под капотом». Про M3G писал немного aNNiMON, да и некоторая информация в сети есть, а про JSR239 особо из-за плохой поддержки на реальных девайсах. Тут важно понимать, что M3G и Mascot Capsule — это не DX11 и не Vulkan, порог вхождения у них достаточно низкий и понять их довольно легко, если иметь базовые представления о том, как работает 3D-графика. Поэтому создаём проект, мидлет (приложение в терминологии J2ME) и погнали!

Рендерер


Начинаем, конечно же, с инициализации контекста.
В J2ME принято наследоваться от GameCanvas и реализовывать игровой цикл именно в нём. Для начала работы с MascotCapsule и M3G достаточно лишь создать объект Graphics3D (в случае M3G — получить ссылку на синглтон), а также выделить необходимые ресурсы — в нашем случае, это матрицы, которые здесь называются AffineTrans.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Самый примитивный игровой цикл будет выглядеть так. Сначала мы заливаем экран цветом для предотвращения эффекта Hall of mirrors и биндим объект Graphics к Mascot Capsule, затем рисуем сцену и освобождаем контекст, а потом вызываем flushGraphics для вывода изображения на экран:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Результат: синий экран.

Давайте что-нибудь нарисуем. Mascot Capsule может использовать как собственный формат моделей mbac и формат анимаций с ActionTable, так и произвольную геометрию. Юзать готовые форматы слишком просто, да и накатывать 3ds Max с плагинами не очень хочется, поэтому мы будем генерировать геометрию сами. Начнем с отрисовки треугольника и трансформации геометрии.

Effect3D — это материал в терминологии Mascot Capsule. Данный объект позволяет задавать визуальные параметры для геометрии: освещение и источник света, Toon-shading для придания эффекта мультяшности, настройки альфа-блендинга и некоторых других эффектов.

Далее идёт трансформация геометрии: процесс преобразования треугольников из локальной системы координат в мировую, экранную и затем уже Clip-space.
Где affineMatrix — основная матрица, хранящая в себе результат перемножения viewProj матриц, а affineRotationY и affineTranslate — матрицы трансформации сначала для камеры, а затем уже для преобразования модели в мировые координаты. При этом проекция — тоже часть AffineTrans. Вот такая вот путаница.

В FOV (512) задается значение в радианах, где 0 — это 0, 4096 — это 3.14 * 2 (360 градусов). Это же касается и углов в поворотах.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Обратите внимание — матрицы имеют размерность 3x3, а не 4x4, как это принято в «больших» системах. translate здесь нет — только lookAt.

Идём дальше — к фактической отрисовке треугольников. Геометрия может иметь текстурные координаты, цвета и нормали. Формат вершины можно задавать динамически — необязательно передавать сразу все аттрибуты вершин. Из-за особенностей Mascot Capsule, геометрия не будет отрисована, если не переданы текстурные координаты или цвет.

UV-координаты указываются в абсолютных координатах текстуры. т. е. не 0..255, как на 3dfx Voodoo, например, а 0… ширина текстуры и 0… высота текстуры. Учитывая, что класс текстуры не позволяет даже её размер узнать… решение так себе.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Результат:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Добавляем второй треугольник, дабы нарисовать квад:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

На этом, половина рендерера написана. Я не шучу :)

Теперь генерируем геометрию для кубика. Для наглядности я написал простенький класс для генерации геометрии на лету. Отдельный формат для моделей нам пока не нужен, поэтому я «запеку» геометрию в отдельный массив вершин.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Результат:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Текстурированные кубики рисовать умеем, камера у нас тоже есть: уже можно реализовать бродилку :)

Уровни


Уровни делать мы будем… прямо в IDE. Каким образом? Уровень будет храниться классическим для подобных игр способом: сетка x на x, где каждое число указывает ID-текстуры (и в оставшихся битах можно разместить какие-нибудь атрибуты), где 0 — блок отсутствует. Все блоки предполагаются твердыми.

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

З.Ы На Пикабу нет тега с кодом, поэтому пришлось вставлять код в виде скринов. А поскольку на кол-во медиа-элементов в посте есть ограничение в 25 блоков, пришлось остальной код кастрировать :(

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

https://pastebin.com/cwrZ4vDJ

Результат:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Теперь нам необходимо реализовать возможность ходьбы по уровню. Для этого мы будем поворачивать камеру по координате Y при нажатии кнопок вправо и влево, а для движения вперед и назад вычислять forward-вектор, указывающий на направление персонажа относительно угла поворота, который представляет из себя синус и косинус угла поворота персонажа в радианах.

Напомню, что углы хранятся в виде 4096 = 360гр. = 3.14 * 2.

https://pastebin.com/1Hy26kfk

Теперь наш персонаж умеет ходить!

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

Смешивать Graphics и Graphics3D одновременно нельзя — сильно падает производительность. А вот использовать Graphics для отрисовки интерфейса поверх Graphics3D после отрисовки кадра — можно! Суть хака простая: рисуем с ортографической (параллельной) матрицей половинку экрана с текстурой неба, а вторую половинку — просто серый квад. Всё очень легко и просто!

https://pastebin.com/4P6DRB7V

Рисуем оружие поверх экрана и получаем некое подобие 3D-шутера.

Game.current.renderer.getGraphics().drawImage(weapon, Game.current.renderer.getWidth() - weapon.getWidth() + (int)viewBobFactor, Game.current.renderer.getHeight() - weapon.getHeight(), Graphics.LEFT | Graphics.TOP);

Результат:

Сам написал, сам поиграл: как работали трёхмерные игры на кнопочных телефонах нулевых? Пишем 3D-шутер с нуля Опрос, Гаджеты, Программирование, Графика, 3D графика, Игры, Gamedev, Opengl, Sony Ericsson, Nokia, Телефон, Кнопочники, Ностальгия, Видео, YouTube, Без звука, Вертикальное видео, Длиннопост

Обратите внимание на все артефакты, о которых я рассказывал в разделе оптимизации игр. И текстуры плывут, и мир дребезжит — всё это результаты оптимизаций со стороны разработчиков GAPI. Зато работает шустро!

Обработка столкновений


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

Принцип прост: обычная проверка AABB, весь резолвинг — это откидывание игрока обратно, если после последнего движения он «врезался в стену».

https://pastebin.com/jqT7d5XM

Можно считать, что основа игры уже готова.

❯ Что у нас получилось?


Давайте посмотрим. Запускаем бродилку в эмуляторе:

Но как насчет реального девайса? Для тестов у меня есть SE W200i, W610i и J10i2!
Все поддерживают Mascot Capsule, так что с тестами проблем не будет. Ниже тест на W200i, на остальных девайсах в моем первом комменте - Пикабу не даёт загрузить слишком много картинок/видео в один пост :(

❯ Заключение


Вот как-то так в нулевых и писали 3D-игры для кнопочных телефонов. Да, мы практически не затронули тему 3D-игр на Symbian-смартфонах (ранее я писал статью о разработке игры под WinMobile), но обсудили множество тонкостей и написали собственный Proof of Concept бродилки для подобных Java-мобилок. Исходным кодом бродилки я делюсь, кто угодно может использовать его как основу для своей игры или что-то типа такого. По крайней мере, видел пару лет назад несколько Java-игр, которые кто-то всё ещё делает.

Пишите свой опыт с Java-играми в комментариях :)

P. S.: Друзья! Время от времени я пишу пост о поиске различных китайских девайсов (подделок, реплик, закосов на айфоны, самсунги, сони, HTC и т. п.) для будущих статей. Однако очень часто читатели пишут «где ж ты был месяц назад, мешок таких выбросил!», поэтому я решил в заключение каждой статьи вставлять объявление о поиске девайсов для контента. Есть желание что-то выкинуть или отправить в чермет? Даже нерабочую «невключайку» или полурабочую? А может, у этих девайсов есть шанс на более интересное существование! Смотрите в соответствующем посте, что я делаю с китайскими подделками на айфоны, самсунги, макбуки и айпады!

Понравился материал? У меня есть канал в Телеге, куда я публикую бэкстейдж со статей, всякие мысли и советы касательно ремонта и программирования под различные девайсы, а также вовремя публикую ссылки на свои новые статьи. 1-2 поста в день, никакого мусора!

Понравился материал?
Всего голосов:
Всё ли вам было понятно?
Всего голосов:

Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, дабы не пропускать новые статьи каждую неделю!

Показать полностью 21 3 2

Ретропонедельник №132. Игра MerryCook

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

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

Игра - клон Chief из серии nintendo Game&watch, оригинально выпущенная в 1981 году.

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

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

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

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

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

Внутри специализированная БИС. ПП имеет маску, что встречается не так часто.

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

ЖКИ подключается токопроводящими резинками. Увы, после разборки и обратной сборки они доставили проблемы, за 30 лет потеряли эластичность и должного контакта не обеспечили. Не разбирайте работающие игры.

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

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

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост
Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

По историям этих игр рекомендую: Флоран Гордж. История Nintendo в 4 томах. Книжки переведены с большой любовью, для третьего тома специально написана глава про самый популярный у нас клон - денди. Второй том как раз посвящен game&watch.

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост
Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост

Меня весьма забавляют монстры, вроде гибрида игры и дозиметра. Техническая логика в этом есть, но сочетание всё-равно сюрреалистичное.

Ретропонедельник №132. Игра MerryCook Электроника, Сделано в СССР, Виртуальный музей, Игры, Техника, Познавательно, Винтаж, Изобретения, Длиннопост
Показать полностью 10

Компьютерный мастер. Часть 351.Забудьте эти мифы про аккумуляторы!!!!

Компьютерный мастер. Часть 351.Забудьте эти мифы про аккумуляторы!!!! Глупость, Аккумулятор, Техника, Мифы, Лайфхак

Написанное выше, это самый опасный МИФ для аккумуляторных батарей любого современного ноутбука или телефона... Современные Литий-ионные(Литий-полимерные) Li-pol аккумуляторы, нельзя разряжать в ноль, они теряют от этого емкость... У меня ноуту 5 лет, я постоянно работаю от аккумулятора, но знаю правило 10% осталось пора на зарядку, любой разряд в ноль, это потеря емкости аккумулятора на будущее... у меня трёх летний андроид до сих пор держит полтора дня, а всё потому что я никогда его не разряжаю в ноль...

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

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

Поиграем в бизнесменов?

Одна вакансия, два кандидата. Сможете выбрать лучшего? И так пять раз.

СДЕЛАТЬ ВЫБОР

А вы помните, как качали 3D-игры с WAP-сайтов для своих кнопочных Nokia/Sony Ericsson/Motorola?

Сейчас активно готовлю материал о том, как работали 3D-игры "под капотом" на слабеньких кнопочниках, каким образом разработчикам удавалось достичь приемлемый FPS и какие графические API для отрисовки трехмерной графики существовали на Java-телефонах. А дабы материал не был голословным, в практической части мы с нуля напишем 3D-шутер "а-ля 90е" с использованием Mascot Capsule и погоняем его на реальном телефоне Sony Ericsson! Материал выйдет в течении следующей недели (скорее всего среда-четверг).

Интересно?
Всего голосов:
Показать полностью 1
Отличная работа, все прочитано!