monobogdan

monobogdan

Топовый автор
На Пикабу
Дата рождения: 25 сентября
user7465945 SApex ridiculsk8
ridiculsk8 и еще 93 донатера
в топе авторов на 410 месте

Собираем на будущий контент!

Все деньги с донатов пойдут на апгрейд оборудования, покупку интересных гаджетов и конечно крутые статьи!

1 050 3 950
из 5 000 собрано осталось собрать
130К рейтинг 4108 подписчиков 0 подписок 456 постов 396 в горячем
Награды:
5 лет на Пикабу За киноманство За участие в Авторской неделеболее 1000 подписчиков Высокий разум
187
TECHNO BROTHER

Трудности разработки Java-игр: каким был мобильный геймдев нулевых? [Длиннопост про разработку]

Для ЛЛ: в двух словах не описать, длиннопост уж очень большой :)

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

Содержание:

  1. Предисловие

  2. Реалии разработки

  3. Как игры работали «изнутри»?

  4. Что стало с J2ME

  5. Заключение

❯ Предисловие

Пожалуй, мобильный гейминг как класс зародился в самом начале двухтысячных годов. В какой-то момент, производители телефонов смекнули, что помимо задач обработки GSM-стека, у чипсета остаётся достаточно процессорного времени для обработки второстепенных задач, благодаря чему в телефонах начал появляться дополнительный функционал: к примеру — игры. И хотя первой мобильной игрой был клон Тетриса в Hagenuk MT-2000 1994 года выпуска, на практике игровые перспективы в телефонах увидели только в 2000 году, когда компания Sun выпустила спецификации стандартов CLDC 1.0 и MIDP 1.0.

Siemens SL45i — один из первых телефонов с поддержкой Java-приложений.

Siemens SL45i — один из первых телефонов с поддержкой Java-приложений.

Дело в том, что в те годы телефоны работали на целом зоопарке самого разного железа и операционных систем. За год-два в телефонах одного производителя могло измениться всё: та же Motorola внезапно перешла с кастомной GSM-платформы на базе m68k в StarTAC'ах на стандартный TI HERCROM с ядром ARM7TDMI в телефонах линейки Talkabout, параллельно развивая свою собственную архитектуру M-Core в устройствах для CDMA-сетей. А Siemens, к примеру, использовали процессоры разработки Infineon под названием E-Gold, построенные на собственной архитектуре C166s, которые уже через несколько лет заменили на S-Gold'ы, построенные на ядре ARM926EJ-S. Для решения этой проблемы, компания Sun предложила миниатюрную Java-машину с набором стандартизированных API и свободным SDK, которые в теории позволяли легко разрабатывать программы, не зависящие от конкретного телефона. И имя этой машине — KVM (Key Virtual Machine), а мобильный профиль назвали J2ME (Java 2 MicroEdition).

Сердце Siemens M55 — тот самый процессор Infineon E-Gold

Сердце Siemens M55 — тот самый процессор Infineon E-Gold

Набор API в первых телефонах с поддержкой Java был небогатым и состоял из CLDC — базовой инфраструктуры языка, и MIDP — набора классов для работы с «железом» устройства. Присутствовали пакеты для работы с дисплеем и создания простенького интерфейса (lcdui), примитивной работы с сетью (microedition.io), а также хранения данных (rms). При этом основная инфраструктура языка во многом была совместима с обычной Java версии 1.3 — то есть были классические потоки, коллекции (Vector, Stack, Hashtable — и это ещё не дженерики), генератор псевдослучайных чисел, исключения и даже минимальная рефлексия (Class.forName и Class.newInstance). Однако у CLDC 1.0 был один неприятный нюанс — он не поддерживал Float вообще ни в каком виде, из-за чего классы при компиляции проходили верификацию и дополнительную оптимизацию специальной утилитой — preverify.

Это весь java.util в CLDC 1.0. Сравните с современной реализацией этого пакета :)

Это весь java.util в CLDC 1.0. Сравните с современной реализацией этого пакета :)

И по правде сказать, этого набора API было слишком мало для разработки хоть сколь либо серьезных приложений и игр. Объём RMS был жёстко ограничен несколькими килобайтами, графическое API не умело рисовать кусочки изображения из атласов и использовать полупрозрачность, а о воспроизведении звука вообще можно было не мечтать. И это было справедливо для моделей 2001 года выпуска, но уже в 2002 начали появляться куда более продвинутые устройства с цветными дисплеями, полифонией и большим объёмом памяти. Каждый производитель начал реализовывать своё собственное API, из-за чего стали плодится отдельные версии приложений адаптированные для разных телефонов — Opera Mini S40 128x128, Gangstar SE 176x220, Prince Of Persia Mot 128x160...

Nokia 3300 2003 года выпуска. Один из первых телефонов с поддержкой Nokia API.

Nokia 3300 2003 года выпуска. Один из первых телефонов с поддержкой Nokia API.

