Всем доброго времени суток, я хочу расскать немного о java играх в 2024 году. Как бы это странно не звучало, но я увидел в них что-то удобное, и прикольное. Начну с того что я начал вести в вк паблик по играм для Android, смысл в том что я добавляю туда zip файлом игры которых нет в плей маркете, и в которых принципиально нет реклам и донатов. Идея конечно же зашла, поскольку тяжело искать игры (без взлома на деньги) да плюс у многих людей безлимитный трафик на соц сети. Думаю, а не сделать ли мне ещё один паблик по java играм? Добавил туда в закреп эмулятор, и начал выкладывать посты zip архивом целыми подборками игр, в основном 240x320. Начал юзать сам, и как же это прекрасно. Целая подборка игр весит совсем копейки, скачал, открыл архив, запустил игру из архива и все. Не требует мощности телефона, много места, да и нет в тех играх ничего лишнего. В современных играх что бы начать играть то нужно ещё полтора часа собирать плюшки, смотреть рекламы, и закрывать вечно всплывающие окна о донатах. Но к этому все привыкли. Ещё я нашёл такой интересный момент, это когда хочется буквально минуток на 10-20 отвлечься на игру, то java игра как никогда кстати. Быстро запустится, и можно сразу же начинать играть. Как же удобно это делать на работе в курилке, или пока сидишь пьёшь кофе. Разнообразие таких игр тоже поражает, каждая из них уникальна. Да конечно они уже устарели, но все ещё есть чем угодить. Я сейчас начал проходить черепашки ниндзя, и это шикарная игра. Четвёртый день уже играю между делом, не могу отлипнуть))) А что вообще вы думаете по этому поводу? Стоит ли ещё java играм пожить? 🤷♂️ Если хотите тоже со мной поиграть, то ссылка на паблик есть у меня в профиле.
Откапал все части gangstar, на те самые буржуйские телефоны того времени 480x800. Разница между 240x320 это в том что было больше контента. Я помню когда был мелкий, я был дикий фанат данной франшизы от gameloft и прошёл все части. На самом деле игра остаётся интересной и по сей день, так сказать решил заново вспомнить те былые времена. Но только уже попробовал те самые версии на сенсере java. И конечно же как вы любите, я добавил их с сборку zip) ссылка в комментарии.
Думаю, большинство моих читателей успела застать эру кнопочных телефонов с поддержкой 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. Однако, история мобильного трёхмерного гейминга тянется несколько дальше и уходит корнями в самое начало двухтысячных годов — как раз, когда телефоны только-только начинали обрастать мультимедийным функционалом.
Мы с вами привыкли, что существовали Java-игры для простых кнопочных телефонов и BREW-игры для телефонов Qualcomm. Но на рубеже нулевых сразу несколько перспективных компаний боролось за право стать разработчиком основной мобильной платформы и вытеснить J2ME. Одной из самых известных была Mophun, которая представляла из себя кроссплатформенную виртуальную машину, исполняющую байткод в собственном формате. И уже в ~2002-2003 году, Mophun представили 3D API для разработки очень симпатичных мобильных игр, которые и работали шустро.
Кстати, опробовать Mophun-библиотеку вы можете и сами: в РФ из Mophun-девайсов был как минимум Sony Ericsson T610, которые сейчас можно купить чуть ли не по «сотке» на вторичке.
Помимо Mophun, на французских телефонах производства Alcatel и Sagem была установлена платформа In-Fusio, тоже основанная на J2ME (а может и какой-то собственный сабсет API), однако со своим специфическим набором API, ориентированном на разработку игр. Мы с EXL даже в прошивке OT535 копались, прямо в HEX-редакторе, чтобы найти информацию о встроенной 2.5D-игре-бродилке:
Как можно заметить, спрос на 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!
А вот с глобальными модами, меняющими геймплей игры, не задалось. Несмотря на то, что программы на 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 и даже более старых консолей!
Начнём с сортировки примитивов. Представим, что у нас есть машинка и домик позади неё. Если мы отрисуем сначала машинку, а затем домик — то домик окажется перед машинкой, что полностью сломает эффект погружения и какую либо проекцию:
Пример такого эффекта можно найти в большинстве игр для PlayStation 1 — вот тут, например, лапки обезьяны видны поверх камня, чего быть не должно.
В современных приложениях, для сортировки геометрии по удаленности от наблюдателя используется screen-space техника Z-buffering, которая позволяет «дешево» отсекать невидимую глазу часть геометрии. Принцип её прост: по размерам окна приложения создаётся буфер, где каждый пиксель содержит информацию не о цветности, а о дальности фрагмента в этой конкретной точке. По итогу, во время отрисовки машинки, в Z-буфер будет записана глубина (дальность) конкретного фрагмента (участка геометрии), а когда будет нарисована домик, то видеочип сравнит значение глубины фрагмента машинки с машинкой и если значение глубины, хранящееся в буфере окажется меньше (или больше — зависит от реализации) прошлого значения — тогда часть машинки будет нарисована там, где нужно. Думаю, такое объяснение более чем понятное :)
Однако, Z-буфер требует драгоценную память (минимум ширина экрана * высота экрана * 2 — число байт в half float — т. е. 153 килобайта для экрана 240х320 как минимум) и наличие FPU для достаточной точности буфера глубины. Если же попробовать использовать обычные числа для этого, то вскоре мы столкнемся с проблемами точности, из-за чего будем видеть depth-fighting и от техники будет больше проблем, чем пользы.
В телефонах используется точно такая же техника, как и в PS1: сортировка отдельных полигонов. На PS1 с этим помогал отдельный векторный сопроцессор, который управлял трансформацией геометрии, освещением и мог эффективно сортировать треугольники, не нагружая основной процессор. А вот на телефонах этим занят основной процессор, вместе с растеризацией, обработкой игровой логики, звука и радиомодуля. Поэтому для корректной сортировки, вся отрисовка в GAPI на телефонах делится на «батчи», где программист отсылает набор нужных ему команд (отрисовать такую-то модельку с такой-то текстурой и такой-то трансформацией), а API затем уже трансформирует и сортирует вершины наиболее эффективным способом.
Второй интересный момент — это система координат. Как я уже говорил ранее, аппаратной поддержки float-чисел в телефонах зачастую не было. Однако j2me-машина и компилятор C (в те годы для прошивок чаще использовали ADS, чем GCC) предоставляли программную реализацию float-чисел, которая была ощутимо медленнее аппаратного FPU. Поэтому даже такие операции, как вычисление синуса и косинуса могли стать относительно тяжелыми для телефона, чего уж говорить о перемножении матриц. Для обхода этого ограничения использовалось две техники: fixed-point числа, где число с дробной частью представлено в виде обычного целого чисел, с которым умеет работать процессор (M3G) и обычные целые числа, которые представляют нормализованные числа 0.0… 1.0 (Mascot Capsule). Оба способа имеют ограниченную точность и в некоторых моментах могут давать артефакты, но здесь всё сильно зависит от самой игры. Например, из-за низкой точности при движении персонажа мир может «трясти».
И третий момент — это текстурирование и освещение. Сама концепция идентична той, которая используется в большинстве современных игр, однако из неё исключается важный этап: перспективно-корректное наложение текстур. Если говорить простыми словами, то при линейном наложении текстуры на геометрию «как есть», если подойти к модельке домика слишком близко — мы увидим искажения текстуры на его поверхности. Другой пример — шахматная доска, которая при приближении будет не идеально ровной, а если подойти совсем близко — то мы получим серьезные артефакты, которые полностью исказят визуальное представление. Для перспективной коррекции нужен тоже нужен FPU: это не бесплатная операция, поэтому от неё обычно отказываются (исключение — M3G), потому игры под J2ME иногда выглядят весьма странно:
Один из «универсальных» советов: желательно на этапе проектирования уровня и геймплея не ставить слишком близко друг к другу разные объекты и не давать камере игрока «смотреть» слишком близко на большие объекты.
В процессе подготовки статьи, я декомпилировал и изучил несколько 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.
Самый примитивный игровой цикл будет выглядеть так. Сначала мы заливаем экран цветом для предотвращения эффекта Hall of mirrors и биндим объект Graphics к Mascot Capsule, затем рисуем сцену и освобождаем контекст, а потом вызываем flushGraphics для вывода изображения на экран:
Результат: синий экран.
Давайте что-нибудь нарисуем. 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 градусов). Это же касается и углов в поворотах.
Обратите внимание — матрицы имеют размерность 3x3, а не 4x4, как это принято в «больших» системах. translate здесь нет — только lookAt.
Идём дальше — к фактической отрисовке треугольников. Геометрия может иметь текстурные координаты, цвета и нормали. Формат вершины можно задавать динамически — необязательно передавать сразу все аттрибуты вершин. Из-за особенностей Mascot Capsule, геометрия не будет отрисована, если не переданы текстурные координаты или цвет.
UV-координаты указываются в абсолютных координатах текстуры. т. е. не 0..255, как на 3dfx Voodoo, например, а 0… ширина текстуры и 0… высота текстуры. Учитывая, что класс текстуры не позволяет даже её размер узнать… решение так себе.
Результат:
Добавляем второй треугольник, дабы нарисовать квад:
На этом, половина рендерера написана. Я не шучу :)
Теперь генерируем геометрию для кубика. Для наглядности я написал простенький класс для генерации геометрии на лету. Отдельный формат для моделей нам пока не нужен, поэтому я «запеку» геометрию в отдельный массив вершин.
Результат:
Текстурированные кубики рисовать умеем, камера у нас тоже есть: уже можно реализовать бродилку :)
Уровни
Уровни делать мы будем… прямо в IDE. Каким образом? Уровень будет храниться классическим для подобных игр способом: сетка x на x, где каждое число указывает ID-текстуры (и в оставшихся битах можно разместить какие-нибудь атрибуты), где 0 — блок отсутствует. Все блоки предполагаются твердыми.
З.Ы На Пикабу нет тега с кодом, поэтому пришлось вставлять код в виде скринов. А поскольку на кол-во медиа-элементов в посте есть ограничение в 25 блоков, пришлось остальной код кастрировать :(
Отрисовка подобного уровня в самом простом случае очень простая: мы просто проходимся по всей сетке и рисуем каждый куб, если ему назначена текстура. Однако, это не очень эффективный метод: в случае больших уровней с множеством перекрытых комнат, на GAPI ложится лишняя работа по сортировке геометрии, а также страдает филлрейт. Лучше всего разделить такие уровни на комнаты и рисовать только видимые участки уровня.
Теперь нам необходимо реализовать возможность ходьбы по уровню. Для этого мы будем поворачивать камеру по координате Y при нажатии кнопок вправо и влево, а для движения вперед и назад вычислять forward-вектор, указывающий на направление персонажа относительно угла поворота, который представляет из себя синус и косинус угла поворота персонажа в радианах.
Напомню, что углы хранятся в виде 4096 = 360гр. = 3.14 * 2.
Однако без пола и потолка игра выглядит не особо привлекательно. Самое время их добавить! Настоящий вертикальный потолок реализовать будет затруднительно из-за отсутствия коррекции текстур — пол будет постоянно «плыть», что не очень красиво. Поэтому мы воспользуется дедовскими методами и закрасим нижнюю часть экрана серым, а потолок сделаем фоновой картинкой! Таким образом, каким бы большим не был уровень, в центре экрана всегда будет какая-то стенка, из-за чего мы не сломаем нашу перспективную проекцию!
Смешивать Graphics и Graphics3D одновременно нельзя — сильно падает производительность. А вот использовать Graphics для отрисовки интерфейса поверх Graphics3D после отрисовки кадра — можно! Суть хака простая: рисуем с ортографической (параллельной) матрицей половинку экрана с текстурой неба, а вторую половинку — просто серый квад. Всё очень легко и просто!
Обратите внимание на все артефакты, о которых я рассказывал в разделе оптимизации игр. И текстуры плывут, и мир дребезжит — всё это результаты оптимизаций со стороны разработчиков GAPI. Зато работает шустро!
Обработка столкновений
В любом шутере нужна обработка столкновений. Даже в космическом скроллшутере :) Тут я чуток наговнокодил, поскольку нет необходимости проверять столкновение игрока с вообще всеми кубами на сцене: достаточно сделать выборку из ближайших восьми блоков, но для наглядности оставил так.
Принцип прост: обычная проверка AABB, весь резолвинг — это откидывание игрока обратно, если после последнего движения он «врезался в стену».
Давайте посмотрим. Запускаем бродилку в эмуляторе:
Но как насчет реального девайса? Для тестов у меня есть 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, дабы не пропускать новые статьи каждую неделю!
Взять с собой побольше вкусняшек, запасное колесо и знак аварийной остановки. А что сделать еще — посмотрите в нашем чек-листе. Бонусом — маршруты для отдыха, которые можно проехать даже в плохую погоду.
Сейчас активно готовлю материал о том, как работали 3D-игры "под капотом" на слабеньких кнопочниках, каким образом разработчикам удавалось достичь приемлемый FPS и какие графические API для отрисовки трехмерной графики существовали на Java-телефонах. А дабы материал не был голословным, в практической части мы с нуля напишем 3D-шутер "а-ля 90е" с использованием Mascot Capsule и погоняем его на реальном телефоне Sony Ericsson! Материал выйдет в течении следующей недели (скорее всего среда-четверг).
Замечательный аппарат Nokia N900 (в контексте материала — просто Nokia), рассматривался во множестве статей, а в разрезе сетевых игр — информации не очень много. Мне показалось интересным испытать Nokia именно в этом аспекте. В данной статье сделаем акцент на мультиплеер OpenArena — игре, основанной на движке Quake 3. Рассмотрим этапы настройки живых (на 2023 год) репозиториев, получения root-доступа к телефону, запуск игры и сам геймплей. Под катом фото и видео Nokia N900 c шутером OpenArena. Бонусом — увидим DOOM (порт PrBOOM), куда же без него… а так же рассмотрим странное «Q-дерево».
Один в поле не воин, а на двух самураях вполне можно виртуально соперничать. Добро пожаловать...
Содержание:
Введение;
Инсталляция из репов, настройка сети;
Получения root-доступа по ssh;
Инсталляция шутера OpenArena;
Управление и геймплей OpenArena;
DOOM;
Заключение.
❯ Введение
На миг отвлечемся от серьёзности дерева портов и начнем с несерьёзного предисловия. Мне было нужно наглядно продемонстрировать суть затеи, а так как 4-х рук у меня нет, пришлось смастерить квейковое дерево или «Q-дерево». Это и есть наш шуточный демонстрационный стенд, изображенный в заголовке, дальше будет детальное изображение.
Nokia N900, аппарат, имеющий в качестве основной операционной системы OS Maemo, основанной на Debian Linux, «заточенный» на работу в портативных носимых гаджетах. Соответственно, менеджер пакетов, который будет использоваться apt-get. Самое сложное было разыскать живые репозитории. Методом тестов, проб и ошибок удалось составить свой файлик (кому он нужен для повторения эксперимента, пишите в комментариях, скину). На момент написания статьи все репозитории живые.
❯ Инсталляция из репов, настройка сети
Понятие «репозитарий» звучит красиво, но не правильно, а если правильно, то «репозиторий», но это неестественно и можно сломать язык, поэтому далее будем пользоваться жаргонным «репа», оно привычней.
Итак, файл с репами находится по следующему пути:
/etc/apt/sources.list.d/
После его редактирования необходимо выполнить команду:
apt-get update
Чтобы обеспечить возможность играть в сетевую игру, необходимо чтобы оба телефона были подключены к одной точке доступа WI-FI и находились в одной локальной сети. Все манипуляции проводятся одинаково, на обоих смартфонах. Так выглядят сетевые параметры после подключения.
❯ Получения root-доступа по ssh
Перед установкой OpenArena делаем две подготовительные операции.
Инсталлируем пакет rootsh, позволяющий производить манипуляции от имени привилегированного пользователя-root. Это не хак и не джейл, а штатная процедура получения root-доступа к устройству. Отмечу, что все действия в этой статье проводятся от имени root. Правила безопасности не зря твердят нам не вести ВСЕ действия от привилегированного пользователя, но в данном случае у нас эксперимент, повредить систему не страшно, секретных данных тоже нет. Но все же, от root работать нужно осознанно.
В консоли запустим «sudo gainroot» и установим пакет «rootsh».
Для комфорта настройки установим «openssh-server», позволяющий реализовать удаленный доступ к Nokia по протоколу ssh, и будем управлять от имени «root».
❯ Инсталляция шутера OpenArena
На скриншоте — необходимые пакеты для установки игры:
Сама инсталляция тривиальна.
Установка самого игрового «движка»:
apt-get install openarena
Установка данных и карт:
apt-get install openarena-data
Настройка сетевых параметров в интерфейсе самой игры производится в соответствии с принципом: клиент-сервер (в роли сервера-один телефон N900, в роли клиента-другой). Настройка в интерфейсе игры отражена в видеоролике ниже (на 2:42 видно настройку).
Настройка мультиплеера:
❯ Управление и геймплей OpenArena
Вот как выглядит демонстрационный стенд (Q-дерево):
Спешу поделиться результатом запущенного шутера.
Управление ведется акселерометром, либо кнопками аппаратной клавиатуры. Удалось уловить стандартное в частности для шутеров управление клавишами WASD, прыжок-space, огонь-CTRL (не стандартное), переключение и выбор оружия -1,2,3,4. В процессе игры можно переговариваться текстовыми сообщениями с оппонентом (say).
Игра вызывает весьма положительные ощущения даже в 2023 году. Напомню, что речь идет об аппарате 2009 года. Привык видеть прекрасное и в малом — у меня и игра f29 retaliator (симулятор самолета) под DOS вызывает радость, в режиме HEAD-to-HEAD, даже через нуль-модемный кабель. :) Возвращаясь к рассмотренной OpenArena, скажу: торможений, зависаний, лагов, в целом не отмечено, графика летает и сверкает. В процессе игры, в правом верхнем углу экрана виден счетчик кадров в секунду — FPS. Гляньте, пожалуйста, ролики.
Демонстрация 1:
Демонстрация 2:
❯ DOOM
Следуя челленджу «установи DOOM на это устройство», я не мог этого не сделать. Порт DOOM называется PrBOOM. Установка производится в одну команду и не вызывает сложности.
❯ Заключение
Чем можно завершить статью? Положительно, описанный порт OpenArena — не поделка, полноценный, серьёзный шутер. Играбельно? Да. Не глючит? Да. Приносит радость? Да! Ну и славно!
Прошу поделиться опытом и комментариями относительно подобных игры для OS Maemo, это интересно. :)
Благодарю за внимание. :)
Еще больше новостей и статей в нашем блоге Timeweb Cloud.
Недавно мне попался телефон из моей (и вероятно, многих моих читателей) юности. Это была легендарная китайская подделка Nokia TV E71, которая находилась на конвейере более 2-х лет и расходилась как горячие пирожки на вокзале, где, собственно, такие телефоны и продавались. Сегодняшний экземпляр был из тех, кто просто хочет жить: он выжил после воды, коррозии, разбитого дисплея и оторванного динамика. В этой статье мы с вами узнаем, на чём же работали эти китайские подделки, разберем дисплейный модуль, отремонтируем динамик, посмотрим на ништяк в действии и попробуем поиграть в игры с китайской платформы «MRP». Интересно узнать, пригоден ли такой гаджет в 2023 в качестве второй звонилки? Тогда добро пожаловать под кат!
❯ Предыстория и покупка
Типичная картина каких-то 14-15 лет назад: приходишь на центральный городской рынок, а там мужички в павильонах торгуют самыми разными гаджетами: телефонами, ноутбуками, mp3 плеерами, M2 флешками для Sony Ericsson, всё что нужно для повседневной жизни! И вот подходите вы к такому прилавку, а там вас встречает несколько рядов устройств: новенькие и Б/У.
Продавец, видя заинтересованность, достаёт вот такой ништяк и предлагает вам: «дружище, оригинал 100%, всего полторы тыщи рублей! Бери сейчас, не пожалеешь!», попутно включая его и красуясь динамиком, который слышно на половину рынка и показывая очень крутую функцию телевизора… Интересно ведь, что это за девайс, да и стоит недорого, всего 1.500 рублей за моноблок, наполовину выполненный из металла и после выдачи товарного чека (в лучшем случае) и гарантии на словах, вы, вероятно, шли домой – рассматривать внимательнее свою новую покупку.
Дома, рассматривая устройство, вы замечаете очень необычные логотипы: VAIO, Walkman — это что, какая-то коллаборация с Sony? Nokia в своей новой модели E71 решили добавить телевизор и решили добавить для крутости логотипы Bluetooth, а также FM-радио и поддержку сразу 2-х (а то и 3-х) симок! Да и отдаёт девайс некой премиумностью: тяжёлый, практически весь металлический и с полноценным тачскрином всего за ~30$. Продолжая рассматривать комплект, вы находите зарядное устройство, наушники, пленку, иногда чехольчик и чуть ли не наклейки. От такой щедрости финнов вы славно удивились, ведь даже под крышкой написано: Made In Finland (конкретно в этой ревизии, на наклейке нет такого). Ууух! Ну осталось достать фирменный аккумулятор BP-6M (который не был таким распространенным, как BL-5C) и вставить в девайс.
Девайс производился как минимум 2-3 года (с 2007 по 2010) и был актуальным всё это время. По информации на сайте Made In China, завод мог выпускать до 5.000 устройств в месяц, что было действительно много. При этом, в одном корпусе было много разных ревизий одного и того же телефона с разными прошивками (в том числе и по функционалу), а также совершенно разными дисплеями (чуть позже вы это увидите) и функционалом:
Экономия была на всём; думаю что цена конечного устройства с коробкой для опта была около 1.000 рублей, или около 10$. Nokia за такую цену предлагала только Nokia 1201 «фонарики»:
Я свой экземпляр заполучил от родителей в далеком 2011 году. Мне нужен был девайс, с которым я мог бы бегать по школе и выпендриваться громкой музычкой с сд-карточки, да и который вызывал бы вау-эффект от тачскрина (живу в маленьком городке) и металлического корпуса. Куплен он был за 1.800 рублей у рыночных торгашей (прямо как в ситуации, описанной выше), но у меня была модель TV E-72 (отличалась дизайном и отсутствием логотипов). Девайс успешно выполнял свои функции портативного плеера и мне в целом очень нравился. Однако был серьезный минус в отсутствии поддержки J2ME (поддержка разнилась от прошивки к прошивке, эдакое разделение «премиумности»): видя, как знакомые играют в такие крутые 3D Java игры и общались в аське, мне оставалось только сидеть с дорогим трафиком в GPRS интернете и играть три в ряд. Немалым плюсом было наличие джека, в то время как кнопочные Samsung'и продолжали использовать проприетарные разъёмы, но именно отсутствие J2ME стало решающим толчком к смене основного устройства. Кроме того, мой экземпляр был очень живуч и пережил несколько падений, да и у него неплохо держал аккумулятор.
Но перед тем, как мы перейдем к основной части статьи, предлагаю сначала оживить наш сегодняшний экземпляр, который за 13 лет успел повидать многое. Как я уже сказал, он успел пройти через воду, коррозию, грязь, оказался с разбитым дисплеем и оторванным разговорным динамиком.
❯ Смотрим девайс «под капотом»
Разбирается девайс очень просто: 4 винтика под тонкую отвертку и пару защёлок, которые можно расщёлкнуть даже ногтями. Внутри нас встречает модульная структура: основная плата, модуль динамиков, клавиатуры и сим-карт. Несмотря на попадание влаги, на самих элементах серьёзной коррозии нет, что приятно. В целом, пайка на таких девайсах была качественной и вполне на уровне брендовых телефонов. Шлейфа были не с коннекторами, а паялись напрямую.
Например, дисплей был именно припаян/ Причем на плате была разводка сразу под два типа шлейфом, 37 пин и 44 пин. Сделано это было для удешевления, какой дисплей есть на складе, такой и ставим, а прошивки отличались поддерживаемыми драйверами дисплея и поэтому часто не подходили друг к другу. Была некоторая форма унификации шлейфов для дисплеев, более того, подобные дисплеи до сих пор используются в шилдах для embedded устройств:
У ништяка был очень серьезно подбит дисплей. Признаться честно, изначально я даже не включил этот девайс из-за уверенности в повреждении дисплея. Тачскрин у таких телефонов резистивный, а не ёмкостной, и всё, что отделяет дисплей от внешнего мира — небольшое тонкое оргстекло. Несмотря на выемку в дисплее, при падении на острый предмет, дисплей на таких девайсах почти всегда под замену. Но… этому экземпляру повезло!
Спасло его то, что удар пришелся на нижнюю часть дисплея со значками приложений, там где находится контроллер дисплея. Однако дисплей всё равно был чем-то залит, да и использовать его с битым стеклом тоже не комильфо.
Практически любую TFT матрицу можно разобрать руками на составляющие, при этом не повредив её. Я делаю это уже не первый раз и это требует предельной аккуратности: не стоит работать пластиковой картой.
Тачскрин разделен на две части: сама резистивная пленка, которая наклеена на стекло, из которого выходит часть шлейфа тачскрина, который в свою очередь припаивается к шлейфу дисплея. Снимать изначально нужно резистивный слой: делается это ногтями и строительным/паяльным феном, которым мы равномерно прогреваем модуль (не перегреваем, иначе потечет пластик модуля подсветки). Клей начинает поддаваться примерно на ~50-80 градусах. В отличие от современных смартфонов, тачскрин приклеен лишь по краям, а не по всему периметру матрицы, поэтому при должной сноровке снятие пленки — не проблема.
После снятия тачскрина, нужно удалить стекло. Шлейф тачскрина лучше срезать или сразу выпаять с шлейфа дисплея. Остатки стекла можно выколупать и использовать освободившиеся места для того, чтобы осторожно поддеть остальную часть матрицы. Я равномерно продолжил прогревать стекло: сначала я смог поддеть стекло в одном места, продолжая прогревать, я смог поднять целую часть и затем уже всё стекло.
На дисплее оставались неприятные грязевые разводы, которые нельзя было отмыть, ведь они были на самой пленке. Вскрыть дисплей проще, чем отклеить тач: сверху есть выемка под ноготь + фен на небольшой температуре сделают своё дело. Внутри дисплея мы увидим вот это:
К пленке грязь почти не прилипает, но замечательно прилипает к зеркальной части, которую нужно оттереть влажной щёткой. После чистки, вытираем её тряпочкой, можно пройтись и обезжиривателем. Не «мацайте» пленки! Могут появиться небольшие засветы (я мацал и на некоторых появлялись, на некоторых нет). Таким образом, при определенной сноровке, можно разобрать любую матрицу: планшета, телефона, автомобильной магнитолы. Так что, даже вне контекста ремонта дисплея старенькой мобилки, информация может быть полезна любителям ремонтировать всё самому :)
Кстати, если вам всегда было интересно, как работают «прозрачные» дисплеи без поляризационной пленки и зеркальной поверхности, то как-то вот так:
Повреждений на матрице после разборки я не обнаружил, поэтому включив девайс, я убедился, что всё работает отлично:
Теперь посмотрим на оторванный разговорный динамик. Кто-то уже разбирал этот девайс и что-то хотел сделать, но по каким-то причинам не сделал, оставив динамик без одного проводка. После проверки, оказалось что динамик очень тихий и прикипел к корпусу. Нужна была замена. Точно такого динамика у меня не оказалось под рукой (хотя есть еще одна TV E72), поэтому я поставил туда динамик от филипса. Он хорошо зашел в корпус по вертикали, работает без дребезжаний и достаточно громок. Но это всё же временное решение — как попадется такой динамик, сделаю «по заводу» :)
А вот с звуковой частью всё очень интересно! Напоминаю, цена девайса была ~10$. За эту сумму нам поставили целый модуль с ДВУМЯ очень громкими динамиками!
Работал девайс на базе очень популярного в своё время чипсета MT6225 (потомки которого до сих пор используются в недорогих смарт-часах и большинстве дешевых кнопочников, наравне с чипами от Unisoc) и имел около 64мб встроенной памяти, большая часть которой отводилась под прошивку.
Основным ядром в нём был ARM926EJ-S, с поддержкой Jazelle (возможность нативного выполнения JVM байт-кода), работающий на частоте 104мгц, что было достаточно немного на тот момент (большинство брендовых телефонов работало на частоте 200+ мгц). Несмотря на заявленную поддержку Java, во многих устройствах эта фишка не использовалась, скорее всего на это повлияли отчисления Sun. Пользователю было доступно ~800кб памяти (это не опечатка), а данные хранить предлагалось на MicroSD-флешках. Этот же самый чипсет или его наследники использовался во многих недорогих телефонах тех же лет, причём вполне официальных: Philips, Fly, Explay. Причём в первых подделках на iPhone использовалась вариация с поддержкой Wi-Fi!
В программном плане, девайсы работали на базе RTOS Nucleus OS, с фирменной оболочкой MAUI. Исходники всей системы утекали в сеть и лежат на Github, найти их легко. Программы были статически слинкованы с системой, однако это не значит, что для них не было сторонних приложений. Кроме поддержки Java в некоторых телефонах, у китайских телефонов было еще две поддерживаемых платформы: MRP и VXP (платформа MediaTek). Причём работали они очень интересно: поддержки VXP зачастую не было в телефонах вообще, а если и была, то могла работать с глюками. Под капотом VXP был довольно простой виртуальной машиной с собственным байт-кодом.
А вот вторая платформа, MRP, уже интереснее тем, что является нативной. Причём она не зависит от ОС, эта же платформа успешно применялась на телефонах работающих на базе Unisoc. Здесь есть забавный нюанс, который есть почти в любом телефоне: часть приложений была вшита в скрытую файловую систему телефона и возможности запуска сторонних приложений не было без специального «лаунчера». В некоторых TV E71 есть даже предустановленный эмулятор NES на этой платформе (причем он идет как один из сэмплов к SDK).
Таким образом, можно было устанавливать нативные приложение на китайские мобилки, но если бы китайцы не стали все переусложнять, открыли бы SDK и сделали всё по-человечески — кто знает, может быть, MRP оставался бы до сих пор популярной платформой для фичефонов. Сейчас игры для MRP делает как минимум Gameloft с портами своих знаменитых тайтлов с j2me.
В своё время я не знал о MRP, да и интернета стабильного у меня не было. Я слышал о VXP, даже качал какие-то игрушки — но они не работали, да и MRP из проводника я запустить не смог. Если бы в моём экземпляре был эмулятор NES (а NES игры были очень дружелюбны к GPRS с играми по 50 килобайт), то даже без мапперов мне хватило бы библиотеки игр, чтобы уроки пролетали в мгновение! Кто знает, авось я бы наконец-то прошёл «Чипа и Дейла» :) Поддержка MRP в моём аппарате точно была, но если бы я нашёл более детальную информацию, то вероятно ходил бы с TV E72 до самой покупки свежего девайса.
В Китае, у этих игр был даже самый настоящий DRM и магазин приложений. Многие из игр, которые представлены в сборниках, могут требовать активацию. Было как минимум несколько магазинов приложений, которые могли быть предустановлены на устройство, особенно на современный (Gameloft Store и прочие магазины приложений). В Китае эта индустрия была более развита, нежели в РФ. В РФ обычно игры брали в виде готовых приложений и через костыли закидывали в папку mythroad. SDK для MRP приложений всё ещё можно найти в свободном доступе в сети.
❯ Обзор
У гаджета просто огромный по меркам кнопочников дисплей — целых 3", с довольно высоким разрешением 240x320 (на тот момент очень многие продолжали ходить с 176x208, а то и 128x160) и неплохой цветопередачей. Тачскрин — резистивный, система под него не особо оптимизирована, но пальцем пользоваться можно. Прошивка в целом выглядит стандартно для китайцев тех лет, однако конкретно эту отличает анимации интерфейса. Сам факт наличия какой-либо анимации был крутью, поскольку кроме китайцев, анимацией промышляли в основном Apple и Sony Ericsson.
Но настоящий «понт» тех лет — наличие гироскопа. Ни в одном кнопочнике я не видел поддержки гироскопа, причём такой крутой. Вот захотел ты себе повернуть девайс, чтобы посмотреть ТВ в широкоформатном режиме, или какой-нибудь сериал — хоб и вот ты смотришь кино горизонтально. На тот момент, это было действительно круто и удобно. Причём китайцы действительно заморочились и адаптировали всю систему под ландшафтную ориентацию. Вполне юзабельно, раньше я часто этим пользовался.
Качество связи в целом достаточно неплохое. В городских условиях ловит хорошо. Микрофон не особо качественный, но вероятно сказались водные процедуры в прошлом. Ограничения на контакты и СМС стандартные для китайцев — ~100 СМС и столько же контактов. При физическом повреждении, контакты вытащить не проблема с помощью сервисного софта, но какого-либо софта для синхронизации не предусмотрено. Две симки работают одновременно, но при звонке, другая становится недоступной. В своё время было очень популярно иметь по симке каждого оператора для экономии на связи, но сейчас я всё чаще вижу, как люди пользуются одной сим-картой.
В мультимедийном плане тут конечно ему равных нет. Орёт он очень громко, легко соревнуясь со старшими моделями из линейки XpressMusic. В те годы, громкость динамика была важнее, чем его качество, поэтому каких-то глубоких басов нет, но в целом, звучит достойно. Музыкальные возможности у девайса неплохие. Здесь есть полноценный 3.5 джек (в отличие от более ранних собратьев с проприетарными разъемами), а встроенный ЦАП выдаёт довольно неплохое качество звука даже в наше время! Плеер гибко настраивается, но к сожалению, нет поддержки эквалайзера. Плюс, есть возможность играть музыку через Bluetooth наушники.
Кому-то может понравится возможность играть FM-радио без антенны. Ловит хорошо, играет громко — что ещё нужно то!? Плюс, есть очень классная фишка с записью эфиров по расписанию. Такая фишка была очень полезной в своё время, когда выходил какой-то новый популярный трек, а у друзей его всего ещё нет, а интернет тарифицированный. Записал себе трек и ходишь передаёшь по Bluetooth по 5 рублей :) Был и телевизор, который действительно работал. У меня он правда ловил в основном чёрнобелый сигнал.
Но в целом, это все мультимедийные фишки девайса. Ни клиента E-Mail, ни поддержки Java (в некоторых экземплярах была ограниченная поддержка J2ME, которой хватало для Opera Mini, ICQ и части игрушек), нет почти никаких фишек. Но именно этому девайсу повезло, ведь в его прошивке есть поддержка стороннего софта — MRP! Так давайте посмотрим, во что же можно было поиграть! Есть даже небольшая отдельная каста людей, которым очень нравятся некоторые MRP игры. Вероятно потому что они очень сильно отдают ранними портативными консолями, например GameBoy Color. Но качество игр несравнимо.
❯ Играем на китайцах
Встроенных игр всего три — кости (с поддержкой гироскопа), карточки и три в ряд. Но они затерты бывшими владельцами таких девайсов.
У меня в коллекции довольно много самых разных китайских девайсов, но не все из них нормально поддерживают MRP. Например, другая китайская Nokia, вышедшая на год-два раньше, не поддерживала MRP вообще. Раз уж этот девайс поддерживает китайские нативные приложения, то я предлагаю на них посмотреть! Для установки игр, карту памяти необходимо вставить в телефон, а в папку «mythroad» на ней положить те самые MRP игры. Кроме того, нам понадобится упомянутый выше лаунчер — dsm_gm.mrp (скачать софт можно внизу статьи). Оригинальный китайский лаунчер показывает иероглифы и вообще дико неудобный, поэтому я предпочитаю RXManager, который нужно переименовать в dsm_gm.mrp и положить в mythroad. По какой-то причине, все китайские игры с DRM требуют наличия сим-карты во втором слоте (если она одна — можно просто переставить в второй слот). Для запуска лаунчера нужно ввести код *#220807# и выбрать игру в проводнике. В устройствах обычно 4-8мб ОЗУ, а в качестве кучи (heap) под приложений выделяется 1мб, из которых свободно около 800кб.
Часть игр требует активацию и просят иероглифами ввести код. Можно просто нажать «назад» и они перестают его просить… магия. Игр вышло действительно много, самых разных жанров, но особо именитых среди них нет. Есть как порты с NES (запакованный эмулятор NES с ромом), так и «эксклюзивы». Из Must have программ могут пригодится Opera Mini и UC-Web.
Начнём с эмулятора NES, поскольку он один-единственный способен заменить всю библиотеку китайских игр. Есть два вида эмуляторов: MRP NES Platform (может потребовать активацию) и эмулятор из сэмплов. Ромы для первого надо закидывать в папку MyNes в корне флешки, для второго — в папку mythroad/nes. К сожалению, 104мгц ядро, которое помимо эмуляции занято и задачами поддержки связи, слабовато для таких игр. Другое дело, следующая итерация — MT6235, в котором клок подняли аж в два раза — до 200мгц. Там эмулятор должен идти гораздо лучше. Эмулятор не поддерживает мапперы, поэтому придётся ограничится играми весом до ~50кб. Работает он примерно 15 FPS, но на девайсах с более шустрыми чипами, должен выдавать и 30-40.
Игрушки идут как-то так. Чем больше спрайтов на экране, тем больше тормоза. У таких мобилок нет аппаратных спрайтов само собой и весь блиттинг производится софтово. При этом, SDK на первый взгляд очень… своеобразное, поэтому неизвестно как оно под капотом работает. Наличие хотя бы таких аркад у владельцев «китайцев» считалось довольно круто, поскольку не на все девайсы можно было вообще что-либо поставить:
Система вполне шустро работала на телефонах тех лет, кроме первых подделок под айфоны: там разрешение экрана было больше, плюс неоптимальная перерисовка давала тормоза.
В целом, если что-то очень нужно будет загуглить, Opera Mini даст такую возможность, однако весь современный софт для кнопочников (в т.ч и WhatsApp) перебрались на платформу VXP.
❯ Заключение
После всех испытаний, девайс продолжает оставаться полностью работоспособным без каких либо проблем. Когда я слышал раньше «ха, да этот китаец хотя-бы месяц проработает?», я не ожидал, что он переживет даже некоторые брендовые устройства с фирменными болячками (Nokia — фильтр изображения, Sony Ericsson — модем). А в чём секрет такой надёжности? Максимальная простота и интеграция всего в один чип. И именно поэтому, ситуация сложилась ровно наоборот: ведь современные Nokia от HMD являются прямыми потомками этой самой китайской нокии… Вот как так получилось то? ;)
Эта модель была очень распространенной и вероятно у кого-то может лежать в подвале и ждать своего часа. Если есть необходимость заиметь второй аппарат-звонилку, то в целом, «нокла» может подойти не хуже новодельных девайсов за 700 рублей в ближайшем DNS. Я лично считаю, что девайс был весьма функционален и имел перспективы в своё время, но ему мешала жадность китайских вендоров на SDK и закрытость. Китайцы могли бы подвинуть Nokia S40 на бюджетном рынке ещё раньше, если бы открыли свою альтернативу j2me, при этом оставив цену такой-же. Ну а чем же является этот девайс для вас — решать только вам!
Плюсы:
+ Стандартные интерфейсы — зарядка через тонкий разъем Nokia, 3.5мм джек. + Поддержка сторонних приложений. + Неплохой набор фишек на своё время + Громкий и качественный звук, неплохой как звонилка.
Минусы:
- Несколько сырая прошивка, не все фишки работают нормально. - Медленный ЦПУ. Для эмуляторов не хватает. - Отсутствие поддержки J2ME и отсутствие программ для синхронизации
Это не разовая статья о конкретном девайсе, я регулярно пишу статьи о различных недорогих гаджетах.
Подпишись на наш блог, чтобы не пропустить новые интересные посты!