Дисплей с Aliexpress. Замена стекла на Xiaomi 13 Ultra)
Сегодня мы разберем флагман 13 серии от этих ваших сяоми. А так же разберемся почему нельзя покупать дисплеи на алиэкспресс)
Но сначала как всегда контекст)
Мои подписчики уже знают, что я переклеивал Xiaomi 13 Lite и обычную версию 13 сяоми. Но все это время не было ни одного поста о замене стекла на Xiaomi 13 Ultra.
А все по причине того, что Xiaomi 13 ULTRA продавали на старте по 140к. 140 косарей КАРЛ! Когда 12 Ultra на старте стоил 70к! Даже жадины из Samsung продавали свой S23 ultra за 110к)
При этом дисплей на эту дуру до сих пор стоит 20-34к. А сколько стоит замена стекла узнаете в конце поста)
Естественно ждать истинного фаната Лэй Цзюня, который не просто купит это чудо, а ещё и разобьет пришлось ждать достаточно долго. Но я знал, что этот день настанет)
И вот перед вами разбитый Xiaomi 13 Ultra с хваленым сверхпрочным Gorilla Glass Victus)
Но есть один нюанс. Это не весь телефон)
Потому что вся внтурянка в другой раме и с другим дисплеем.
Причем батаеря разряжена в ноль и оба дисплея невозможно проверить. Но один из дисплеев как утверждают родной и рабочий, но битый. Его нам и надо переклеить.
Но сначала меня посетил вопрос. Нахера он такой толстый?)
Для сравнения - слева google pixel 7 pro, а справа Xiaomi 13 Ultra)
Какая же это здоровая дура. Просто металлический кирпич. Как он троттлит с таким жестким охладом я не понимаю. Там одна рама - килограмм аллюминия)
Кто там хотел легкоснимающиеся крышки? Тут она отвалилась сразу, тк в телефон уже лазили)
Уже чувствуется дико интересная история. И так оно и есть)
Владелец разбил стекло. Решил сразу заказать весь дисплей в раме с алиэкспресс, но после его установки перестал работать отпечаток и дисплей оказался с нерабочей частью тачскрина. И если первое - это шиза самой сяоми, которая запрещает менять дисплеи, иначе слетает калибровка отпечатка, которая привязана к дисплею. То второе - это явный брак дисплея. Алиэкспресс послал с возвратом товара далеко и надолго. Поэтому после хранения несколько месяцев в тумбе и потеряв надежду вернуть телефон к жизни за разумные деньги телефон все таки попал ко мне в руки.
Вообще уже не в первый раз сталкиваюсь с тем, что Али везет в РФ только шлак, а потом отказывает в возврате. Спасибо Мэйл ру груп, которому принадлежит Али с 2019 года. Так сказать Царь Мидас наоборот. Все до чего дотронется - превращается в ВК)
Мне так выгоревшие диспы приходили на Mi 11 ultra под видом новых. Лютые копии дисплеев на Pixel 6 Pro так же под видом оригов. 2 полностью выгоревших и в усмерть зацарапнных дисплея на Meizu 18s Pro. Колхозный китайский переклей Vivo X90 Pro Plus вклеенный в раму на B7000. Копии крышек и акб под видом оригов и куча нерабочих камер.
Потому что знают, что вы хрен вернете это все обратно любителям риса и можно отправить вам все что угодно. Причем я всегда заказываю только самые дорогие позиции и неизменно алик меня жестко наебывает по качеству и отказывается в возврате всего этого говна добра обратно.
Так что заказывать с алика теперь никому не советую. Берите у поставщиков в РФ. Если у них нет, то ищите официалов в своем городе иначе вы просто получите лютую дичь ещё и за оверпрайс. Такие дела)
Но это все отступление, а мы тут собрались на работу посмотреть)
Для начала разбиваем 4 угла алмазным диском.
Вытягиваем весь герметик, который как обычно налит на любом уважающем себя китайце. В отличии от диких щелей забитыми пылью и волосами на любом гнутом самсунге)
Вытаскиваем все осколки и срезаем разбитое стекло.
Чистим матрицу от клея и выклеиваем дисплей из рамы.
Я уже отвык видеть такую чистую матрицу. Каждый день вижу полугнилые самсунги и пиксели после любителей поплавать. А тут чистая медь, хоть на металлолом сдавай)
А теперь момент истины. Пока я резал дисплей телефон уже успел зарядиться, а значит мы можем проверить изображение иииииии..........
Все отлично показывает)
Вообще на сяоми матрицы неубиваемые. Я не знаю как их можно ушатать. При этом делает их тот же самсунг, который для своих трубок делает дисплеи, которые от приземления сразу отлетают в вальгалу)
Теперь чистим матрицу до зеркального блеска под зеленой лампой в антипылевой комнате.
И склеиваем матрицу с новым стеклом в вакуумном прессе.
И достаем идеальный дисплей с новым стеклом без единой пылинки)
Осталось только проклеить низ рамки дорогущим термоклеем и вклеить дисплей в раму)
Не забудем закинуть дисплей в морозилку на 10 минут для того, чтобы термоклей быстрее остыл)
Перекидываем все со старой рамы на новую и проверяем готовую вундервафлю)
Даже отпечаток теперь работает. Шах и мат Xiaomi)
Ну и олеофоб проверим, куда же без него)
Переклеить эту дуру стоит 9900р, вместо 20-40к за замену модуля. Такие дела)
Всем удачных ремонтов.
Телефон мне прислать можно СДЭКом (доставка бесплатная в обе стороны на замену стекла от 5к)
г. Санкт-Петербург
Я в Телеграме
Я в Ютубе
Интересные посты (Осторожно! Много букв):
А так же приглашаю всех желающих в комменты для совместного веселья)
Ну а тем, кто напишет, что пост реклама - пришлю мемы с Львами. Всем Добра)
Самое редкое пятно. Замена стекла дисплея на Iphone 15 Pro max)
Сегодня я расскажу о редкой болячке матрицы, которую можно получить, если очень удачно приложить телефон углом об трердую поверхность)
Но для начала как всегда контекст.
Для того чтобы разбить экран телефона много ума не надо. Зато нужна гора везения, потому что вариантов повреждений в случае резкого торможения на большой скорости может быть достаточно много.
А учитывая что менять дисплей на тот же айфон 15 про макс стоит минимум 50к, а заменить стекло 15900р, то всегда интересно насколько же влетел владелец после неудачного падения)
Так как у героя нашего поста Amoled экран с интересным пятном, то поговорим для начала какие пятна бывают при повреждении стекла на этом типе матриц:
Черные - Это разгерметизация матрицы. Убрать такой дефект невозможно. Если пятно в виде круга или полукруга, то можно переклеить разбитое стекло. В остальных случаях если пятно рваное и с полосой, то дисп труп.
Синие - матрица 100% труп без вариантов. Тоже разгерметизация, но более жесткая. Тк дыра настолько большая, что воздух начинает очень быстро окислять диоды и дисп тухнет за несколько дней.
Розовые - это так назваемые "Выгорания". Выходят из строя синие пиксели. Это тоже не лечится. Но стекло можно переклеить.
Желтые, красные - перегретый поляризационный слой (обычно после пожара или полировки) Так же не убираются, но стекло можно переклеить.
А сегодня я покажу уникальное пятно. Хотя возможно, для айфонов 15 серии и выше этот дефект станет обыденностью)
Знакомтесь Iphone 15 pro max, который весело хрустнул, приземлившись на левый угол)
Предлагаю всем внимательным поиграть в игру. Какого цвета пятно?
Белый? Может быть синий? Или красный?
Поэтому назовем это пятно прозрачным)
Так искажает изображение отвалившийся поляризационный слой.
Он отвечает за темный оттенок матрицы, тк без него матрица будет просто желтого цвета. И при его отвале он начинает локально искажать цвета переливаясь всеми цветами радуги одновременно)
Этот дефект появился ещё на 14 серии, но встречался он редко и в некоторых случях можно было заменить поляр. Даже стекла специальные продавались с поляризационным слоем.
Лично видел случаи когда успешно меняли поляризационную пленку на 14 серии и дисплей работал дальше без проблем и пятен. Хотя на других моделях это бы гарантированно привело к разрыву матрицы и её замене.
Но на 15 серии так уже сделать не получится и ниже объясню почему)
Но для начала вскроем аппарат
Разобьем осколки алмазным диском, добавим в трещины оптический клей и зафиксруем все это безобразие обычным славянским скотчем под ультрафиолетовой лампой)
Далее срежем разбитое стекло на сепараторе)
Очистим матрицу от клея и проверим как поживает наше пятно)
А пятно на месте и все так же искажает изображение. Но уже чуть меньше)
И вот теперь пора вернуться к вопросу, почему этот поляр не заменить на 15 серии.
А потому, чтобы его снять и наклеить - нужно снять рамку дисплея. А на 15 серии она теперь несъемная и вообще это теперь не рамка а огромный шмат компаунда, который налили прямо на матрицу. И если сверху этот компаунд можно снять. То снизу он оторвет шлейф матрицы и на экране появятся полосы или очень интересное ничего. А при ударе в этот компаунд весело расслаивается поляризационный слой)
И из за этого все чаще появляются 15 айфоны с расслоением поляра от удара. 14 серия с таким сталкивалась в разы меньше из за того, что рамку не приклеивали так жестко, а между рамкой и матрицей было пространство для люфта от удара.
Примерно так же сделали на apple watch 7-9 серии, где рамку не оторвать и она теперь является частью матрицы)
Так что снятие такой рамки в 95% случаев приведет к смерти дисплея . Поэтому придется клеить стекло прямо так, иначе мы рискуем влететь на замену модуля за 50к. А оно нам не надо)
Берем матрицу с пятном и склеиваем её на новое ориг стекло в вакуумном прессе)
А пока удаляются пузыри наклеим новую влагозащитную проклейку.
Затем проклеиваем рамку на дорогущий термоклей, собираем аппарат.
И оцениваем готовый результат
Ну и олеофоб проверим, куда же без него)
Как думаете стоит ради такого пятна менять дисплей?)
По стоимости вышло 15900р, вместо 50к за замену модуля. Такие дела)
Всем удачных ремонтов.
Телефон мне прислать можно СДЭКом
г. Санкт-Петербург
Я в Телеграме
Я в Ютубе
Интересные посты (Осторожно! Много букв):
А так же приглашаю всех желающих в комменты для совместного веселья)
Ну а тем, кто напишет, что пост реклама - пришлю мемы с Врачами. Всем Добра)
Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля, ч.1
Пожалуй, многие из вас помнят, какими были мобильные игры до и после выхода первого iPhone. В начале 2000-х годов, ещё до появления яблочного смартфона, игры для телефонов в основном были весьма интересными, но тем не менее, достаточно простенькими с точки зрения графики и реализации в целом. После запуска AppStore в 2008 году, на iPhone начали выходить самые разные красочные, невиданные раннее по уровню детализации и проработке 2D и 3D игры. Но появление таких игр — отнюдь не заслуга Apple, а относительной малоизвестной компании PowerVR (подразделение Imagination Tech), которая смогла разработать на базе видеочипа Dreamcast и внедрить один из первых действительно массовых мобильных 3D-ускорителей, имя которому — PowerVR MBX! Сейчас мы с вами привыкли, что почти любой дешевый смартфон может отрисовывать графику уровня PS3 в 1080p, а то и выше, но когда-то даже уровень PS2 был роскошью… Сегодня мы с вами: узнаем предысторию появления аппаратно-ускоренной 3D-графики на телефонах, рассмотрим такую фирменную фишку PowerVR, как тайловый рендеринг, а в практической части статьи нам поможет легендарный КПК Dell Axim X51v с MBX на борту, под который мы напишем 3D-игру «про жигули» с нуля! Интересно? Тогда добро пожаловать под кат!
❯ Мобильная 3D-графика. Начало
Пожалуй, 3D-графика на мобильных устройствах начала развиваться ещё с самого начала 2000-х годов. К тому моменту, как мобильные телефоны научились запускать сторонние Java-приложения, практически сразу же появился прибыльный рынок мобильных игр. Ещё до появления поддержки jar-приложений, люди ставили рекорды в «Змейке» на телефонах Nokia, таскали ящики в «Строителе» на Siemens и играли в другие предустановленные игры на девайсах других брендов, поэтому было очевидно, что игры на мобильных телефонах рано или поздно смогут занять немалую часть сегмента портативных игровых устройств.
Именно появление J2ME дало тот самый толчок для развития мобильного гейминга. Производители телефонов активно развивали и дорабатывали мобильную платформу, добавляя в неё различные API-расширения — например, активацию приложений через СМС и доступ в WAP-интернет. Сама платформа J2ME была достаточно простой для изучения и имела низкий порог вхождения не только для людей, имевших какой-то опыт программирования, но даже для совсем новичков, которые никогда не писали код и тем более игр! Благодаря этому, появились сотни игр, многие из которых до сих пор помнят и любят: это и легендарный «мячик» Bounce, и «зайчик с морковками» Bobby Carrot, и весьма крутой Gish, а также множество различных платформеров по известным фильмам и «большим» играм!
В 2003 году появился Nokia N-Gage — первый массовый телефон, ориентированный именно на мобильный гейминг, который поддерживал не только Java-игры, но и собственные Symbian-игры с достаточно крутой 3D-графикой! Примерно в том же 2003 году, для платформы Java вышло сразу два API-расширения, которые добавляли поддержку симпатичной 3D-графики даже в самые простенькие и бюджетные телефоны: Mobile 3D Graphics (M3G, была почти везде) и Mascot Capsule (эта платформа была только на Sony Ericsson и Motorola). Именно благодаря этим API, мы с вами увидели такие легендарные игры, как V-Rally, Galaxy on Fire, Deep3D и многие другие! Но тем не менее, эти API были относительно медленными из-за программной растеризации на процессоре без отдельного 3D-ускорителя и весьма ограниченными в функционале. Ближайший пример по функционалу — уровень софтрендера первой кваки на первом Pentium! Кстати, про 3D на мобильных телефонах я писал отдельную статью, там в практической части мы пишем 3D-бродилку для Sony Ericsson!
Но помимо кнопочных телефонов, существовал сегмент High-end мультимедийных устройств, которые предоставляли гораздо больший функционал и производительность за немалые деньги. И речь, конечно же, о КПК! Девайсы, работавшие на базе шустрых процессоров Intel PXA и Samsung S3C с Windows Mobile на борту были заметно более перспективными для игр… но как-то не задалось из-за отсутствия нормальных каналов для распространения. Но тем не менее, Intel (иронично, но один из самых больших производителей ARM-чипсетов для КПК в те годы), которая уже занималась развитием десктопной графики GMA и PowerVR активно работали в этой сфере и результатом стало появление видеоускорителя 2700G, который представлял из себя не только 3D GPU PowerVR MBX Lite, но и аппаратный декодер видео, позволявший смотреть видео в высоком качестве! MBX Lite позволял запустить даже Quake 3 в 640x480 (!), пусть и в 10-15 FPS… Ещё за 5 лет до этого, далеко не все десктопные видеокарты могли выдать больше 30 FPS в 800x600!
Конечно в 2004 году уже вышел PSP, выставивший новую планку уровня 3D-графики для портативного гейминга, однако для смартфонов и КПК, уровень графики, разрешение и производительность 3D-игр на MBX Lite был просто немыслимым! Одним из самых легендарных и популярных устройств с 2700G, которое вы можете приобрести достаточно дешево и сейчас, был КПК Dell Axim X51v, флагманская модель с VGA-дисплеем тех лет. Но нельзя сказать, что только PowerVR работала в этом направлении. Параллельно NVidia выпустили GoForce, крайне редко попадающийся в «полноценном» виде (NVidia предлагала дешевле лицензировать только видео-декодер с отключением 3D-части, как это было в Toshiba Portege G900) и ATI Imageon, который чаще всего можно встретить в виде Adreno на ранних Android-чипсетах Qualcomm (Adreno — анаграмма Radeon :)).
Тем не менее, решение PowerVR было действительно массовым: компания не предлагала отдельный чип (что обычно было дороже), как конкуренты, а лицензировала другим компаниям уже готовые IP-ядра, которые производители чипов могли синтезировать и использовать в своих собственных чипсетах, или, сопроцессорах, как в случае с 2700G. Благодаря этому, MBX появился в чипсете TI OMAP 2430, использовавшийся в легендарных Nokia N93i и Nokia N95, Samsung INNOV8, Asus Lamborghini, Nokia E90 и некоторых других. Кроме того, PowerVR MBX использовался в процессоре Samsung S5L8900, судя по всему, разработанный для iPhone 2G и 3G! Благодаря этому, его можно считать одним из первых массовых 3D GPU в телефонах!
Одна из игр для iPhone 2G и N95 — Assasins Creed
И Asphalt 5!
Весьма симпатично, согласитесь?
❯ Под капотом
Но MBX, конечно же, не появился «из ниоткуда» и был основан на более ранних разработках компании Imagination Tech, а именно GPU из полноценной домашней консоли SEGA Dreamcast — PowerVR CLX2, который в свою очередь был основан на ранних десктопных GPU PowerVR из середины-конца 90-х годов. Основная фишка PowerVR была в использовании так называемой техники отложного тайлового рендеринга (TBDR), которая, в отличии от классической растеризации и сортировки с помощью Z-буфера (или ручной сортировки треугольников) всех примитивов «в лоб» (методика, используемая в PSP, PS2 и большинстве видеокарт 2000-х годов), сначала ждёт от программы списка всех рисуемых треугольников в кадре, разбивает весь экран на тайлы (небольшие прямоугольные области), которые содержат в себе информацию о пересекающихся треугольниках, а затем процессом, несколько схожим с рейтрейсингом, определяет, какой из пикселей треугольника ближе всего находится к камере наблюдателя. Таким образом, мы избавляемся от необходимости сортировки геометрии с помощью Z-буфера (который сам по себе занимает достаточно много, по меркам тех лет, памяти и страдает от проблем точности и Z-fighting'а), а также такой метод позволяет реализовать более дешевый альфа-блендинг без ручной сортировки полупрозрачных примитивов и имеет ещё одну приятную фишку — «бесплатный» Occlusion Query, который можно использовать для реализации продвинутых техник отсечения невидимой глазу геометрии.
Производительность PowerVR MBX была весьма достойной для своих лет: при частоте работы в 200МГц, видеочип обеспечивал филлрейт в 100Мп, обрабатывал до 1млн треугольников в секунду. Нативным графическим API MBX был OpenGL ES 1.1 — специальная урезанная версия OpenGL для встраиваемых устройств, из которой выбросили все ненужное и которая заточена не только под floating-point, но и под fixed-point арифметику. В остальном, особо никаких отличий для программиста по сравнению с обычными GPU не было, можно было без проблем портировать уже существующие приложения для десктопого OpenGL для мобильные девайсы, чем и пользовались энтузиасты при портировании Quake 3 на Nokia E90, КПК и другие девайсы. Также, PowerVR MBX поддерживал D3DM — графический API Windows Mobile, о котором мы поговорим позднее.
Однако PowerVR MBX был GPU с фиксированным конвейером (FFP), а не программируемым, как принято в современных 3D-ускорителях. Что-же такое программируемый и фиксированный конвейер? Давайте разберемся:
Фиксированный конвейер: для того, чтобы задать визуальную составляющую рисуемой геометрии, программист оперирует набором заранее определенных при проектировании видеочипа параметров, которые позволяют управлять внешним видом растеризуемых примитивов. Например, для реализации света, программист задает параметры каждого из 8 источников света влияющих на рисуемый объект. Если программисту необходимо наложить несколько текстур за один проход (например, для реализации плавных переходов текстур на ландшафте или нанесения карты отражений на модель), он оперировал комбайнерами, которые позволяли задавать для каждого сэмплера параметры наложения. Такой подход использовался на десктопных GPU эпохи до GeForce 3 (т. е. примерно до 2000 года), до PS3 на Sony PlayStation (Xbox сразу вышел с GeForce 3) и до PSP включительно на портативках. Очевидно, что такой подход сильно ограничивает программиста в том, как будет выглядеть его игра на той или иной видеокарте.
Программируемый конвейер: в программируемом подходе, для управления визуальной составляющей программист пишет небольшие программы для видеокарты, называемые шейдерами. Всего есть два базовых (в современных GPU их больше) этапа программируемого конвейера: первый из них — вершинный шейдер, отвечающий за трансформацию геометрии (перевод из мировой системы координат в экранную) и, например, анимацию. Трансформированные вершины отправляются в следующий этап конвейера — растеризацию, где выполняется уже пиксельный шейдер, который определяет цвет пикселя (или более корректно — фрагмента в терминологии 3D графики) — т.е например, окрас объекта в определенной цвет, текстуру (или несколько текстур), рассчитывает попиксельное освещение, накладывает тени и т. д. Кроме того, такой подход позволяет реализовать сложные техники типа Ambient Occlusion, SSR, а также пост-эффекты (например блюр/блум, правда эти два можно «сэмулировать» и на FFP при определенной сноровке).
К 2007 году, Khronos выпустили спецификацию второй версии OpenGL ES, которая добавляла в мобильные устройства поддержку программируемого конвейера и шейдеров. Таким образом, мобильные GPU всё ближе приближались к уровню консолей и могли выдавать вполне годную графику, близкую к консолям. Даже была когда-то такая консоль, как Zeebo, которая работала на базе смартфонного чипсета Qualcomm с графикой ATI Imageon (!). PowerVR уже в 2009 выпустила серию SGX, которая также использовалась в iPhone, iPad, многих Android-смартфонах и планшетах, а также PS Vita!
Modern Combat 3 на iPad
Но статья с пересказом фишек PowerVR MBX была бы не особо интересной без практической части с написанием 3D-игры под этот GPU с нуля! Поэтому предлагаю посмотреть на нашего сегодняшнего гостя, легендарный флагманский КПК Dell Axim X51v из далекого 2005 года! Для тех лет, это настоящий «жир»:
Его мне подарил мой читатель Сергей с Хабра, за что ему огромное спасибо! Девайс был в полной комплектации, даже с флэшкой и усиленной АКБ, которая до сих пор неплохо держит заряд, однако у него не работал тачскрин. Если вам интересен только процесс программирования игры, а не аппаратного ремонта, то листайте ниже сразу до следующего абзаца :)
❯ Практическая часть: ремонтируем КПК
По факту, девайс полностью работал, однако в некоторые моменты времени не откликался на кнопки и тачскрин, и по всем симптомам это напоминало дребезг кнопок. При этом тачскрин сам по себе реагировал нормально во всех местах, что, фактически, исключало вероятность его поломки (хотя резистивные тач-панели сами по себе не особо надежные, в отличии от емкостных тачскринов). Дело было вот в чём: во многих КПК тех лет был отдельный аппаратный переключатель блокировки клавиатуры и тачскрина, который можно было использовать при просмотре фильмов. Однако на моем девайсе он был слишком разболтанным…
Разбирается КПК несложно: выкручиваем 4 винта и снимаем переднюю часть корпуса. На всякий случай я прочистил грязь между тачем и верхней частью корпуса — она тоже бывает влияет на ложные нажатия и чувствительность тачскрина:
А вот и виновник наших проблем: рычажок переключателя был отломан, но все еще находится в положении «разблокирован». Даже если в выжать в упор — он все равно не работал. Ну что ж, фен в руки, сдуваем переключатель и ставим вот такую перемычку (на фото флюс ещё не отмыт):
Включаем девайс и смотрим — теперь всё работает! Вот такой простой и быстрый ремонт Axim'а. КПК мне сразу очень понравился, я и ранее знал о его легендарности, но теперь узнал и о том, что он очень круто спроектирован и собран! Кстати, есть смысл сразу сдуть концевой выключатель, который прижимает задняя крышка и заменить на перемычку.
GPU не очень хорошо работает на кастомных прошивок, на которую прошиты многие Axim X51v. Поэтому есть смысл прошить сток: качаем прошивку (Файл отката), закидываем на SD-карту и ребутим девайс нажатием клавиш Wi-Fi + включение + Reset. После этого, девайс пойдет прошиваться.
Теперь девайс чистый, как с завода! Можно приступить к написанию небольшой демки-игрушки, которая сможет продемонстрировать нам перспективы нашего КПК в 3D!
❯ Практическая часть: подготовка
Изначально, в практической части статьи должна была участвовать не менее легендарная Nokia N95. Однако вот незадача: несмотря на то, что под Symbian сохранился SDK (который работает нормально только под Windows XP), на устройствах с системой старше 9.x необходимо взламывать installserver, дабы иметь возможность ставить хоумбрю программы (к которым относится и наша игра) и отладчик TRK.
И хотя свой девайс я пропатчил, дебаггер нормально поднять мне так и не удалось. Я смог проинициализировать контекст GLES, запилить примитивный рендерер с загрузкой ассетов из памяти устройства но потом решил перевести проект на WinMobile… Проблем с разработкой под Symbian много: если приложение крашится — то оно просто закрывается, без сообщений и логов. Добавьте к этому то, что в Symbian вообще нет исключений и не всегда можно записать ошибки в лог и отладка превращается в ужас. Ситуацию исправляет Qt, который работает на N95, но в котором нет поддержки GLES (по крайней мере, в виде обычного QOpenGL, хотя возможность юзать API системы из Qt есть и дебаггер там работает нормально, так что не всё потеряно). Если вы когда-то что-то пилили под Symbian, особенно в Carbide — пишите свой опыт в комментариях, интересно почитать :)
WinMobile не менее интересен тем, что в нём поддерживается сразу два графических API: классический OpenGLES в профиле Common Lite (только fixed-point арифметика) и мобильная версия Direct3D — D3DM.dll, которая предоставляет API очень похожее на DX9, но без поддержки шейдеров. Что не менее приятно — есть официальные биндинги от Microsoft к D3DM в .NET Compact Framework, что позволяет легко писать 3D-игры под WM на C#/VB.NET.
Поскольку WinMobile — достаточно открытая для пользователя система, хватит лишь накатить VS2005/2008 на машину с WinXP/WinVista/Win7/Win8 и сразу начать разрабатывать под неё приложения, никаких проблем с отладкой и запуском приложений тут нет. На Win10/Win11 совместимость с WM5 поломали :(
Создаём приложение для смарт-устройств, выбираем в качестве целевой платформы WM5-устройство (эмулятор будет слишком медленным для наших целей, он даже для 2D-игр не подойдет) и, наконец-то, приступаем к написанию игры!
Что же за игра у нас будет? Я решил сделать эдакое 3D-переосмысление популярного в прошлом бесконечного раннера из «тетриса», где мы едем на машинке F1 и обгоняем другие машины, стараясь в них не врезаться. Основной целью является набрать как можно больше очков. Подобные игры достаточно популярны на мобильных девайсах и сейчас: вспомнить хотя-бы Highway Traffic, однако мой вариант будет весьма колоритным: ведь в моей демке мы будем кататься на ТАЗе 21099 и уворачиваться от гнилых «вторых гольфов». Ну а почему бы и нет, я просто очень люблю старые гнилые жигули и это не первый мой проект про машины этого производителя :)
❯ Практическая часть: «движок»
Как и у настоящей машины, у каждой игры должен быть собственный движок! Однако в случае конкретно нашей игры, это скорее небольшой фреймворк, который предоставляет ровно тот функционал, который нужен игре без каких либо излишеств. Необходимо изначально распланировать требования для будущего фреймворка, дабы написание игры не скатилось в процесс, известный в узких кругах как «движкописание» :)
Рендерер: с графической точки зрения, фреймворк должен реализовывать весьма небольшой функционал. Загружать геометрию и текстуры из файлов в специально-подготовленном формате, реализовывать концепцию камеры, отрисовывать статическую геометрию, а также спрайты и текст, реализовывать примитивную систему материалов, которая позволяет наносить на геометрию текстуры, красить их в определенный цвет и управлять повершинным освещением, а также наносить на геометрию отражения с помощью специально подготовленных enviornment-текстур. Кроме того, рендерер должен уметь рисовать симпатичное анимированное небо в виде полусферы.
Звук: воспроизведение wav-звуков и музыки из файлов. Да и всё пожалуй — что ещё нужно от звуковой подсистемы? :) Стерео ведь нет, поэтому и 3D-звук не нужен.
Ввод: обработка нажатий на тачскрин и аппаратные кнопки устройства, маппинг кейкодов в виртуальный «геймпад». GUI-подсистему тоже частично можно отнести именно сюда!
Физика: AABB и Sphere vs Sphere столкновения. Никакого полноценного солвера тут и не нужно :)
Начинаем, пожалуй, с реализации рендерера. Сначала нам необходимо создать окно и контекст D3DM. Процесс практически идентичен D3D8 и D3D9: передаём информацию о нужном адаптере (видеочипе) и заполняем структуру PresentationParameters, однако есть важные нюансы: аппаратный FSAA лучше всего отключить (MultisampleQuality), а также передавайте точный размер окна, в которое собираетесь рендерить изображение, иначе система начнёт софтварно (!) скейлить рендертаргет до размера окна каждый кадр, что, как сами понимаете, крайне медленно.
Из форматов Depth-Stencil форматов поддерживается D16, D24S8 и D32. Желательно использовать D16 (несмотря на тайловую архитектуру, насколько мне известно, в MBX все равно есть fallback до классического рендеринга при некоторых условиях). Практически на всех КПК и коммуникаторах использовался 16-битный цвет, т.е RGB565, но можно указать Unknown — тогда GAPI подцепит тот формат пикселя, что используется в остальной системе.
PresentParameters pp = new PresentParameters();
pp.AutoDepthStencilFormat = DepthFormat.D16;
pp.BackBufferCount = 1;
pp.BackBufferFormat = Format.Unknown;
pp.BackBufferWidth = parentForm.ClientSize.Width;
pp.BackBufferHeight = parentForm.ClientSize.Height;
pp.EnableAutoDepthStencil = true;
pp.FullScreenPresentationInterval = PresentInterval.One;
pp.MultiSample = MultiSampleType.None;
pp.PresentFlag = PresentFlag.None;
pp.SwapEffect = SwapEffect.CopyVSync;
pp.Windowed = true;
device = new Device(0, DeviceType.Default, parentForm.Handle, CreateFlags.None, pp);
device.RenderState.Lighting = false;
aspectRatio = (float)parentForm.ClientSize.Width / (float)parentForm.ClientSize.Height;
Переходим сразу же к рисованию геометрии! Для начала рендеринга, нам необходимо подготовить состояние контекста: посчитать и установить матрицы вида (т. е. камеры) и проекции для трансформации геометрии, задать рендерстейты (список состояний, например нужно ли рисовать модельку с освещением, или нет), очистить экран и Z-буфер и установить параметры фильтрации текстур. Перспективная коррекция текстур — достаточно тяжелая операция и использовать её стоит лишь при необходимости:
public void BeginScene()
{
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.SkyBlue, 1.0f, 0);
device.BeginScene();
device.TextureState[0].MinFilter = TextureFilter.Point;
device.TextureState[0].MagFilter = TextureFilter.Point;
device.RenderState.TexturePerspective = true;
// Prepare projection
Matrix matrix = Matrix.PerspectiveFovLH(60.0f * MathUtils.DegToRad, aspectRatio, 0.1f, 350.0f);
device.SetTransform(TransformType.Projection, matrix);
}
public void EndScene()
{
device.EndScene();
device.Present();
System.Threading.Thread.Sleep(16);
}
Чтобы какую-то модельку нарисовать, нам нужно сначала её загрузить! Для возможности напрямую прочитать треугольники из файла и сразу записать их в вершинный буфер, я написал небольшой конвертер из формата SMD (GoldSrc) в собственный, очень простой и легковесный формат, который состоит из позиции вершины и её текстурных координат:
public struct BoundingBox
{
public float MinX, MinY, MinZ;
public float MaxX, MaxY, MaxZ;
}
public sealed class ModelConverter
{
public const int Header = 0x1234;
static BoundingBox CalculateBBox(SmdMesh mesh)
{
BoundingBox ret = new BoundingBox();
ret.MinX = float.PositiveInfinity;
ret.MinY = float.PositiveInfinity;
ret.MinZ = float.PositiveInfinity;
ret.MaxX = float.NegativeInfinity;
ret.MaxY = float.NegativeInfinity;
ret.MaxZ = float.NegativeInfinity;
foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
ret.MinX = Math.Min(ret.MinX, triangle.Verts[i].Position.X);
ret.MinY = Math.Min(ret.MinY, triangle.Verts[i].Position.Y);
ret.MinZ = Math.Min(ret.MinZ, triangle.Verts[i].Position.Z);
ret.MaxX = Math.Max(ret.MaxX, triangle.Verts[i].Position.X);
ret.MaxY = Math.Max(ret.MaxY, triangle.Verts[i].Position.Y);
ret.MaxZ = Math.Max(ret.MaxZ, triangle.Verts[i].Position.Z);
}
}
return ret;
}
private static int FloatToFixedPoint(float x)
{
return ((int)((x) * 65536.0f));
}
public static void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting mesh " + fileName);
Smd2Bmd.SmdMesh mesh = new Smd2Bmd.SmdMesh(stream);
BoundingBox bb = CalculateBBox(mesh);
using(Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".mdl"))
{
BinaryWriter writer = new BinaryWriter(outStrm);
writer.Write(Header);
writer.Write(mesh.Triangles.Count * 3); // Verts count
// BBox
writer.Write(bb.MinX);
writer.Write(bb.MinY);
writer.Write(bb.MinZ);
writer.Write(bb.MaxX);
writer.Write(bb.MaxY);
writer.Write(bb.MaxZ);
foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.X));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Y));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Z));
writer.Write(triangle.Verts[i].UV.X);
writer.Write(triangle.Verts[i].UV.Y);
}
}
}
}
}
Обратите внимание, PowerVR MBX оперирует fixed-point арифметикой! D3DM, конечно, может автоматически преобразовывать float-координаты вершин в числа с фиксированной точкой, вот только реализовано это криво и косо: драйвер будет конвертировать все вершины в fixed-point каждый вызов отрисовки, вместо того, чтобы один раз преобразовать их после Unlock'а вершинного буфера. Теперь представьте, насколько это тормозно для хоть сколь-либо комплексной модели :)
При этом загрузчик модели при таком подходе будет очень простым и будет работать шустро даже на таком слабеньком железе:
public Model(string debugName, Stream strm)
{
BinaryReader reader = new BinaryReader(strm);
int hdr = reader.ReadInt32();
int numVerts = reader.ReadInt32();
int vertSize = 20;
Bounds = new BoundingBox(reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2,
reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2);
PrimitiveCount = numVerts / 3;
byte[] data = new byte[numVerts * vertSize];
strm.Read(data, 0, (int)(strm.Length - strm.Position));
Buffer = new VertexBuffer(Engine.Current.Graphics.device, vertSize * numVerts, Usage.None, VertexFormats.PositionFixed | VertexFormats.Texture1, Pool.SystemMemory);
GraphicsStream gs = Buffer.Lock(0, Buffer.SizeInBytes, LockFlags.None);
gs.Write(data, 0, data.Length);
Buffer.Unlock();
DebugName = debugName;
}
Переходим к текстурам. Грузить напрямую png/jpg на КПК слишком долго, поэтому их я тоже перегоняю в собственный примитивный формат, который состоит из описания ширины/высоты, а также формата текстуры и собственно, самих пикселей. На данный момент поддерживаются только RGB565 текстуры — с ними MBX работает лучше всего:
public sealed class TextureConverter
{
public const int Header = 0x1234;
public static unsafe void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting texture " + fileName);
Bitmap bitmap = (Bitmap)Image.FromStream(stream);
byte[] pixels = new byte[bitmap.Width * bitmap.Height * 2];
System.Drawing.Imaging.BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format16bppRgb565);
Marshal.Copy(data.Scan0, pixels, 0, pixels.Length);
bitmap.UnlockBits(data);
using (Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".tex"))
{
BinaryWriter writer = new BinaryWriter(outStrm);
writer.Write(Header);
writer.Write(0); // 0 - 565, 1 - RGBA
writer.Write(bitmap.Width);
writer.Write(bitmap.Height);
writer.Write(pixels);
}
}
}
Загрузчик тоже получился примитивным и шустрым донельзя, пусть и без какой либо компрессии. PowerVR MBX поддерживает собственный формат компрессии — PVRTC:
BinaryReader reader = new BinaryReader(strm);
int hdr = reader.ReadInt32();
int fmt = reader.ReadInt32();
Width = reader.ReadInt32();
Height = reader.ReadInt32();
byte[] data = new byte[Width * Height * 2];
strm.Read(data, 0, data.Length);
Handle = new Texture(Engine.Current.Graphics.device, Width, Height, 1, Usage.Lockable, Format.R5G6B5, Pool.VideoMemory);
int pitch;
GraphicsStream gs = Handle.LockRectangle(0, LockFlags.None, out pitch);
gs.Write(data, 0, data.Length);
Handle.UnlockRectangle(0);
strm.Close();
Переходим, наконец, к фактическому рисованию модели! Для этого мы строим мировую матрицу для трансформации нашей модели, а также задаем вершинный буфер для, собственно, вершинного конвейера и посылаем видеочипу команду отрисовки. ZBufferWriteEnable нужен для отрисовки геометрии без записи в Z-буфер, что можно использовать, например, для реализации скайбоксов:
public void DrawModel(Model model, Transform transform, Material material)
{
Matrix matrix = Matrix.RotationY(transform.Rotation.Y * MathUtils.DegToRad)
* Matrix.Translation(transform.Position);
device.SetTransform(TransformType.World, matrix);
// Setup renderstate
device.RenderState.ZBufferWriteEnable = !material.DepthWrite;
device.SetTexture(0, material.Diffuse.Handle);
device.SetStreamSource(0, model.Buffer, 0);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, model.PrimitiveCount);
}
И рисуем модельку:
Model model;
Material mat;
Transform t;
void Start()
{
model = Model.FromFile("model.mdl");
mat = new Material();
mat.Diffuse = Texture2D.FromFile("test.tex");
}
void Update()
{
t = new Transform();
t.Position.Z = 150;
t.Rotation.Y += 0.1f;
graphics.DrawModel(model, t, mat);
}
Результат: у нас есть крутящийся кубик или любая другая произвольная 3D-модель!
Переходим к обработке ввода. Тут ничего сложного нет, ловим события KeyUp/KeyDown формы и назначаем виртуальным кнопкам их состояние.
public Input(Form parentForm)
{
keyState = new bool[(int)GamepadKey.Count];
parentForm.KeyPreview = true;
parentForm.KeyDown += new KeyEventHandler(OnKeyDown);
parentForm.KeyUp += new KeyEventHandler(OnKeyUp);
}
private GamepadKey ResolveKeyCode(Keys key)
{
GamepadKey k = GamepadKey.Count;
switch (key)
{
case Keys.Left:
k = GamepadKey.Left;
break;
case Keys.Right:
k = GamepadKey.Right;
break;
case Keys.Up:
k = GamepadKey.Up;
break;
case Keys.Down:
k = GamepadKey.Down;
break;
case Keys.Return:
k = GamepadKey.OK;
break;
}
return k;
}
void OnKeyUp(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);
if (key != GamepadKey.Count)
SetKeyState(key, false);
}
void OnKeyDown(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);
if (key != GamepadKey.Count)
SetKeyState(key, true);
}
public bool GetKeyState(GamepadKey key)
{
return keyState[(int)key];
}
private void SetKeyState(GamepadKey key, bool state)
{
keyState[(int)key] = state;
}
Теперь мы сможем управлять нашей машинкой в игре (которой пока ещё нет). Самая-самая основа для реализации игры подобного плана у нас есть, пора переходить к геймплею!
Еще больше клея! Замена стекла на Iphone 15 Pro Max)
Сегодня я расскажу как яблочники ушли в отрыв во время создания 15 серии. А учитывая какие вещи при сборке своих смартфонов они делали до этого, то я могу сказать....
И если раньше я удивлялся от сложности работы с прошками, то теперь стало ещё тяжелее работать и с про максами. Хотя как посмотреть)
А ещё я удивлен что до меня так быстро дошел живой экземпляр 15 серии, потому что стекло сделали выпирающим из рамы и нереально тонкие рамки из за которых при ударе дисплей мгновенно отлетает в вальгалу доблестно проиграв асфальту.
Ну ладно, погнали знакомиться с потерпевшим, которому не помог ни ваш хваленый керамик шилд, ни суперпрочная титановая рамка.
Iphone 15 Pro Max собственной персоной)
А вот и маштаб поближе)
А я напомню что замена дисплея на эту вундервафлю стоит 50-60к славянских рупий, что составляет половину телефона.
Но мы же тут собрались посмотреть как я этот дисплей восстанавливать буду, потому что заменить дисплей много ума не надо. Тем более что тут у нас полностью целая матрица битым стеклом. Хотя обычно на 15 серии обычно все наоборот)
При этом программаторы и тестеры от 14 серии полностью подходят на 15. А значит что танцев с бубном даже при замене дисплея ни с тру тоном, ни с ошибкой неродного дисплея не будет, как это было например с 13 и 14 серии на старте продаж. Но это только для богатых сервисов)
А вот переклеить эту дичь ещё нужно постараться, потому что рамки тонкие и щелей между корпусом и стеклом нет вообще. И титановая рамка не гнется. А если будем поднимать дисплей на станке, то согнем разбитый угол и увидим на экране горизонтальную полосу в месте удара или весь дисплей станет зеленым. А оно нам не надо)
Короче вытащить дисплей из корпуса просто нереально.
Но я уже после S20FE ничего не боюсь, так что берем тонкую пленку, изопропил, сепаратор и с молитвами открываем данную вундервафлю)
С дисплея сняли почти все, кроме датчика освещения. Он же отвечает и за тру тон. Ещё в 13 серии под него вырезали дырку прямо в матрице и видимо Apple так понравилось данное решение, что они запихнули все тоже самое в 14 и 15 серию.
Выглядит эта дырка примерно вот так. И если руки не из плеч, то при снятии этого датчика легко можно пробить матрицу насквозь и получить на этом месте черное пятно на изображении. Такие дела)
Теперь мы должны попасть струной между стеклом и матрицей. А сделать это не так просто, тк рамка теперь полностью залита герметиком и места для того чтобы завести струну нет вообще. А если заведешь струну не туда, то очень быстро разорвешь матрицу. Удобно)
Поэтому нужно отрезать лезвием часть рамки в упор к стеклу и только тогда начать его срезать, иначе ахтунг)
Чистим матрицу от клея и что же мы видим? Теперь вся рамка дисплея приклеена к матрице и снять её почти невозможно. Н - надежность)
На 14 pro например герметиком была залита только ножняя часть рамки. А теперь на 15 Pro и Pro max вся рамка это и есть огромный кусок клея. На Apple watch 7-8-9 сделана такая же несъемная рамка. Так что если повреждена её часть, то с этим придется смириться или менять дисплей целиком, потому что её не поменять. Такие дела)
Подключаем дисплей обратно и проверяем что матрица прекрасно работает)
Затем берем новое оригинальное стекло с уже наклееной оптической пленкой. Опустим все эти байки что оригинальных стекл не существует. Все прекрасно покупается и продается. Как и все остальные запчасти на любой айфон. На авито с разборок любую запчасть купить можно и в любом количестве. Вплоть до ориг корпусов и дисплеев.
Очищаем матрицу от пылинок под зеленой лампой в антипылевой комнате.
И склеиваем ее с новым стеклом в вакуумном прессе, преварительно вручную отцентовав матрицу, потому что пресс форм на эту модель нет)
Закидываем дисплей в автоклав для удаления пузырей)
И достаем готовый дисплей без единой пылинки под стеклом)
Далее проклеиваем стыки на рамке дорогущим термоклеем. И убираем излишки клея изопропилом.
Клеим новую влагозащитную проклейку.
Затем собираем вундервафлю обратно и кидаем аппарат в морозилку на 10 минут)
И достаем готовый айфон)
Ну и олеофоб конечно же проверим, куда же без него)
Кстати вот вам и хваленая титановая рамка, которую погнуло от удара. Но дисплей все равно выдержит такое изгибы. Так что все нормально)
Выдаем Айфон обратно владельцу и обмениваем его на деньги)
По цене вышло 17500р
Всем удачных ремонтов.
Телефон мне прислать можно СДЭКом
г. Санкт-Петербург
Я в Телеграме
Я в Ютубе
Канал со всеми ценами на ремонт ТУТ
Интересные посты (Осторожно! Много букв):
А так же приглашаю всех желающих в комменты для совместного веселья)
Ну а тем, кто напишет, что пост реклама - пришлю мемы с ведущими Очумелых Ручек. Всем Добра)
Есть пробитие. Замена дисплея на Google Pixel 8 pro)
Сегодня я расскажу как инженеры из Google уже не первый год пытаются сломать экраны на своих смартфонах и как у них наконец это получилось)
Для моих подписчиков уже давно не секрет что Google Pixel - одни из самых странных телефонов в плане сборки.
Взять например Pixel 4 - где шлейф матрицы залили герметиком и поставили антенну, которая просто выдавливает заднюю крышку)
Pixel 5 - у которых из коробки отваливалась рамка от дисплея или Pixel 5a у которых поголовно отваливался процессор.
6 и 7 серия вышла без косяков. Правда экраны на Pixel 6 Pro и 7 Pro от падения дохнут как мухи и стоят дороже телефона. Но это уже не так страшно)
А вот дальше американцы из гугла снова дунули что-то забористое, потому что 8 серия получилась просто наглухо отбитая)
Потому что вот что происходит если просто наклеить защитное стекло на флагманский Google Pixel 8 Pro за 100к.
Клиент даже не понял как он убил свой смартфон просто наклеив защитку.
Да, просто наклеил защитку. Даже без ударов об твердые поверхности.
И теперь вместо изображения - зеленая дискотека)
Так происходит когда дешифратор матрицы замыкает по цепи питания. Поэтому даже уже по видео приговор - замена дисплея без вариантов на спасение.
А когда мне принесли пациента, то экран вообще перестал хоть что либо показывать)
Но ведь нам же на презентации 8 пикселей рассказали они все продумали и как они сотрудничают с IFIXIT для того чтобы сделать ремонт пикселей удобнее?
И это правильно, потому что чинить вам 8 серию придется явно чаще обычного, потому что при разборке причина сразу же бросилась в глаза.
Это штыри от антенн, которые насквозь пробили шлейф матрицы)
А вот вам наглядно дырка в шлейфе штырем от антенны.
Сразу несколько дорог матрицы пробиты насквозь и восстановить их невозможно. Дисплей труп без шансов на восстановление)
А самое забавное что это прям массовая проблема, но Гуглу на нее
Потому что они эти штыри сделали ещё в 7 серии. Вот например Pixel 7 pro с такими же дырками в шлейфе)
А самое интересное, что можно спокойно обломать эти антенны и это никак не изменит функционал телефона. так что инженерам гугла можно сказать только...
Кстати я чуть не словил инсульт , потому что сначала купил единственный оригинальный дисплей в городе за овер 30к и получил при подключении вот такую картину)
Но оказалось что просто дисплей был с браком, поэтому я вернул его в магазин и заказал другой ориг дисплей, но уже из Москвы)
Кстати отпечаток привязан к процессору, поэтому его всегда надо переносить при замене дисплея. Хотя гугл рассказывает что его каким то образом можно привязать заново. Но гуглу верить как мы поняли лучше не стоит)
Собираем аппарат обратно без смертоносных штырей и проверяем что все работает)
Выдаем чудо американской инженерной мысли обратно владельцу и обмениваем его на деньги)
По цене вышло 35000р
Всем удачных ремонтов.
Телефон мне прислать можно СДЭКом
г. Санкт-Петербург
Я в Телеграме
Я в Ютубе
Интересные посты (Осторожно! Много букв):
А так же приглашаю всех желающих в комменты для совместного веселья)
Ну а тем, кто напишет, что пост реклама - пришлю мемы с Инженерами. Всем Добра)