Но MIDP 1.0 был отнюдь не бесполезен как может показаться на первый взгляд. Именно под него разрабатывались первые версии Opera MIni, Jimm и самые первые Java-игры. Клон Pac-Man на SGH C100 как раз один из таких.

Однако уже в 2002 году появилась спецификация MIDP 2.0, которая привносила возможность воспроизведения звуков и музыки, проверки подписи приложений, а также продвинутое API для отрисовки графики и работы с расширениями. Несмотря на готовность спецификации, первые телефоны с поддержкой MIDP 2.0 появились только в 2003 году — это была Nokia 6600, а также Siemens S55/M55. И вот с Siemens'ами была небольшая загвоздка — их реализация MIDP 2.0 была обернута в отдельное Siemens API и не была на 100% совместима с Sun'овской, настоящая поддержка появилась лишь через год — в 2004 году. Остальные же производители продолжали использовать MIDP 1.0, включая Sony Ericsson (T610), Samsung (C100) и модели Nokia на платформе S40.

А уже в 2004 году, J2ME стала по настоящему популярной платформой. Появились сторонние лицензируемые реализации Java-машин и MIDP — Esmertec JBed и Aplix JBlend, на телефонах стала возможной отрисовка 3D-графики в реальном времени благодаря M3G и Mascot Capsule, а также начали появляться первые AA-игры от Gameloft — как, например, тот же самый Asphalt. Sun пошли ещё дальше и умудрились уговорить ARM на реализацию отдельного набора инструкций для ускорения JVM — Jazelle. Это, вероятно, первый и последний пример, когда JIT реализовывается не на уровне VM, а на уровне ISA процессора...

И на первый взгляд может показаться, что у Java банально не было конкурентов, однако это не так. Как раз таки конкурентов у J2ME было сразу три. Первый — это платформа Mophun, которая представляла из себя игровой движок с очень быстрым программным растеризатором 3D-графики и собственным C-подобным скриптовым языком. Заточен он был исключительно под игры и на нём вышло несколько очень крутых, на момент выхода, игр. Например, Lock'n'Load:

Mophun провалился как раз из-за ориентира только на игры. Насколько мне известно, API для других целей там просто не было. Второй платформой была ExEn от французской компании In-Fusio, которая также позволяла писать приложения на Java, но имела больший ориентир на игры. Однако её можно было найти только в французских (Alcatel One Touch, Sagem) и нескольких японских телефонах, а также у неё было жёсткое DRM, что помешало ей стать «народной». Чуть позже, In-Fusio начала предлагать ExEn как один из пакетов для «обычных» JVM, но платформа прекратила существование уже в середине 2000-х...

Alcatel One Touch 535 — один из немногих телефонов с поддержкой ExEn. Давно хочу себе подобный Alcatel поковырять, но почему-то не попадались ни разу.

Alcatel One Touch 535 — один из немногих телефонов с поддержкой ExEn. Давно хочу себе подобный Alcatel поковырять, но почему-то не попадались ни разу.

А третьей платформой был BREW от компании Qualcomm. И по правде сказать, он был куда круче любой JVM — ведь предлагал писать полностью нативные программы на C, используя всю потенциальную мощность устройства. Но Qualcomm не был бы Qualcomm'ом, если бы не ограничил использование BREW только на телефонах с собственными чипсетами и RexOS, а также не отгородил всё отвратительным DRM. Впрочем, это тоже можно простить, ведь Qualcomm уже тогда был доминантном и двигателем прогресса телефонов, поскольку уже в 2004 году разработал и интегрировал собственный 3D-ускоритель. Но это уже совсем другая история...

Сейчас такая графика может показаться смешной, но в те годы видеоускоритель Defender3D творил чудеса. Игра с очень неплохой графикой и в 25-30 FPS на обычном кнопочном телефоне?! Невиданно!

Сейчас такая графика может показаться смешной, но в те годы видеоускоритель Defender3D творил чудеса. Игра с очень неплохой графикой и в 25-30 FPS на обычном кнопочном телефоне?! Невиданно!

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

❯ Реалии разработки

Как и сейчас, в те годы мобильными играми в основном занимались небольшие команды. Условно был программист, который недавно постиг Java, перейдя на него с Delphi или C++, пару художников, которые рисовали всю графику в игре, а также отдельный звуковик, в задачи которого входило написание midi-музыки и иногда таких же midi-эффектов. Магазинов ассетов и соответственно ассет-флипа как класса ещё не существовало, поэтому всё в игре делали своими руками «как умели». Наверное одним из лучших примеров таких студий будет харьковская NetSoftware, известная своими играми серии «Бункер 3D»:

Что такое ассет-флип?

