Тэкс, судя по описанию там с большой вероятностью есть ещё 1 баг, и он остался.
Итак разберём ситуацию что произошла и вероятность того что есть ещё 1 баг, а я бы сказал даже не баг а дырень в безопасности.
Произошёл баг на фронте в результате чего была неправильно посчитана сумма заказа, далее эта неправильная сумма отправилась на бэк для создания заказа и ссылки на платёжную систему, и чувствуете да, а какого хуя бэк пропустил эту сумму? То есть мы можем отправить любую сумму на бэк за любой заказ и нам это сойдёт с рук.
Конечно есть мааааленькая вероятность что и на бэке и на фронте был неправильный алгоритм расчёта такой корзины, в чем я очень сомневаюсь, судя по сайту там 1-2 человека над ним работают уровня где то middle и у них легко могла быть такая вот дыра в понимании уязвимостей.
Если сейчас приехать в пункт приема металлолома, то можно обнаружить просто огромные кучи различных телефонов и прочих электронных «отходов», которые стоят под открытым небом и ждут, когда придёт их черёд окончательного разложения. Однако при ближайшем рассмотрении выясняется, что многие девайсы оказываются полностью рабочими даже после недельного лежания под палящим солнцем и проливными дождями, а сдали их в чермет по причинам «не нужен, надоел, купил новый» и т. п. Я не считаю это правильным, ведь даже в простые кнопочные звонилки имеется возможность вдохнуть новую жизнь, если знать один интересный, но малоизвестный факт: для них можно писать нативные приложения на C и использовать железо телефона в своих целях. А это, на минуточку, как минимум: дисплей с подсветкой, вибромотор, динамик, клавиатура и GSM-радиомодуль с возможностью выхода в сеть. Сегодня мы с вами: узнаем, на каких аппаратных платформах работают китайские телефоны, какие существуют программные платформы и где взять для них SDK, а в практической части мы напишем 2D-игру с нуля, которая будет работать на многих китайских кнопочниках. Интересно? Тогда жду вас под катом!
Содержание:
Не J2ME едины
Аппаратные ресурсы
Кроссплатформенный рантайм
Кроссплатформенный рантайм: Win32
Кроссплатформенный рантайм: MRE
Кроссплатформенный рантайм: VXP
Наконец-то пишем игру
Тестируем на реальных девайсах
Заключение
❯ Не J2ME едины
Думаю, многие мои читатели помнят о такой платформе, как J2ME. Java-приложения стали фактически основной возможностью расширения функционала телефонов в 2000-х годах. API для них был достаточно хорошо стандартизировано, программы не зависели от архитектуры процессора и ОС устройства, а порог вхождения для написания собственных приложений был довольно низкий и даже новички могли за пару дней написать свою игрушку или какое-нибудь GUI-приложение!
Однако не одним J2ME мы были едины: существовало множество платформ, которые так или иначе пытались занять нишу Java на рынке. Некоторые из них я упоминал в своей прошлой статье о написании 3D-игры под Sony Ericsson с нуля: например, была такая платформа на телефонах Sony Ericsson серии T, как Mophun, а CDMA-телефонами с чипсетами Qualcomm использовалась нативная платформа BREW. Пожалуй, я не буду упоминать о .sis и .cab — поскольку это форматы нативных приложений для смартфонов, а не простых «фичефонов».
В какой-то момент, ближе к 2006-2007 году, прилавки российских официальных ритейлеров (по большей части это были телефоны Fly) и неофициальных продавцов на рынках заполонили различные китайские телефоны, которые предлагали какой-то немыслимый функционал для тех лет за копейки, да ещё и визуально напоминали флагманские модели известных брендов. Пожалуй, одним из самых популярных таких телефонов была Nokla TV E71/E72 (да, именно «нокла»), вышедшая примерно в 2008 году и производившаяся аж до 2011 года! За 2-3 тысячи рублей (это менее 100 баксов), пользователь получал здоровый 2.4" дисплей с разрешением 240x320 весьма неплохого качества (когда в те годы многие продолжали ходить с 176x220), да ещё и с тачскрином, гироскоп, огромный громкий динамик (пусть и не очень качественный), поддержку SD-карточек до 32Гб, нередко фронтальную камеру, а также премиальный дизайн с вставками из алюминия. Частенько китайцы заботливо клали в коробку ещё чехольчик и дополнительный аккумулятор :)
Были даже полные копии существующих устройств от Nokia. Особенно китайцы любили подделывать массовые модели на S40: они были очень популярными и китайцы хотели откусить свой кусок рынка у Nokia. Пусть и рынка серого импорта — очевидно, в салонах связи подделки никто не продавал:
Но была и ложка дёгтя в этой бочке меда: китайские телефоны очень часто не имели поддержки Java, из-за чего многие пользователи разочаровывались в них из-за отсутствия возможности установить необходимые им приложения. Никакой тебе оперы, аськи, игр… Скорее всего, это связано с необходимостью отчислений Sun, а также разработчикам реализации J2ME-машины (JBed/JBlend) и установки чипа флэш-памяти чуть большего объёма.
Но многие пользователи не знали, что такие девайсы не просто поддерживали сторонние приложения, но и умели выполнять настоящие нативные программы, написанные на полноценном C! Всему помешала китайская костыльность и тотальная закрытость. Платформа предполагалась для работы на внутреннем рынке. Для вызова менеджера нативных приложений необходимо было вводить специальный инженерный код в номеронабирателе, предварительно скопировав приложение в нужную папку, а SDK долгое время было платным и доступно только для компаний из Китая. Кроме того, далеко не все приложения могли запустить на конкретном девайсе — были серьезные проблемы с совместимостью.
Всё как вы любите: HiTech-девайсы на фоне ковра, который старше автора лет на 30 :)
В ранних китайских телефонах использовалась платформа Mythroad (MRP, MiniJ) от китайской компании SkyWorks, которая лицензировала свою технологию производителям чипсетов. Поддержку MRP можно было встретить на телефонах с чипсетами MediaTek, Spreadtrum, а также MStar (и возможно Coolsand). Mythroad предоставлял некоторое API для работы с железом телефона и разработки как UI-приложений, так и игр, кроме того, Mythroad позволял хранить ресурсы в одном бинарнике с основной программой и даже имел какой-то интерпретируемый язык помимо возможности запуска нативного кода. Для работы таких приложений необходимо было скопировать менеджер приложений dsm_gm.mrp и игру в папку mythroad во внутренней памяти устройства или на флэшке, а затем набрать в номеронабирателе код *#220807#, иногда при отключенной первой SIM-карте. Костыльно? Костыльно! Откуда об этом знать среднестатистическому пользователю? Не откуда! Но работало!
Эта платформа поддерживалась на большинстве подделок под брендовые устройства Nokia, Sony Ericsson и Samsung, а также iPhone и на многих китайских кнопочных телефонах 2008-2010 годов.
Ближе к 2010 году MediaTek разработала свою собственную платформу, которая должна была заменить MRP — WRE (VXP). Эта платформа была гораздо шире с точки зрения функционала (например, был доступ к UART) и её API был вполне удобно читаем для программиста, а SDK свободно доступен для всех. Один нюанс всё портил — приложения без подписи привязывались к IMSI (даже не IMEI) симки в девайсе и на некоторых девайсах требовали переподписания под каждую конкретную SIM или патчинг дампа оригинальной прошивки телефона на отключение проверки подписи. Эта платформа поддерживалась на многих кнопочниках и смарт-часиках 2010-2020 годов: к ним относятся новодельные телефоны Nokia, телефоны DNS и DEXP, Explay и т. п. Для запуска приложений достаточно было выбрать файл с разрешением VXP в проводнике и просто запустить его. Но с совместимостью всё равно имелись проблемы: если запустить VXP для версии 2.0 и выше, мы получим лишь белый экран. Ну хоть не софтресет, и на том спасибо!
Далеко не все такие часы поддерживают MRE, смотреть нужно от устройства к устройству
❯ Аппаратные ресурсы
Большинство китайских кнопочных телефонов работает на базе одних и тех же чипсетов. В конце нулевых чаще всего использовались чипсеты MT6225, SC6520 и некоторые чипы от Coolsand. Средние хар-ки девайса были следующими:
Процессор: ARMv5 ядро на частоте ~104МГц, ARM926EJ-S. Нет FPU, есть Thumb. Большую часть процессорного времени программа могла забрать себе.
ОЗУ: ~4Мб SDRAM. Программам было доступно 512Кб-1Мб Heap'а. Это, в целом, довольно немало для большинства применений.
Флэш-память: ~32Мб, пользователю доступно пару сотен килобайт. Да, вы не ослышались, килобайт! Однако можно без проблем использовать MicroSD-флэшки до 32Гб.
Дисплей: от 128x128 до 320x480, почти всегда есть 18-битный цвет (262.000 цветов), в случае TV E71/E72 используется очень неплохая TN-матрица с хорошими углами обзора и яркой подсветкой. Иногда есть тачскрин.
Звук: громкий динамик, наушники.
Аккумулятор: ~800мАч, на некоторых девайсах может быть и 2.000мАч, а то и больше!
Ввод: клавиатура, иногда была поддержка QWERTY.
Внешние шины: почти всегда был доступен UART, причём его можно было свободно взять прямо с платы — он был явно подмечен! Взять GPIO с проца не выйдет (кроме, возможно, вибромотора), SPI и I2C также напрямую недоступны. Внешние шины можно реализовать с помощью UART через GPIO-мост из микроконтроллера.
В итоге мы получаем очень неплохие характеристики для устройства, которое сочетает в себе сразу всё. На базе такого девайса можно сделать и сигнализацию, и HMI-дисплей с интерфейсом для управления каким-нибудь устройством, и игровую консоль с эмуляторами… да на что фантазии хватает! И это за какие-то 200-300 рублей, если мы говорим о б/у устройстве или 600 рублей, если говорим о новом. Это дешевле, чем собирать девайс с подобным функционалом самому из готового МК (например, RP2040) и отдельных модулей. Кстати, дешевые 2.4" дисплеи на алике — это ни что иное, как невостребованные остатки дисплеев для подобных китайских телефонов на складах! А вы думали, откуда там значки на тачскрине снизу?
Однако в рамках данной статьи мы не будем ограничиваться лишь теорией и на практике напишем примитивную 2D-игрушку, которая будет работать сразу на трех платформах без каких-либо изменений в коде самой игры: Windows, MRP (Mythroad) и VXP. Но для того, чтобы достигнуть такого уровня абстракции от платформы, нам необходимо написать рантайм, который оборачивает все необходимые платформозависимые функции для нашей игры.
Игрушка будет простой: 2D скролл-шутер с видом сверху, а-ля Asteroids. Летаем по космосу, и стреляем по враждебным корабликам, стараясь не попасть под вражеские лазеры. Всё просто и понятно :)
❯ Практическая часть: Кроссплатформенный рантайм
Итак, что нам необходимо от абстракции для такой простой игры? Давайте посмотрим:
Графика: очистка экрана, отрисовка спрайтов с прозрачностью (без альфа-блендинга, только колоркей), отрисовка текста. При возможности, желательно использовать нативное API системы для рисования графики, а не городить собственный блиттер. Формат пикселя фиксирован: RGB565 (65к цветов).
Ресурсы: хранятся в одном образе с основной игрой. Фактически, все ресурсы упакованы в виде обычных массивов байт в заголовочных файлах. Я пользуюсь вот этой тулзой для конвертации спрайтов в массивы байтов.
Звук: воспроизведение хотя-бы одного WAV-потока. Почему одного? Потому что далеко не на всех платформах есть доступ к аппаратному микшеру… да и вообще не везде есть прямой доступ к PCM (привет MRP), иногда разработчики ограничиваются лишь одним каналом для WAV-звука без возможности воспроизведения нескольких аудиофайлов одновременно.
Ввод: абстракция от клавиатуры классического моноблока: стрелки, OK, левый и правые софткеи.
Стандартная библиотека: не на всех платформах можно вызывать функции напрямую из stdlib. Как минимум в MRP и, например, «эльфах» для Motorola, нет возможности вызывать аллокатор, rand и некоторые другие функции из обычных заголовочников стандартной библиотеки. На таких платформах, системные инклуды дефайнами подменяют стандартные функции на своих реализации:
#define malloc system_alloc
#define free system_free
Но если у нас игра кроссплатформенная, то и платформозависимые инклуды мы использовать не будем.
Выглядит всё достаточно просто, верно? Примерно такого набора функций хватит для нашей игры:
❯ Win32
Давайте же перейдем к реализации рантайма на каждой платформе по отдельности. Начнём с Win32, поскольку адекватно отлаживать игру можно только на ПК.
На десктопе у нас будет фиксированное окно 240x320, в качестве GAPI будет использоваться аппаратно-ускоренный OpenGL, а для обработки ввода будет использоваться классически GetAsyncKeyState. Реализация точки входа, создания окна и инициализации контекста GL и главного цикла приложения у нас такая:
Реализация отрисовки спрайтов очень примитивная — OGL 1.0, полностью FFP, вся отрисовка — это 2 треугольника, формирующие квад. Спрайт заливается при первом использовании в текстуру, последующие кадры реюзается уже готовая текстура. Фактическая реализация всего рендерера — т. е. функций для рисования «просто картинок», без поддержки атласов, блендинга цветов (З.Ы - длинные листинги будут на пастбине, на Пикабу нет нормального тега для кода):
С вводом тоже всё просто. Есть биндинг кнопок клавиатуры к кнопкам на кейпаде телефона. inGetKeyState предполагается вызывать один раз за кадр, поэтому функция опрашивает ОС о состоянии нажатых кнопок на клавиатуре и назначает состояние виртуальных кнопок относительно состояния физических кнопок на клавиатуре.
Результат:
❯ MiniJ
Переходим к реализации рантайма для первой китайской платформы — MRP. Обратите внимание — я использую нативное API платформы для рисования спрайтов. Связано это с тем, что софтварный блиттер работает невероятно медленно даже с прямым доступом к скринбуферу устройства, а в чипсете предусмотрена отдельная графическая подсистема с командбуфером для быстрой отрисовки примитивов и графики:
SDK для MRE можно найти здесь (SKYSDK.zip): оно уже пропатчено от необходимости покупки лицензии. MRP не развивается более 10 лет, поэтому, думаю, его можно считать Abandonware. Компилятор находится в compiler/mrpbuilder.NET1.exe. За китайские SDK в публичном доступе нужно поблагодарить пользователя 4pda AjlekcaHgp MejlbHukoB, который раздобыл их на всяких csdn и выложил в свободный доступ :)
У MRP собственная система сборки, основанная на конфигурациях. Поскольку MRP может работать на устройствах с разными платформами и размерами дисплеев, под каждую можно настроить свой конфиг, который пережмет ресурсы в нужный формат. Дабы ничего не ломать, я заюзал абсолютные пути:
Компиляция приложения:
mrpbuilder.net1.exe game.mpr
Начинаем с функций обработки событий и инициализации, которые вызывает рантайм при старте приложения: mrc_init вызывается при старте приложения, а mrc_event при возникновении события. Вся инициализация очень простая: создаём таймер для обновления и перерисовки состояния игры и вызываем инициализацию игры:
С вводом тоже никаких проблем нет, нажатия кнопок прилетают как события в mrc_event. Переводим кейкоды MRE в наши кейкоды и сохраняем их состояние:
Опять же, отлаживать MRP-приложение под реальным устройством проблематично, поэтому платформозависимый код должен быть минимальным. Кроме того, обратите внимание, что некоторые функции в MRP зависят от библиотек-плагинов. Линкер слинкует вашу программу, но на реальном устройстве их вызов вывалится в SIGSEGV и софтресет устройства. Также нельзя использовать ничего из стандартной библиотеки именно в стандартных заголовочниках (т. е. stdlib.h, string.h и т. д.), часть стандартной библиотеки реализовывается MRP и дефайнится в mrc_base.h
Что интересно, защиты памяти толком нет. Если приложение падает в SIGSEGV или портит память — систему, судя по всему, ребутит Watchdog. Защиты памяти никакой, можно напрямую читать и писать в память ядра, а также писать в регистры периферии чипсета. jpegqs, покумекаем над этим? :)
Переходим к рендереру. Тут буквально две функции, gClearScreen очищает экран, а gDrawBitmap рисует произвольный спрайт с форматом пикселя RGB565. В качестве ROP используется BM_TRANSPARENT — таким образом, mrc_bitmapShowEx будет использовать левый верхний пиксель в качестве референсного цвета для реализации прозрачности без альфа-блендинга.
voidgDrawBitmap(CBitmap* bmp, int x, int y) {
mrc_bitmapShowEx((uint16*)bmp->pixels, x, y, bmp->width, bmp->width, bmp->height, BM_TRANSPARENT, 0, 0);
}
Да, всё вот так просто. Рантайм теперь запускается на реальных китайских девайсах и работает стабильно.
❯ VXP
Теперь переходим к VXP — платформе не менее неоднозначной, чем MRP. Пожалуй, начать стоит с того, что VXP существует аж в трёх версиях: MRE 1.0, MRE 2.0 и MRE 3.0. В MRE 2.0 и выше появилась поддержка плюсов (в MRE 1.0 только Plain C) и довольно интересного GUI-фреймворка, MRE 1.0 же предлагает реализовывать гуй самому. Платформа распространена на большинстве кнопочных телефонов и смарт-часиков на чипсетах MediaTek, примерно начиная с 6235 и заканчивания 6261D. SDK можно скачать вот здесь (см MRE_SDK_3.0).
VXP сам по себе более функционален чем MRE, поскольку ориентирован исключительно на телефоны с чипсетами MediaTek. Но что самое приятное — есть доступ к уарту без каких либо костылей! То есть, если сделать GPIO-мост на условной ESP32, то мы можем получить готовый мощный МК с клавиатурой, кнопками, дисплеем, звуком и т. д. Звучит не хило, да? Кроме того, у нас есть доступ и к BT, и к GPRS, и к SMS без каких либо ограничений.
Однако в бочке мёда нашлась и ложка дёгтя: для компиляции MRE-приложений необходимо накатывать и крякать довольно старый компилятор ADS, который сам по себе поддерживает только C89 (например, нет возможности объявить переменную в объявлении цикла или середине функции, только в начале, как в Pascal). ADS уже вроде как Abandonware, так что это вроде не наказуемо… но всё равно неприятно.
Кроме того, на некоторых девайсах (в основном, фирменных Nokia а-ля 225), прошивка требует подписи у всех бинарников, либо если бинарник отладочный, то должна быть привязка к конкретному IMSI.
К тому же, каждая программа должна фиксированно указывать в заголовке, сколько Heap-памяти ей необходимо выделить. Оптимальный вариант — ~500Кб, тогда приложение запустится вообще на всех MRE-телефонах.
Зато у VXP есть адекватный симулятор под Windows. Но зачем он нам, если у нас порт игры под Win32 есть? :)
Начинаем с инициализации приложения. В процессе вызова точки входа, приложение должно назначить обработчики системных событий, коих бывает несколько. Для обработки ввода и базовых событий хватает всего три: sysevt (события окна), keyboard (физическая клавиатура. Есть полная поддержка QWERTY-клавиатур), pen (тачскрин).
Переходим к обработчику системных событий. Обратите внимание, что MRE-приложения могут работать в фоне, из-за чего необходимо ответственно подходить к созданию и освобождению объектов. Что важно усвоить с самого начала — в MRE нет понятия процессов и защиты памяти, как на ПК и полноценных смартфонах. Любая программа может попортить память или стек ОС, более того, программа использует аллокатор остальной системы, поэтому если ваша программа не «убирает» после себя, данные останутся в памяти со временем приведут к зависанию. Впрочем, WatchDog делает свою работу быстро и приводит телефон в чувство (софтресетом) за 1-2 секунды. Но как и в случае с MRE, есть приятный бонус: прямой доступ к регистрам чипсета :)
Переходим к обработке событий с кнопок. Тут всё абсолютно также, как и на MRE, лишь имена дейфанов поменялись :)
И наконец-то, к графике! Пожалуй, стоит сразу отметить, что более 20-30 FPS на большинстве устройств вы не получите даже с прямым доступом к фреймбуферу. Похоже, это связано с тем, что в MRE довольно замороченная графическая подсистема с поддержкой альфа-канала (только фиксированного во время вызова функции отрисовки картинки/примитивов, сам пиксельформат всегда RGB565) и нескольких слоев. Кроме того, похоже есть ограничения со стороны контроллера дисплея.
Изначально, MRE предполагает то, что все картинки в программе хранятся в формате… GIF. Да, весьма необычный выбор. Однако для работы с пользовательской графикой, есть возможность блиттить произвольные картинки напрямую из RAM. Вот только один нюанс — посмотрите внимательно не объявление следующей функции:
dst_disp_buf — это целевой RGB565-буфер. Логично предположить, что и src_disp_buf — тоже обычный RGB565-буфер! Но как бы не так. Документация крайне скудная, пришлось посидеть и покумекать, откуда в обычном 565 буфере возьмется индекс кадра. С подсказкой пришёл пользователь 4pda Ximik_Boda — он скинул структуру-заголовок, которая идёт перед началом каждого кадра. В документации об этом не сказано ровным счетом ничего!
Сначала я реализовал софтовый блиттинг, но он безбожно лагал. Мне стало интересно, почему нативный blt быстрее и… вопросы отпали после того, как я поглядел в ДШ чипсета: тут есть аппаратный блиттинг. И даже с ним девайс не может выдать более 20FPS!
Для реализации более-менее шустрого вывода графики, необходимо сначала создать канвас (фактически, Bitmap в MRE), создать и привязать к нему layer, получить указатель на буфер слоя и только потом скопировать туда нашу картинку. Да, вот так вот замороченно:
И только после этого всё заработало достаточно шустро :) В остальном же платформа довольно неплохая. Да, без болячек не обошлось, но всё же перспективы вполне себе есть.
На данный момент, этого достаточно для нашей игры.
❯ Пишем геймплей
Рантайм у нас есть, а значит, можно начинать писать игрушку. Хоть пишем мы на Plain-C, я всё равно из проекта в проект использую +- одну и ту же архитектуру относительно системы сущностей, стейтов и т. п. Поэтому центральным объектом у нас станет CWorld, который хранит в себе на пулы с указателями на другие объектами в сцене, а также игрока и его состояние:
Система стейтов простая и понятная — фактически, между состояниями передавать ничего не нужно. При нажатии в главном меню на «старт», нам просто необходимо проинициализировать мир заново и начать геймплей, при смерти игрока — закинуть его обратно в состояние меню. Стейты представляют из себя три указателя на функции: переход (инициализация), обновление и отрисовка.
typedefvoid(CGameStateCallback)();
Поскольку мы хотим некоторой гибкости при создании новых классов противников, то вводим структуру CEnemyClass, которая описывает визуальную составляющую врагов и их флаги — могут ли они стрелять по игроку или просто летят вниз (астероиды), как они передвигаются (зигзагами например) и т. п.
Всё! Для текущего уровня реализации игры этого достаточно :) Переходим к реализации игровой логики. Вообще, динамический аллокатор в играх для китайских платформ лучше использовать как можно меньше. Heap'а довольно мало (~600Кб), да и не совсем понятно, как этот аллокатор реализован, есть вероятность, что используется аллокатор и куча основной ОС.
Начинаем с реализации полёта кораблика. Для этого он должен реагировать на стрелки и не улетать за границы экрана, а ещё для красоты он должен «вылетать» из нижней границы экрана при старте игры:
Переходим к динамическим пулам с объектами. Как вы уже заметили, их всего два — враги и летящие снаряды. Реализация спавна врагов/снарядов простая и понятная: мы обходим каждый элемент пула, если указатель на объект не-нулевой, значит объект всё ещё жив и используется на сцене. Если нулевой — значит ячейка свободна и можно заспавнить новый объект:
При обходе пула во время обновления кадра, мы обновляем состояние каждого объекта и если его функция Think вернула true, значит объект больше не нужен и его нужно удалить:
if (enemyThink(world.enemyPool[i]))
{
sysFree(world.enemyPool[i]);
world.enemyPool[i] = 0;
}
А вот и реализация Think:
boolenemyThink(CEnemy* enemy) {
enemy->y += enemy->_class->speed;
if (enemy->y > gGetScreenHeight() || enemy->health <= 0) return true;
return false;
}
Но кораблики должны же откуда-то появляться! Для этого у нас есть переменная nextSpawn, которая позволяет реализовать самый простой тип спавнера — относительно времени (или в нашем случае тиков):
world.nextSpawn--;
if (world.nextSpawn < 0) {
CEnemy* enemy = spawnEnemy(&enemyClasses[0]);
world.nextSpawn = randRange(40, 70);
}
Результат: мы уже можем полетать, пострелять и поуворачиваться от вражеских корабликов!
Уже что-то напоминающее игру! Осталось лишь добавить подсчет очков, менюшку, разные виды противников, возможно какие-то бонусы и у нас будет готовая простенькая аркада. В целом, выше приведена достаточно неплохая архитектура для простых 2D-игр на Plain C. Фактически, она может быть хорошей базой и для ваших игр: в теме о китах на 4pda я встречал немало людей, которые банально не знали, с чего начать.
❯ Что у нас получилось?
Но без тестов на реальных устройствах материал не был бы таким интересным! Поэтому давайте протестируем игру на двух реальных телефонах, как вы уже догадались, один — Nokla TV E71, а второй — клон Nokia 6700, который подарил мне мой читатель Никита.
На TV E71 игра идёт не сказать что очень бодро. Кадров 15 точно есть, что, учитывая разрешение 240x320, весьма неплохо для такого девайса.
а 6700,, даже учитывая более низкое разрешение — 176x220, дела примерно также — ~15FPS! Но поиграть всё равно можно. Уже хотите написать «автор наговнокодил, а теперь ноет из-за низкого FPS»? Ан-нет, я попробовал игры сторонних разработчиков — они идут примерно также :( К сожалению, таковы аппаратные ограничения устройства.
Исходный код игры с Makefile'ами и файлами проектов для Visual Studio и MRELauncher доступны на моём GitHub. Свободно изучайте и используйте его в любых целях :)
❯ Заключение
Но в остальном же, демка получилась довольно прикольной, как и сам опыт программирования для китайских телефонов. В общем и целом, китайцы пытались максимально упростить API и привлечь разработчиков к своей платформе. Если ради примера взглянуть на API для Elf'ов на Motorola, можно ужаснуться от state-based архитектуры платформы P2K. А тут тебе init, event, draw — и всё!
Но популярности помешала непонятная закрытость платформы, костыльный запуск программ, отсутствие нормального симулятора. А ведь сколько фишек было: даже возможность писать и читать память ядра! А вы как считаете? Можно ли вдохнуть в китайские кнопочники новую жизнь, узнав о наличии возможности запуска нативного кода на них?
P. S.: Друзья! Время от времени я пишу пост о поиске различных китайских девайсов (подделок, реплик, закосов на айфоны, самсунги, сони, HTC и т. п.) для будущих статей. Однако очень часто читатели пишут «где ж ты был месяц назад, мешок таких выбросил!», поэтому я решил в заключение каждой статьи вставлять объявление о поиске девайсов для контента. Есть желание что-то выкинуть или отправить в чермет? Даже нерабочую «невключайку» или полурабочую? А может, у этих девайсов есть шанс на более интересное существование! Смотрите в соответствующем посте, что я делаю с китайскими подделками на айфоны, самсунги, макбуки и айпады! Да и чего уж там говорить: эта статья уже сама по себе весьма наглядный пример! Найти меня можно в комментариях тут, на Пикабу, и в тг @monobogdan
Понравился материал? У меня есть канал в Телеге, куда я публикую бэкстейдж со статей, всякие мысли и советы касательно ремонта и программирования под различные девайсы, а также вовремя публикую ссылки на свои новые статьи. 1-2 поста в день, никакого мусора!
Полезный материал?
Были ли у вас такие китайчики?
Материал подготовлен при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, дабы не пропускать новые статьи каждую неделю!
Всем привет . Прошу помощи с выбором игрового монитора сумма до 60 тысяч рублей , может даже б/у. Хочу конечно 4к моник и hdr .Часто приходиться ездить в командировки , вожу с собой ps5 и старый монитор Самсунг s27a950d , но он уже динозавр и начал выгорать . Интересна диагональ 32 дюйма , но хороший монитор стоит сотку , лучше еще столько докинуть и обновить телевизор дома)) Сейчас у среднебюджетников популярна матрица va , но там конкретные засветы на черном , очень бесят пятна . Обзоров посмотрел кучу , но , как говориться , каждый хвалит свое болото , либо пиарит то за , что заплатили . Не нашел не одного обзора , как выводит изображение плойка на широкоформатных изогнутых мониторах типа HUAWEI MateView GT 34 (для примера ). В днс и М.Видео крутят всякие видюшки или заставки в очень плохом качестве и реально не понятно , как выглядит картинка . Дома старенький телек Самсунг UE49KS9000U и когда его брал в свое время , поменял 2 штуки , потому что тоже были дикие засветы и пятна на матрице , для старичка до сих пор на нем приятно играть . Интересует мнение именно владельцев PlayStation или коробочников , стоит ли заморачиваться с высокой герцовкой и обязателен ли выход hdmi 2.1 , может взять 2к моник на IPS . Был вариант взять Одиссей g7 32 за 53тыс , но там тоже беда с полосами . Сильно не газуйте , но реально после использования телефона и планшета , садишься за монитор и засветы бесят .
Поговорил с коллегой: Я работаю в одной большой немецкой сети. В европе есть стандарты для Штрихкода (нп EAN, ISBN ). Это тот который из полосочек. В принципе это просто набор цифр который присваивают определенному товару(Код продукта). Сроки годности через него получить не получится(прицепил картинку для наглядности). В России же, с 2018 года, ввели отдельную маркировку товара с помощью системы маркировки товара "Честный ЗНАК". Так вот этот знак не просто штрихкод, а нечто большее: QR-код (если еще точнее GS1 DataMatrix). Вот в него можно вписать больше данных, но и тут не заносится срок годности, а:
Код продукта (GTIN)
Серийный номер
Ключ проверки
Электронная подпись
и еще немного мишуры.
Именно посредством серийного номера система определяет дату изготовления, сроки годности и всю прочую информацию, относящуюся к данной партии товара.
Кстати, в Германии применение GS1 DataMatrix не является обязательным условием. Однако, в России наложение GS1 DataMatrix становится обязательным для некоторых категорий товаров.
Использование GS1 DataMatrix, несомненно, приносит выгоду потребителю, однако оно также представляет собой финансовое бремя для производителя(которое в последующем вкладывается в цену товара), так как этот код нужно сначала купить.
Например, покупка EAN стоит в Германии примерно 40€ за условный продукт (например 1 Литр молока фирмы "Коровка" в пластиковой бутылке), а GS1 DataMatrix стоит уже 55€ и его надо будет покупать для каждой партии произведенного товара. И мне кажется что это еще не конечная цена... Надеюсь мой ответ удовлетворил вашу жажду знаний :-)
В прошлой статье, мы с вами рассмотрели на что способен одноплатный компьютер, который стоит всего 1.000 рублей. Как мы выяснили, перспективы у данного девайса весьма неплохие, однако по факту, Orange Pi продаёт практически голую железку, которую нужно дорабатывать самому. Да, тут есть Ubuntu/Fedora, да, тут выведена гребенка с I2C/SPI — однако из коробки это всё работает криво-косо, либо не работает совсем. Даже обещанные шины SPI/I2C фактически не доступны в системе «из коробки». Материалов о доработке этого одноплатника в сети мало, поэтому я решил довести его до ума сам и поделится с вами — в том числе, готовыми бинарными образами! Интересно, на что способен доработанный одноплатник по цене ящика пива? :)
Над чем будем работать
В прошлой статье, мы с вами определились с потенциальными перспективами такого устройства. По цене 3х ESP32, производитель предлагает нам два полноценных вычислительных ARM-ядра, 256 мегабайт оперативной памяти, 512 мегабайт встроенной NAND-памяти, контроллер питания с возможностью работы от литий-ионных АКБ и 3G модем. Но в бочке меда нашлась ложка дегтя: никто не собирался это всё поддерживать и Orange Pi практически сразу «забили» на поддержку устройства, ограничившись портом Debian/Ubuntun на устройство.
Более того, производитель даже не описал как работать с GPIO и шинами устройства — что фактически превращало его из одноплатника в обычную ТВ-приставку, только без нормального видеовыхода. Меня крайне удивило, почему над такой дешевой платой не хотело работать коммьюнити — большинство людей только видели всю ситуацию и шли оставлять негативный отзыв, не попытавшись даже разобраться. А ведь для опытного линуксоида-эмбеддера здесь работы на день-два!
Ко всему прочему, в Linux не работает GSM-стек. Да, совсем. Производитель даже не стал кооперироваться с MediaTek, чтобы попытаться реализовать работу с модемом на уровне системы. А ведь фактически, вся работа с модемом происходит лишь на уровне AT-команд. Так в чем же проблема была?
Со всем этим мне и предстоит разобраться! Клонируем репозиторий с исходниками ядра и бежим собирать!
Собираем ядро. I2C и SPI.
Вместо типичного Buildroot, Orange Pi использует свою собственную простую систему сборки на shell-скриптах: в качестве тулчейна используется уже готовый linaro. Отчасти, это связано с самими чипами, на которых работают их устройства — MediaTek, например, не использует Mainline ядро и в процессе сборке имеет ещё кучу шагов для подготовки финального образа. Там даже menuconfig не работает и все изменения приходится делать в уже сгенерированной когда-то конфигурации.
Клонируем репозиторий с системой сборки и запускаем скрипт:
Выбираем нашу плату — 3G IoT и ждем, пока система сборки фактически скачает все необходимое для сборки — исходный код ядра, папки external (драйвера, загрузчик и порт linux MediaTek). Обратите внимание, OrangePi даже систему сборки завязали на конкретной версии системы: только Ubuntu 18.04, но на самом деле, ядро соберется без проблем практически где угодно. После того, как все было скачано, переходим в папку с скриптом сборки и запускаем скрипт сборки:
А нет, не запускаем — скрипт жалуется на то, что не может поставить некоторые пакеты. Не беда — ставим bsdtar и python minimal вручную и идем править код скрипта. Находится в он scripts/general.sh: убираем оттуда устаревшие имена пакетов.
После этого, компиляция ядра должна пройти успешно. Обратите внимание на версию вашей платы — те, что продают сейчас — именно A. Если пытаться подкинуть им ядро для B, то они будут уходить в kernel panic из-за отсутствия eMMC.
Если mkbootimg будет жаловаться на libstdc++6, то ставим его x86 версию из репозиториев.
Готовое ядро будет лежать вoutput/kernel/boot.img, которое можно прошить на устройство. С одним маленьким нюансом — оно рассчитано на загрузку из внутренней памяти, которой критически мало для дистрибутива Linux! У нас нет boot_sd.img, который есть в оригинальном дистрибутиве. Попытка разобрать образ стандартным AndImgTool не увенчалась успехом — рамдиск встроен прямо в образ zImage, а не отдельно, как это обычно бывает у Android-образов.
Покопавшись в скриптах сборки, я так и не понял логику создания boot_sd, ничего связанного с sd я не нашел даже grep'ом по всей папке. Ну что-ж, тогда попробуем обходным путем: скомпилируем нужные драйвера в виде загружаемых модулей (ko). Идём в наш конфиг, расположенный в linux/arch/arm/configs/3giot_defconfig и меняем CONFIG_I2C_CHARDEV и CONFIG_SPI_SPIDEV на m. Пояснение: y заставит систему сборки скомпоновать драйвер статически с ядром, а m выделит его в виде отдельного модуля ko, который затем можно загрузить черезinsmod.
Снова собираем ядро, на этот раз компиляция занимает не больше минуты. Нужные нам файлы появятся в linux/drivers/spi/spidev.ko и linux/drivers/i2c/i2c-d-ev.ko. Переносим их на хост-пк, а затем и на само устройство с помощью SSH:
Загружаем модули ядра:
insmod i2c-dev.ko
И та-дам! Целых две i2c шины появилось в системе (/dev/i2c-0, /dev/i2c-1). Устанавливаем i2c-tools и идем проверять с помощью i2cdetect: первая шина полностью свободна под наши проекты, а на второй по некоторым адресам висит периферия (FM-радио как вариант):
I2C теперь точно работает! Но как насчет SPI?
insmod spidev.ko Device or resource busy.
Увы! spidev нельзя подгружать динамически, только статически линковать с ядром, чего мы сделать пока не можем. Однако техническая возможность заставить работать SPI есть: например, написать свой драйвер, который транслирует команды из юзерспейса в SPI API, которое работает на уровне ядра.
GPIO
В прошлой статье, я вкратце рассказал, как работать с gpio из user-space на уровне терминала. Однако, большинство разработчиков потенциально будет пользоваться нативным API для GPIO — ну не всерьез же им парсить вывод состояния в консоль? Поэтому я решил написать крошечную библиотеку для работы с GPIO, такую же простую, как и DigitalWrite/DigitalRead!
Давайте сначала разберемся, как именно работать с драйвером GPIO. Для этого открываем исходники ядра и смотрим внимательно, что нам предлагает драйвер: в нашем случае, это вызовы IOCTL, да еще и простые и понятные. Это просто отлично! Я написал single-header библиотеку минут за 10: без проверки ошибок, но работоспособная.
Пример использования (141 — крайний пин на гребенке):
#define GPIO_IMPL
#include "gpio.h"
#include <stdio.h>
voidtestPin(int pin)
{
printf("Pin state %i is %i\n", pin, gpioGetState(pin));
gpioSetDir(pin, 1);
gpioWrite(pin, 0);
printf("Pin state %i is %i\n", pin, gpioGetState(pin));
gpioWrite(pin, 1);
printf("Pin state %i is %i\n", pin, gpioGetState(pin));
}
intmain(int argc, char** argv) {
gpioInit();
testPin(141);
}
Модем
Скажу сразу: пока что завести модем мне не удалось, но я активно работаю над этим. В этой части статьи я распишу свои находки и догадки касательно модемов на чипах MediaTek.
В устройствах MediaTek, драйвер для общения с GPS, A-GPS и модемом один — ccci, судя по всему cross chip communication interface. Именно ccci создает устройства, с в которые поступает вход с микрофона и выход на динамики, а также он создает управляющие интерфейсы для общения с различными модулями этого SoC.
При старте ядра, ccci создаёт много устройств — ccci_ioctl, ccci_ipc, ccci_fs и самое нужное нам —ttyC0/ttyC1/ttyC2— в зависимости от количества СИМ-карт в системе. Кроме ccci, в системе есть некий 6620_launcher — бинарник, который загружает прошивку Wi-Fi и gsm0710muxd — специальный сервис, который позволяет в GPRS-сетях одновременно разговаривать и сидеть в интернете.
На смартфонах MTK есть factory mode — так называемый тестовый режим, который гоняют на заводах. Вы, вероятно, когда-то видели китайские меню похожее на рекавери — это и есть factory mode. Из этого режима можно дозвонится в 911 и активировать модем без запуска Android и RIL. Как это работает? Идём читать исходники ядра!
В factory-режиме, для каждого теста, программа активирует модем заново. Для этого есть функции тестового режима для работы с AT-командами и для инициализации модема. Сначала, она открывает терминал /dev/ttyC0 — именно там происходит общение с модемом с помощью AT-команд:
После этого, программа выводит модем из режима сна с помощью команды «AT+ESLP=0», инициализирует СИМ-карту с помощью команды «AT+ESIMS» и задает режим работы с помощью «AT+EFUN=1» и «AT+CREG=1». После этого, модем начинает искать сеть и доступен для обычного общения с помощью AT-команд. Однако, написав тестовую софтину для общения с модемом из под Debian, я получал ошибки вида Device not found. Почему? Пока не знаю. Однако я продолжаю изучать данный вопрос!
Заключение
Подготовленные мною файлы вы можете скачать на диске. Там скомпилированные модули ядра, библиотека для работы с GPIO и пару тестовых программ в качестве примеров.
К счастью, довести гаджет до ума мы смогли своими силами. Весьма странно, что такой крупный и уважаемый производитель как Orange Pi, банально решил «забить» на поддержку собственного устройства. И я лично считаю, что не стоит закидывать в долгий ящик их тем читателям, которые купили когда-то себе подобный девайс и забили, смирившись с отсутствием гайдов.
Немного энтузиазма, опыта и видения будущего проекта — и все получится :)
— ПЕРЕЙТИ НА САЙТ 💁🏻♂️ Helurl — это облачное хранилище, которое позволяет вам легко и удобно хранить, делиться и управлять своими данными. Вы можете загружать и скачивать свои данные в любое время и в любом месте, если у вас есть подключение к Интернету. Вы также можете получить доступ к своим данным с различных устройств, таких как компьютеры, телефоны, планшеты и т.д. └ Я понимаю, что бесплатный сыр всегда только в мышеловке, но вы ничего не теряете, тем более облачное хранилище можно использовать не для важных задач, а для не нужных файлов, которые не страшно потерять, так как проект достаточно новый и пока сложно, что-то конкретно сказать, но сейчас сайт работает, а значит если вам не хватает места - пользуйтесь.
2. Временные почты: TempMail - подходят. └ Или используйте основную почту 3. Готово, вы получили 50ТБ. └ Пользуйтесь в своих целях
На сайте имеется удобная функция, которая позволяет вам создать "пространство" для файлов и вводить почты, чтобы предоставить доступ другим пользователям к пространству или определенным папкам.
Если вы недавно познакомились с пользователей @alllhimic, тогда можете посмотреть еще публикации про другие облачные хранилища: 10ТБ от LinkBox и 4ТБ от PlayBook.
Источник: FREEHVB — это больше, чем просто канал в Telegram, так как это уже полноценное комьюнити, которое помогает друг другу. На канале, мы следим за различной халявой и сами ее собственно раздаем, к примеру сейчас на канале актуальная раздача игры PREY для GOG или игр для VK Play, еще мы раздаем бесплатно доступ к Xbox Game Pass Ultimate и многое другое.
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
В наше время каждый год выходят десятки, если не сотни самых разных моделей новых смартфонов, но по настоящему диковинные и интересные из них лишь единицы. Apple немного подтянет железо и добавит фишечку, Xiaomi представит очередную занимательную технологию, которая ещё не пошла в серию, а небольшие бренды продолжают клепать совершенно одинаковые смартфоны. Однако, когда-то была одна Канадская компания, у которой почти каждое новое устройство было необычным и в чем-то диковинным. И сегодня я предлагаю посмотреть на венец творения этой компании — BlackBerry Passport, который обошёлся мне в 2.500 рублей и который я использую в качестве основного смартфона! На что способен флагманский смартфон на базе Snapdragon 801 и с 3гб ОЗУ из 2014 в наше время? Сегодня узнаем!
❯ Покупка
На этот раз предысторию смартфона я рассказывать не буду: кое-что из истории BB я рассказал в прошлой статье оBlackBerry Z30.
Недавно stupidmadworld выпустил видео о BlackBerry и в нём было довольно много неточностей (не осуждаю его, у меня тоже бывают опечатки), но особенно негативно он «проехался» по Passport. Сложилось впечатление, что девайс он купил в коллекцию или чисто для вида, не попытавшись его использовать в реальных условиях. Поэтому в этой статье предлагаю сосредоточиться на самом устройстве и его перспективах в наше время, ведь подобный форм-фактор легко может привлечь моего читателя!
Моим первым смартфоном от BB стал Curve 9360, который я купил всего за 300 рублей на известной онлайн-барахолке. Несмотря на удручающее состояние устройства, моя симпатия к BB продолжала только расти, а подогрел интерес читатель с Хабра, который заслал списанные из офиса PlayBook и инженерный прототип Z10 DevAlpha A (его уже не активировать). После этого я купил себе Z10, заодно прихватив Z30 за 500 рублей (копейки же!) и всё завертелось… Что стало с Z30, вы можете узнать из вот этойстатьи.
BlackBerry Torch 9800
Через некоторое время мне написал читатель с Хабра и предложил заслать несколько списанных из офиса девайсов, коими были BB Playbook и инженерный прототип BlackBerry DevAlpha A (который на TI OMAP). После того, как девайсы были получены, а я безуспешно попытался активировать DevAlpha A (она была не активированной) и поискать баги в самых разных версиях прошивки, я решил купить себе Z10 за 1.000 рублей и Z30 за 500 рублей. Как мы с вами знаем, Z30 позже стал моим основным смартфоном аж на месяц вперёд, опыт его использования я написал в этойстатье.
Ежевичная семья: Z30, Passport, 9360
После этого, мне написал мой подписчикGamersReview, заядлый фанат BlackBerry и скинул ссылку на объявление с разбитым Passport'ом, сказав, что он уже договорился и человек отдаст его за 1.500 рублей. Конечно же брать девайс-ударник — отчасти рулетка, но поскольку гаджет действительно интересный и стоит того, я решил рискнуть. Через неделю гаджет пришёл и отправился на полку ждать дисплей, заказанный с AliExpress за 1.000 рублей (прямую ссылку оставлять не буду, дабы не сочли за рекламу, но если нужно будет — пишите в ЛС).
❯ Ремонт
Как только дисплей приехал, сразу же сел перебирать смартфон. Я перебрал с сотню мобилок, но BB разбирал первый раз и меня сразу же удивило… насколько он продуман! Никакого клея, никаких герметиков, никаких танцев с феном вокруг устройства, всё сделано крайне продумано на винтиках и клипсах. Весь гаджет можно перебрать за 10 минут одной лишь отверткой, благодаря модульности. Начинается всё со снятия крышечки с слотами под SIM и MicroSD и заглушки в нижней части клавиатуры. Прошлые модели, кстати, имеют похожую концепцию с заглушками:
После откручивания винтиков, заднюю крышку остается лишь аккуратно снять, используя пластиковую карту или инструмент для разбора корпусов. Всё, вся плата как на ладони!
АКБ сразу же отключаем (шлейф, закрепленный винтиком), и выкручиваем остальные винтики с платы. Сам аккумулятор приклеен, его можно снять, потянув за язычок, либо аккуратно подсунув пластиковую карту под его дно.
Дисплей, судя по надписи «Easy Pick» и отклеенной фольге, уже когда-то меняли, да и это было заметно на этапе снятия крышки. :) Откручиваем винтики, которые крепят металлическую рамку с дисплейным модулем и клавиатурой, и разделяем клавиатуру с дисплеем (их держат два винтика).
Дальше всё в обратном порядке: прикручиваем клавиатуру к новому дисплейному модулю (не забываем переместить разъем 3.5мм и датчики, если на вашем модуле их нет), одеваем рамку, устанавливаем плату, АКБ, заднюю крышку, заглушки и устройство собрано! Всё это занимает минут 10. Инженеры BlackBerry, мой поклон вам за такую конструкцию без клея. Кстати, даже в Priv они сохранили подобную конструкцию и там тоже устройство можно разобрать без фена.
Включаем смартфон, дисплей работает, тачскрин работает! Здорово! Но, девайс был на пароле, а контакт продавца был утерян. Что ж делать, спросите вы? 10 раз неправильно ввести пароль (или просто прошить устройство последней прошивкой автолоадером)!
Безопасность — одна из главных фишек BlackBerry. Если ввести неверный пароль 10 раз, то устройство перезагрузится,глубокимформатированием очистит весь пользовательский раздел (даже несмотря на шифрование, весь процесс занимает около 10 минут) и сбросится до заводских настроек.
После этого, устройство окажется на этапе активации (извиняюсь за качество фото).
Доходим до этапа активации Wi-Fi, откладываем активацию и сразу же в хабе запускаем процесс снова. Доходим до подключения Wi-Fi, быстро жмём 3 раза кнопку включения — должен активироваться диктор. Двумя пальцами тапаем два раза по дисплею и начинаем водить пальцем справа налево, пока не услышим «Skip activation». Как только услышали — делаем два тапа двумя пальцами и мы должны увидеть экран обновления. Он чутка повисит на поиске обновления и затем устройство будет полностью активировано — без напоминаний. Насколько я знаю, так можно активировать устройства и с BB Protect. Теперь наконец-то смартфон активирован и работает без каких либо проблем!
Такое провернуть можно с любым устройством на BlackBerry OS10, кроме первого прототипа Z10 (DevAlpha A).
Если голосовой диктор не появляется, то обновите устройство хотя бы до 10.2. Сделать это можно автолоадером (ищем "<модель> 10.3 autoloader", ставим BB Link, запускаем автолоадер и подключаем выключенный смартфон. Он сам обновит прошивку. В случае Z10 убедитесь, что качаете автолоадер для своей ревизии — там было 4 ревизии, одна из которых на другом чипсете).
Я использую Passport в качестве основного смартфона на протяжении двух недель и успел составить своё впечатление от этого, безусловно, крайне необычного устройства. Здесь нужно привыкать ко всему: QWERTY-клавиатура с смещенной русской раскладкой, дисплей с «квадратным» соотношением сторон, широкой форме самого устройства. Можно ли им пользоваться «на каждый день»? Давайте узнаем!
❯ Тактильные ощущения
Как вы уже могли заметить, смартфон очень широкий — обхватить его в одной руке бывает проблематичным. Однако разработчики рассчитывали, чтобы покупатель пользовался устройством именно двумя руками, как и любым другим QWERTY-смартфоном. И если первые дни пользования ты достаёшь Passport со страхом того, что ты его не удержишь и он упадёт на асфальт, то уже через неделю начинаешь чувствовать его габариты и рельеф и привыкаешь.
Тоже самое касается и весьма необычной клавиатуры, ведь возможности вызвать экранную «для подстраховки» нет — пользуйся только хардварной. И если англоязычная раскладка здесь стандартная, то русскоязычная немного отличается от общепринятой. Например, «ю» вынесли в верхнюю правую часть клавиатуры, а некоторые символы предлагается вводить двойным нажатием. По началу ты набираешь слова по несколько секунд, а спустя недельку-две начинаешь летать по мобильной клавиатуре почти так же, как и по обычной десктопной и понимаешь, в чём же эта магия QWERTY клавиатур и почему её не могут заменить всякие Taptic Engine. Кроме того, инженеры BB знали, что на привыкание понадобится некоторое время и добавил авто-исправление слов и словари. Поэтому даже новичок сможет писать достаточно грамотно и быстро.
Но поскольку клавиатура здесь не на 104 клавиши и даже стандартных для QWERTY-смартфонов Ctrl/Shift/Alt тут нет, то переключение языков, часть символов и управление регистром решили вывести как маленький кусочек тачпад-клавиатуры. Кто-то может поспорить с таким подходом и сказать: «да это же не тру-кверти!», но в целом, когда привыкаешь, то понимаешь что это удобнее, нежели тыкать десять сочетаний на компактной клавиатуре. Перед инженерами BB стояла задача не разместить полноценную клавиатуру на 104-клавиши, а сделать компактную, но при этом удобную клавиатуру, где поместились только символы и некоторые управляющие кнопки (backspace, enter, пробел). И у них получилось!
Кроме того, инженеры BlackBerry не хотели оставлять пространство клавиатуры бесполезным во время «повседневных» задач типа скроллинга ленты или просмотра веб-страниц и сделали клавиатуру… сенсорной! Причём эта фишка сохранилась и в Priv, и в устройствах от TCL (BB KeyOne/KeyTwo). Таким образом, если вы держите смартфон в одной руке, вы можете листать ленту/страницу просто проводя пальцем по самой клавиатуре. Да и сама клавиатура поддерживает некоторые жесты: например свайп справа налево удалит текущее напечатанное слово. Клавиатура поддерживает мультитач: страницы можно зумить, водя пальцами по клавиатуре. Крутотень!
Что же касается тактильных ощущений от остальной части смартфона, то на задней крышке нас ждет металлическая полоска и мягкий софт-тач пластик, которыйне испортилсяза 9 лет с момента выхода устройства. Сама рамка смартфона выполнена полностью из металла (причём хорошего, а не фольги, от падения он не прогибается и не облупливается), а стекло смартфона слегка закруглено по краям, что дает приятный эффект а-ля S6 Edge. Причём даже после неоднократной разборки и падений зазоры остались минимальными и без всякого клея: никаких люфтов или скрипа я не заметил. Смартфон спроектирован и собран очень добротно: немудрено для смартфона за 700$!
Но если смартфон тактильно очень классный, то как у него дела с железной начинкой? Тут тоже был «полный фарш». За 700$, BB предлагали топовый 4-ядерный чипсет Snapdragon 801, работающий на частоте до 2.5ггц, с полной поддержкой LTE, аж 3гб ОЗУ (в тот год столько получал разве что Galaxy Note) и 32гб памяти c поддержкой microsd, что дает очень большой плюсик производителю. Чипсет, скажем так, довольно горячий, но система эффективно расходует ресурсы даже на более слабых устройствах, поэтому ситуаций «снапдрагон грееца, можно зимой вместо батарей использовать» здесь немного. Я заметил только две: тяжелые игры и съемка FHD видео в 60 FPS. В остальные моменты, устройство либо холодное, либо едва теплое.
Все эти приложения остаются в фоне и не выгружаются. Можно спокойно занять минимум 2 страницы (по 6 приложений в каждой) и ничего лагать не будет. Снято на камеру 30FPS, учтите это.
Работает смартфон на базе собственной ОС BlackBerry — BB OS 10, которая за всё время существования получала целых 3 мажорных апдейта для всех устройств, даже самых первых! Самая лучшая из них — 10.3, поскольку в ней есть поддержка приложений для Android 4.3 JellyBean. Вероятно, кто-то возразит и скажет «да как на нём жить» и ответ будет прост — легко :)
❯ Использование или выживание?
Давайте разбираться. Что нужно большинству людей для комфортного повседневного использования смартфона? ВК, Telegram, WhatsApp/Viber, браузер, YouTube, музыка и камера — верно? Сможет ли со всем этим справится 9 летний флагманский смартфон?
Начинаем конечно же с соц. сетей и мессенджеров. И в BBOS 10 с этим нет никаких проблем — несмотря на отсутствие многих мессенджеров для BB10 нативно, инженеры BlackBerry реализовали слой совместимости (это не эмулятор, а именно «порт» окружения Android и отчасти Linux под BB) Android Runtime, который позволяет запускать многие приложения для зеленого робота, с максимальной поддерживаемой версией 4.3. Тут важен один момент: поддержка 4.3 появилась только в последней версии ОС — 10.3, до этого поддерживался лишь Android 2.2. Если у вас не устанавливаются приложения — то качаем автолоадер, прошиваем устройство (это безопасно) и всё будет работать. APK ставятся напрямую из проводника или браузера, с этим никаких проблем нет.
И Telegram, и ВК просто летают! Производительность не сравнить с современными смартфонами до 6-7-8 тысяч рублей. При этом с физической клавиатуры действительно гораздо удобнее печатать в мессенджерах, это совершенно иные ощущения. Да, нужно будет привыкнуть, но потом ты понимаешь, что так даже удобнее:
Браузер тут, конечно, устарел (можно поставить хром или лису прошлых версий, они будут работать относительно нормально, но у меня были болячки с скроллингом хрома), но кое-что загрузить всё ещё может. Например, можно полистать Хабр. А вот Пикабу браузер уже не загрузит, разработчики Пикабу идут вслед за современными веб-стандартами! Проблемы будут и с чтением DTF.
Вот так выглядит Пикабу:
В браузере полноценно работает YouTube. К сожалению, NewPipe Legacy уже не работает, поэтому нативный клиент можно получить разве что с моей реализацией. Но посмотреть видео можно, хотя YouTube явно не адаптирован для квадратных экранов:
С мессенджерами и браузером разобрались: их вполне можно использовать. С браузерами конечно посложнее, но в целом нормально. А что насчёт камеры? И тут хочется сказать, что BB делали упор не только в хардварную клавиатуру и удобство системы, но и камеру, микрофон (4 микрофона по всей площади смартфона — это не шутки!) и звук.
С музыкой, как уже сказано выше, всё тоже очень достойно. Честный и качественный стереозвук, по качеству и громкости сравнимый с внешней колонкой. BB постарались и здесь, судя по сообщениям на форуме, в устройстве стоит DAC от Wolfson (схожий применялся в iPhone) и есть поддержка внешнего USB Audio через OTG. Из коробки есть поддержка FLAC, а сам плеер очень удобный и поддерживает кучу разных фишек (эквалайзер, DLNA, возможность при подключенных наушниках выводить звук на динамики/слуховой динамик).
❯ Заключение
Смартфон получился весьма успешным по меркам BlackBerry: в 2014, благодаря высоким продажам он спас компанию, позволив ей продержаться до 2016 года. BlackBerry выпустила несколько различных версий Passport: премиальный Silver Edition с чуть отличающейся конструкцией и дизайном и версию для AT&T (скругленная). Уже через год появился продолжатель идеи: Priv, а затем и устройства от TCL — KeyOne и KeyTwo. Но некоторые пользователь считают их «не трушными» BB из-за того, что они работают на Android. Получается, Passport — лучший QWERTY смартфон в своем классе?
Идея Passport и Q5/Q10 все еще живы. Несмотря на то, что TCL потеряли права на BlackBerry, компания Unihertz из Китая, известная своими мини-смартфонами Jelly, смогли выпустить на рынок Titan и Titan Slim. И как жаль, что только юнигерц продолжает реализовывать такую концепцию…
А вам как Passport? Сейчас их средняя цена на барахолках в рабочем состоянии (я собирал конструктор) 4-5 тысяч рублей. Взяли бы такое устройство сейчас на каждый день? Есть ли будущее у смартфонов такого форм-фактора? Жду ваше мнение в комментариях!
Статья подготовлена при поддержке Timeweb.Cloud. Подписывайтесь на меня и TimeWeb, чтобы не пропускать новые статьи каждую неделю!