Сегодня у двух самых популярных движков — Unity и Unreal Engine, есть собственные магазины с ресурсами для игр. В них можно купить как обычные модели, текстуры и саундпаки, так и целые уровни вместе с шаблонами игр. Ассет-флипом называются те игры, которые либо построены на базе популярного шаблона игр (помним бесчисленные низкокачественные шутеры с всякими Ultimate FPS Controller или «симуляторы вождения» на базе Edy's Vehicle Phyiscs?) с минимальными геймплейными изменениями относительно шаблона, либо игры с собственной логикой и геймплеем, которые неизменно используют уже готовые уровни.

Свастику мы осуждаем, а вот авторов из NetSoftware хвалим за крутейший 2.5D-рейкастер, который шустро бегал даже на слабых телефонах и в отличии от оригинального Wolfenstein поддерживал стены под углом, а также объёмные «пропы».

Свастику мы осуждаем, а вот авторов из NetSoftware хвалим за крутейший 2.5D-рейкастер, который шустро бегал даже на слабых телефонах и в отличии от оригинального Wolfenstein поддерживал стены под углом, а также объёмные «пропы».

И вот, ребята разработали игру и хотят заработать денюжку на её продаже. Тогда ещё возможности самиздата не было, а также не существовало монетизации за счёт рекламы и донатов (кроме немногочисленных MMORPG), поэтому игры продавались по цене примерно в 3-4$ напрямую, а покупка осуществлялась отправкой СМС на... да вообще любой номер! Магазинов было просто куча, ни о каком едином сторе (кроме Samsung Fun Club, портала Nokia и Sony Ericsson) и речи не было, а каталоги Java-игр можно было найти в женских журналах, в ТВ-рекламе и даже на сайтах ОпСоСов (Оператор Сотовой Связи)! После отправки СМС, пользователь получал ссылку на WAP-сайт, откуда он мог скачать jad-файл игры (дескриптор с описанием приложения), после чего телефон докачивал соответствующий jar. И всё это без скриншотов, без возможности возврата средств, ориентируясь исключительно на обложку игры и известное название...

Насколько мне известно, небольшие команды чаще всего шли к издателям по типу Qplaze, NetLizard (Украина) и Herocraft (Россия), которые и занимались налаживанием контактов с таким ворохом каналов распространения, а также реализацией биллинга с «антипиратской защитой». Дело в том, что помимо «слепой» покупки игры также были популярны Shareware-игры: играешь 90 секунд бесплатно, затем игра просит отправить СМС для получения кода активации и если пользователь соглашается — то получал полную версию игры. И вот тут то модель распространения давала сбой: Java ведь компилируется в байткод, и даже после обфускации его можно превратить в читаемый и относительно собираемый исходный код. Путём простого патчинга байткода биллинга (того самого окошка «оплатите игру") можно было "вылечить игру от жадности" и выложить куда-нибудь на seclub, sefan, spaces или tegos версию с "таблэткой":

А ведь были ещё и телефоны, которые jad-файл могли не только сразу установить, но и скачать в память телефона — причём вместе с jar. И вот тут активизировалось сарафанное радио: один купил игру, скинул другу (нередко за пирожок в столовой, кэшбек же), тот скинул своему другу, а он залил на wap-сайт... короче пиратство было настолько распространено, что я даже в теории не могу предположить сколько там упущенной прибыли :)

STALKER Mobile — одна из самых желанных 3D-игр на телефоны нулевых.

STALKER Mobile — одна из самых желанных 3D-игр на телефоны нулевых.

А ещё был хорошо налажен конвейер копирования успешных идей. Однако если сейчас в основном копируются свежие геймплейные идеи гиперказуальных игр, то тогда пытались один в один скопировать целые игровые вселенные. Вспомнить только Gameloft с её AAA-играми по мотивам GTA (Gangstar), Need for Speed (Asphalt) и даже Call of Duty (Modern Combat). В СНГ же такой фирмой была NetLizard, которая в основном делала упор на популярные игровые вселенные и постсоветский колорит (Ликвидатор ЧАЭС — её разработка). Кроме того, не было никаких особых ограничений на распространение эротических и даже порнографических игр — и они свободно распространялись даже в журналах (с особо сочными описаниями)!

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

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

❯ Как это работало?

Однако пожалуй самое интересно это то, как мобильные игры тех лет работали «под капотом». Ведь в отличии от современных устройств, на кнопочных телефонах нельзя было разгуляться с абстракциями, раскидываться аллокациями на куче, и даже использование floating-point арифметики было нежелательным. Более того, многие разработчики намеренно отказывались не только от любых абстракций, но и просто от концепции классов или стандартных паттернов организации сцены/состояний, предпочитая создавать God-объекты для целых игр. В одном классе мог быть код и обработки состояний (меню, игра), и загрузки уровней, и отрисовки, и обработки логики. Нередко отказывались даже от стандартных коллекций типа Vector и структур данных, предпочитая реализовывать статические пулы-массивы с данными для каждого игрового объекта. Как бы это забавно не звучало в контексте Java, но чаще всего использовали процедурный подход программирования:

Это главный класс игры «Ликвидатор ЧАЭС» весом в 56КБ, который сочетает в себе вообще всю логику игры. Как вам такое?

Это главный класс игры «Ликвидатор ЧАЭС» весом в 56КБ, который сочетает в себе вообще всю логику игры. Как вам такое?

На первый взгляд может показаться, что программисты были просто неопытными и писали «как умели». Однако на практике это была одна из фундаментальных оптимизаций: во первых, статические пулы с примитивными типами данных избегали дорогого боксинга (управляемые контейнеры над примитивными типами. int - Integer, float - Float). Использование структур было не всегда оправданным из-за относительно высокой цены аллокации (а в J2ME они всегда на «куче», в отличии от .NET. Засовывать мелкие объекты в Eden-space те JVM ещё не умели) и примитивности GC. А во вторых, в некоторых JVM верификация почему-то выполнялась не при установке приложения, а при первой загрузке класса ClassLoader'ом. И процесс верификации мог заметно затормозить приложение, при этом съев ещё немного памяти для данных о загруженном классе.

Другое дело — классы из системных пакетов. Они всегда загружены и обычно являются тонкими прослойками к native-реализациям методов.

Другое дело — классы из системных пакетов. Они всегда загружены и обычно являются тонкими прослойками к native-реализациям методов.

Ведь когда мы говорим о Java-телефонах, то чаще всего имеем ввиду не топовые Symbian-смартфоны у которых было 2МБ и более хипа, а о бюджетных кнопочных устройствах по типу Nokia 6060 или Samsung C3010, где хипа едва-ли был 1 мегабайт, а порой и вообще ~500КБ. И в это пространство нужно уместить всё: графику, уровни, звуки с музыкой и конечно код игры. Поэтому разработчики и шли на такие ухищрения. Кроме того, как раз тот самый верификатор был занозой в заднице любителям абстракций: даже если движок игры технически позволял использовать Nokia API на S40 телефонах, Sony Ericsson API на SE и обычный MIDP 2.0 на Samsung'ах, Java-машина при установке может просто прервать процесс сообщением «класс не найден»...

Чтобы примерно понимать с каким железом приходилось иметь дело программистам из нулевых, давайте рассмотрим спецификации бюджетного Samsung SGH-E250 образца 2006 года:

  • Процессор: NXP PNX5230 с одним ядром ARM946E-S, работающим на частоте до 130МГц. В 2007 году уже чаще встречалось более мощное ядро ARM926EJ-S, которое работало на частоте до 208МГц.

  • Память: 16МБ оперативной, из которых Java-приложениям было доступно около 1.5МБ, а также 32МБ постоянной. Для Jar-приложений было строгое ограничение — 250КБ.

  • Дисплей: 128x160 TFT-TN, 16-битный.

  • Поддерживаемые API: JSR75, JSR85, JSR120.

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

Nokia 6060 — типичный бюджетник, на который ориентировались при разработке игры.

Nokia 6060 — типичный бюджетник, на который ориентировались при разработке игры.

Второй проблемой была графика и разные разрешения экрана. В качестве основного формата изображений, в J2ME был выбран png из-за простоты реализации загрузчика, высокой lossless-компрессии, а также свободности Zlib. Формат png в своей основе подразумевает 32х-битный формат цвета с 4-мя компонентами: R, G, B и A. A — это альфа-канал или степень прозрачности пикселя, и вот с ней у многих телефонов были проблемы. Дело в том что примерно до 2006 года, многие телефоны не умели альфа-блендинг (т.е полноценную полупрозрачность) вообще, из-за чего представляли прозрачность либо как 0 (пиксель прозрачный), либо как 1. Если в игре предполагались полупрозрачные поверхности (например стекла или параллакс-фоны), то для некоторых телефонов их приходилось заменять дизерингом или вообще делать упрощенную, менее красочную версию:

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

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

Вы никогда не задумывались, почему современные 2D-игры не зависят от разрешения экрана и выглядят одинаково сочно как на 4K-дисплее, так и на 720P экране бюджетного смартфона? Секрет прост: современные игры используют в качестве системы координат не пиксели, как это делали многие старые релизы (не только Java, но и консольные/ПК), а метры (сантиметры, что угодно). С развитием мобильных GPU, 2D стало частным случаем 3D и теперь все двухмерные элементы — это просто плоские 3D-треугольники. А поскольку растеризатору совершенно не важно какой треугольник ему «скармливают» и при нанесении текстуры/спрайта он оперирует исключительно алгоритмами фильтрации (которые включают в себя масштабирование) — мы можем видеть идентичную картинку с идентичным уровнем масштабирования на любом устройстве:

Один из моих Just for fun-проектов — игра про оборону от зомби в стиле Crimsonland. Выглядит одинаково как на смартфонах с 720p дисплеями, так и 240p.

Один из моих Just for fun-проектов — игра про оборону от зомби в стиле Crimsonland. Выглядит одинаково как на смартфонах с 720p дисплеями, так и 240p.

На ретро-телефонах всё было по другому. Чаще всего у устройств не было не то что FPU, даже аппаратного деления в процессоре зачастую не было. Поэтому любая floating-point арифметика эмулировалось программно, а умножение/деление были очень дорогими, из-за чего система координат в играх обычно была целочисленной, а результаты любых тригонометрических функций были посчитаны заранее для всех углов поворота объекта. Конечно никто не мешал реализовать масштабирование и поворот (т.е умножение на 2x2 матрицу) на fixed-point арифметике, но учитывая что процессор можно было положить на лопатки несколькими десятками небольших спрайтов, разработчики всегда использовали классический блиттинг — то есть прямое копирование изображений на экран без масштабирования, поворота, блендинга и других операций. Именно поэтому в таких играх чаще всего не было автоматического масштабирования, а каждая версия игры несла в себе свой пак ресурсов:

По возможности многие разработчики старались использовать API от производителей телефонов. Дело в том, что нативное API зачастую предоставляло возможность проигрывать куда более качественную MMF-музыку (Samsung), заметно быстрее отрисовывать 2D-графику (Nokia UI API) и получить доступ к фишкам по типу мультитача и даже звонкам! Например DirectGraphics в Nokia UI API поддерживал поворот на фиксированный угол и возможность «бесплатной» отрисовки изображения в нативном пиксель-формате (RGB565), благодаря чему Nokia UI реализовывали и другие производители — например Sony Ericsson:

Ну и конечно стоит упомянуть 3D на телефонах нулевых, благо там был целый зоопарк различных API. Пожалуй самым первым был легендарный Mascot Capsule, который использовался в телефонах Sony Ericsson и Motorola, и представлял из себя очень быстрый софтварный растеризатор, который позволял выдавать графику уровня PS1. Помимо растеризатора затененных и текстурированных треугольников, Mascot Capsule также предоставлял «собственный» формат текстур (bmp), моделей (mbac), и анимаций (mtrac), математическую библиотеку, а также поддерживал примитивный скиннинг. Однако главной особенностью было то, что в целях экономии памяти, Mascot Capsule не поддерживал Z-буфер и вручную сортировал треугольники по отдаленности к наблюдателю, из-за чего иногда можно было увидеть Z-fighting, характерный для игр с PS1:

V-Rally — одна из игр на движке Abyss Engine от Fishlabs. На нём же потом сделали Galaxy on Fire и Deep3D, и это один из немногих примеров использования абстракций в Java-играх.

Второе API появилось в 2004, называлось M3G (Mobile 3D Graphics) и использовалось практически везде... кроме телефонов Samsung до 2010 года. И вот здесь есть важный момент: во первых, M3G это спецификация и реализаций этого API было много. Референсная, насколько мне известно, была построена на базе OpenGL ES 1.1, в то время как большинство производителей использовали проприетарные реализации на базе кастомных софтрендеров. А во вторых — M3G это не просто растеризатор треугольников, а граф сцены с собственной древовидной структурой объектов. И разработчикам предлагалось строить логику как раз поверх этих самых Node'ов — что идёт вразрез с моими словами о максимальной примитивности и линейности логики игр тех лет. Поэтому большинство разработчиков использовали M3G, если говорить очень условно, как «Unity» тех лет — создавали уровни в 3d Max, загружали их в игру, создавали какие-то объекты и управляли их компонентами (трансформация, материал и т.п.) также, как в Unity:

По уровню графики, M3G позволял добиться довольно неплохих результатов. Ниже игра Rally 3D Nokia, которая по совместительству является Java-портом одноименной игры с Mophun:

Что-то так защемит в груди...

Что-то так защемит в груди...

Третьим API был JSR239 — OpenGL ES, которому не суждено было стать популярным на Java-телефонах. Дело в том, что его поддерживали только телефоны Sony Ericsson и только после 2008 года, а также несколько устройств от BlackBerry. Несмотря на то что ES 1.1 Nokia реализовала в своих Symbian-смартфонах ещё в 2006 году (из-за появления устройств с 3D-ускорителями от PowerVR), этот стандарт никогда не был реализован в Java-машине... Зато он оказался реализован в самой первой версии Android, благодаря чему там до сих пор есть пакет javax.microedition.khronos.opengles!

А некоторые разработчики шли во все тяжкие и реализовывали программные 3D-растеризаторы прямо на Java, которые ещё и умудрялись очень шустро работать! Понятное дело что под капотом они были простыми и сильно упирались в филлрейт, однако популярная в своё время игра Left2Die как раз использовала свой собственный программный растеризатор, благодаря чему работала даже на телефонах Samsung:

❯ Судьба J2ME как платформы

До 2010 года, J2ME продолжала оставаться самой популярной программной платформой для телефонов. Её поддержку добавляли и в простые телефоны, и в смартфоны, а сама платформа продолжала обрастать функционалом и новыми пакетами. Sun (уже почти Oracle) вместе с производителями телефонов успела представить третью версию профиля MIDP в 2009 году, и выпустить новую версию SDK, но уже в 2010 году платформа начала стремительно сдавать позиции...

Одна из причин падения J2ME

Одна из причин падения J2ME

И этой причиной был Android. Дело в том, что в своё время, ОС от Google умудрилась полностью перевернуть мир смартфонов, представив систему с довольно неплохим и логичным API, современным подходом к разработке приложений и открытостью к производителям смартфонов. И что самое интересное, весь юзерспейс Android'а был написан на Java, что сильно упростило переход уже существующих Java-разработчиков на смартфоны. Были разработаны библиотеки-слои совместимости с MIDP для упрощения портирования, были организованы конкурсы среди разработчиков приложений, а к 2010 году появились первые Android-смартфоны по цене менее 10.000 рублей (~300$), что заметно ударило по популярности обычных Feature-фонов и кнопочных смартфонов. J2ME прожила примерно до 2014 года, пока производители всё ещё предустанавливали её в теперь уже ставшие бюджетными кнопочные телефоны. Большинство разработчиков перешли к разработке для iOS и Android, и лишь Gameloft время от времени радовала нас новыми релизами, пока в 2014 платформа окончательно не умерла...

Затем на место Java-телефонов пришли устройства с KaiOS, которые тоже успели кануть в бытие, а теперь, как бы это забавно не звучало, продвинутые кнопочные телефоны работают на Android. И что самое забавное — в свежих LTE-кнопочниках на чипсетах Unisoc просто нереально крутые ТТХ по сравнению с той же Nokia N73: 64 мегабайта DDR2-оперативной памяти, гигагерцовый ARM-процессор на ядре Cortex-A7, поддержка инструкций NEON... Но никакой возможности запуска сторонних приложений. Это очень грустно.

❯ Заключение

Вот такой была разработка мобильных игр в далёких нулевых годах... От многообразия аппаратных платформ, форм-факторов и операционных систем мы пришли к доминированию iPhone и Android, а от полной открытости к пользователю — к закручиванию гаек «открытой мобильной операционной системы» её же разработчиком. Но факт остаётся фактом — разработка в те годы была куда более ламповой, душевной и, что интересно, предлагала куда больше игр с уникальным геймплеем...

А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.

Если вам понравилась статья и вы хотите меня поддержать, у меня есть Boosty, а также виджет на Пикабу ниже. А ещё мне можно отправить какое-нибудь интересное железо: устройства на WinCE/WinMobile, китайские кнопочники, китайские подделки на iPhone/Samsung из начала 2010-х, игровые консоли, ретро-ПК железо - всё это я очень люблю и порой пытаюсь поднять даже нерабочие гаджеты :) Всем огромное спасибо!

Статья подготовлена при поддержке @Timeweb.Cloud . Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Что думаете о таком геймдеве?
Всего голосов:
Как вам такой формат статей?
Всего голосов:
Показать полностью 23 1 2
12
Война полов

Как перестать быть "просто другом" у женщин?

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

Природная харизма? Ну фиг знает, часто подкаты выглядят нелепо со стороны. Может напористость и фальш типа "настоящий сильный мужик"? Вполне возможно. Брутфорс по методике подпоручика Ржевского тоже может в теории работать.

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

В реале лицо не настолько грустное и унылое)) ну в общем если у кого то была такая же тема, подскажите, как вы выбирались не из френдзоны (это манипуляция, а не дружба), а именно из друзей?

Как?
Всего голосов:
Показать полностью 4 1
238
TECHNO BROTHER

Всем привет

Шел по улице, появилась надпись "(F) Подобрать" и в инвентарь попал вот такой КПК. Подскажите, как в нем открыть карту и топ-20 сталкеров? :)

Если вдруг не знали - именно iPaq h1940 стал первым прообразом КПК в Сталкере, а конкретно его моделью в мире.

В UI же используется Samsung SPH I-700, только с заметно увеличенным дисплеем. Второй бум популярности случился в 2009-2010 году, когда КПК на PPC2003 начали стоить копейки и их брали для угара по сталкеру + как дополнительный гаджет в паре с телефоном

Ну а в Зове Припяти прообразом стал один из промышленных защищённых КПК. Также возможно вдохновением послужили MID-коммуникаторы с огромным дисплеем, которые представляли из себя что то среднее между современным смартфоном и планшетом. Таких к слову никогда не встречал:

RoverPC MID

RoverPC MID

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

Китайцы сделали ещё один игровой телефон... за 2.000 рублей!

Не секрет что в Китае очень любят портативный гейминг. N-Gage там был ну очень популярен, и вдохновившись смартфоном от Nokia, некоторые китайские инженеры пытаются сделать свою версию игрового устройства. Год назад я рассказывал вам о Kechaoda K110 - телефоне-последователе N-Gage, в котором стоял... аппаратный клон NES, вместо эмулятора:

Так вот, компания-производитель этого телефона - Shenzhen Wufang Technology, недавно выпустила вторую версию этого замечательного телефона. Теперь с функцией повербанка и 200 встроенными играми :)

Причем в устройстве есть не только игры для NES, но и нативные, написанные китайцами специально для этого телефона. Респект ребятам за то, что смогли сделать реинкарнацию N-Gage за 2.100 рублей :)

Сейчас их уже не купить, из продажи они пропали также внезапно, как и появились. Но статья о нем будет. Кроме того они все ещё продаются в Узбекистане, так что если есть там друзья - можете купить по месту под брендом Hope :)

Как вам телефон?
Всего голосов:
Показать полностью 4 1
9
Лига уставших

А у вас вообще остались настоящие друзья, когда вам стукнуло 25?1

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

А у вас остались друзья после 20?

?
Всего голосов:
Показать полностью 1
34
Война полов
Здоровье Здоровье

Девушки и парни Пикабу, посоветуйте косметос

Короче пост наверное звучит как трешак, учитывая то что много лет я писал исключительно про девайсы и был неопрятным и небритым чуханом, но уже более полугода я привожу себя в норму и стараюсь стать лучшей версией себя. Надоело что мне в мои 24 дают 40+ (в интернете):

Короче очень хотелось бы пофиксить косяки кожи на лице. Дело в том что у меня пару лет назад обнаружили вялотекущий псориаз (на ногах и торсе, но не лице), а также себорею. Псориаз в целом жизни не мешает и распространяется только когда я гоняю в кроссовках без носков (ещё во времена учебы в шараге купил себе отдельные кроссовки под носку без носков, чтобы ноги не воняли, и это работало, но потом ноги начали зудеть и я умудрился их расчесать - появились бляшки), себорею вроде бы вылечил себозолом (по крайней мере болячки на коже головы ушли, плюс перхоти стало меньше). Из проблем осталась ток одутловатость мордени (я худею, так что эта проблема уже решается) и ее кожа. Всю жизнь она шелушится, появляются покраснения и в целом выглядит не всегда здоровой. Кроме того есть куча следов постакне. Много лет лечил покраснения Акридермом (не ГК, т.е не гормональным), который мне когда то прописывали, но чёт вчера закинул эту тему в Дипсик и он подсказал что это препарат не на каждый день, а для использования курсом, о чем я почему то забыл.

Девушки и парни Пикабу, посоветуйте косметос

В общем хотелось бы спросить у пикабушников и пикабушниц, какими средствами можно вернуть (?) тонус кожи и пофиксить красноту перманентно и перестать ходить как далматинец. Кожа не жирная вроде, но и не жесть какая сухая. Средняя.

Ещё у меня перманентные круги под глазами, это у меня с рождения, такая особенность строения глаз. Чем можно подмазывать, чтобы при встрече с корешами, подругами и на записи видосов на Ютуб не выглядеть как алкаш? Бб крем пойдет?

Пока заказал Baume B5+. Что можете подсказать? Желательно Bomj klasse (не надо крема по 2+к)

?
Всего голосов:
Показать полностью 3 1
83
TECHNO BROTHER

Сижу, кайфую [Мысли вслух, про железо]

И занимаюсь тем, чего вы уже месяц ждёте - пытаюсь поднять моторолу е398 из утиля, дабы написать крутой лонгрид с ещё более подробным разбором не аппаратной платформы. В этом красавце прогрели вообще все, вся плата была в флюсе, а мастер даже не понял, что пробит оказался контроллер питания, причем настолько, что увалил в КЗ VBat

Пробитый КП - это всегда риск того, что за собой он заберёт процессор, флэш-память или фронтэнд. На все модули телефона шины питания формируются отдельно двумя разными типами преобразователей - понижающими DC-DC Buck Conerter'ами (чаще формирует питание процессора, иногда DRAM) и LDO (память, VIO, VAUX и другие периферийные шины питания). LDO по своей натуре достаточно простые (по сути это ключ, где в роли ШИМа выступает компаратор напряжения) и не особо опасные, а вот дц ДЦ при слете внешнего фидбека вполне может поджарить процессор VBat'ом. Поэтому перед ремонтом платы есть смысл пересадить процессор и Флэш в точно рабочий телефон:

У меня была ещё одна плата, которая стартовала, но с которой варварски украли корпус, динамики, дисплей, клавиатуру, сим лоток, разъем и даже микросхему ATI Imageon. А ведь у нее и КП жив, и проц, и флэш, а проблема наверняка была в обрыве цепи зарядки или сдохшем чипе FunLights :(

Если найдется утопленный донор, то я смогу поднять и эту моторолку.

Что ж, пока я только успел поэкспериментировать и записать поведение платформы при старте без процессора и флэхи, без флэхи, и с чужой флэхой. С такими данными могу точно заявить: при установке АКБ, КП сразу даёт разрешение на подачу питания и стартует процессор, который затем выполняет бутрум и пытается передать управление прошивке с флэхи. Если флэха не откликается, телефон падает в режим S-Blank (режим заводской прошивки или простыми словами "жёсткий тестпоинт") и постоянно потребляет 56мА, не давая контроллеру питания снять с себя питание и ожидая загрузки USB-загрузчика в SRAM

Если же флэха откликнулась и бутрум нашел там нормальную прошивку, то он передает ей управления и та получает причину включения от контроллера питания (установка АКБ, подключение зарядки или нажатие кнопки включения). При установке АКБ, процессор попросит КП снять с себя питание, при подключении зарядки загрузит соответствующую анимацию, ну а при нажатии красной кнопки ждёт примерно 1с, и если кнопка все ещё нажата - устанавливает транзисторную защёлку на КП, разрешающую включение и продолжает процесс загрузки. Ну а если прошивка не проходит верификацию или замкнуты 4 и 5 пин на разъеме - падает в режим загрузчика:

Если же поставить "чужую" флэшку и включить телефон, то он моргнет подсветкой кнопок и выдаст в лог, что ключ в OTP-зоне отличается от того, что есть в процессоре. Сделано это для того, чтобы нельзя было на ворованном телефоне поставить новую флэшку, прошить и пользоваться как ни в чем не бывало. Ну и с разлочкой от оператора тоже)

Плата Сименса, ну просто как иллюстрация :)

Плата Сименса, ну просто как иллюстрация :)

В целом копаться с такими аппаратами одно удовольствие. Это реально инженерное и технологическое чудо, которое имеет перспективы для моддинга и при этом куда менее залочено, тем те же самые современные поко с сяоми. Ну и мне просто нравится давать жизнь стареньким гаджетам из утиля...

А вообще мне приятно что на меня подписываются мастеры по ремонту гаджетов и рассказывают в личку как они ремонтируют девайсы, которые лет 15 уже не трогали :) значит кого то я тоже вдохновляю.

Что думаете?
Всего голосов:
Показать полностью 7 1
76
TECHNO BROTHER

На фото - GameBoy Advance SP [Длиннопост, про железо]

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

Однако здесь при запуске без картриджа нас встречает меню многоигровки и это сразу выдает поддельную натуру консоли. Сейчас на Авито можно найти много разных SP'шек, однако подавляющее большинство объявлений - клоны по типу Qumo'вских, причем продающихся за неразумные деньги. Их справедливая цена - 500-1.000руб, а ломят за них 3+к (правда их никто не берет, но рынок они ломают):

Все мы с вами помним о том, как китайцы скопировали аппаратную платформу NES и до сих пор выпускают ее в виде консолей типа Sup GameBox. Однако у GBA в этом плане все было куда интереснее! Дело в том, что вариаций клонов SP великое множество. И у меня в руках находится самый простой клон, который представляет из себя неизвестный ARM-чипсет с эмулятором:

В отличии от NES с ее сложными картриджами, где было сразу два адресных пространства (для PPU и процессора), и мапперы, ориентировавшиеся на аппаратные особенности Фамикома, в GBA картриджи были очень простыми. По сути, это просто параллельная 16-битная шина 8080, которая включается напрямую в адресное пространство процессора и куда BIOS оригинальной консоли передает управление после инициализации.

В случае с эмуляторными клонами, тот же самый картридж вешается напрямую на EMI (внешняя параллельная шина, или FSMC если вы знакомы с STM32) микроконтроллера и таким образом оказывается замапплен в определенную область памяти. Обычно в таких клонах используются процессоры на ядре ARM9T, которое способно выполнять код оригинальных картриджей без модификаций, однако без PPU и SPU в этом не будет никакого толка. Правильным решением было бы выполнение кода на 9T и эмуляция обращения к регистрам периферии оригинальной консоли, но это слишком сложно и ломает совместимость, поэтому китайцы просто гоняют эмулятор ARM-ядра поверх другого ARM-ядра. И конечно из за этого игры, которые быстро работали на древнем медленном ARM7TDMI, могут подтормаживать на 9T и даже 926'ом...

Однако были и другие китайцы, прожженные хардварщики, которые умудрились аппаратно склонировать GBA SP! Не то чтобы сама GBA была очень сложной под капотом (NES, к примеру, сложнее), но ее периферию с кучей режимов работы реализовать и отладить - целое дело. Одним из таких китайцев был опытный инженер Maxzhou88, который умудрился разработать один из первых (но не самый первый) аппаратный клон GBA SP в ~2011 году. И вот там то игры не лагали!

Qumo GameBox. Та самая капля - бескорпусной чип, который и реализует в себе всю GBA SP.

Qumo GameBox. Та самая капля - бескорпусной чип, который и реализует в себе всю GBA SP.

Так что благодаря таким крутым инженерам, как Maxzhou88 и команде MisterFPGA мы можем наслаждаться аппаратными клонами консолей, которые не выпускают уже более 20 лет...

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества