Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Поднимайтесь как можно выше по дереву, собирайте цветы и дарите их близким.
Вас ждут уникальные награды и 22 выгодных промокода!

Пикаджамп

Аркады, Казуальные, На ловкость

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • Animalrescueed Animalrescueed 36 постов
  • Oskanov Oskanov 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
66
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
11 месяцев назад

Кто у нас любит пихать невпихуемое? Конечно-же я!⁠⁠

Недавно мне подогнали весьма интересный девайс - онлайн кассу Атол с складным дисплеем, которая может работать от аккумулятора. Ну я такой посидел, покумекал и понял что... это ж офигенный мини-нетбук с полноразмерной клавиатурой! Под капотом всё тоже очень и очень хорошо: гигагерцовый ARM-чипсет Marvell PXA168, 256Мб ОЗУ и куча портов для своих нужд. По правде сказать, это реально очень крутая платформа для каких-то собственных самоделок.

Кто у нас любит пихать невпихуемое? Конечно-же я! Опрос, Гаджеты, Подарки, Онлайн-кассы, Моддинг, Программирование, Ништяки, Длиннопост

Поскольку девайс работает на Windows CE и у него есть очень привлекательные стрелочки на клавиатуре, я понял что его можно превратить в игровую консоль с функционалом SSH-терминала. А поскольку на свежие WinCE с дисплеями такого разрешения эмуляторов нет (есть для других архитектур - MIPS, SH3, но они не заработают здесь. Ближайший пример - навгиаторы на винде, там тоже работают в основном только нативные игры), я начал портировать Wolfenstein, эмуляторы и ещё по мелочи :)

Кто у нас любит пихать невпихуемое? Конечно-же я! Опрос, Гаджеты, Подарки, Онлайн-кассы, Моддинг, Программирование, Ништяки, Длиннопост

В общем, сейчас портирую эмули и готовлю статью с видосом о превращении списанного кассового аппарата в полезный ништяк, которому не место на помойке!

?
Всего голосов:
Показать полностью 2 1
[моё] Опрос Гаджеты Подарки Онлайн-кассы Моддинг Программирование Ништяки Длиннопост
13
1430
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
11 месяцев назад

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM⁠⁠

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Я всегда любил находить новые применения стареньким девайсам, даже если обход защиты и разработка для них чего-то полезного занимала у меня некоторое время. И если с прошлыми моими статьями, где я привносил новую жизнь смартфонам на Android 2.3, а затем и на Android 1.5 всё понятно — девайсы получили возможность не только быть звонилками, но и вполне полноценными смартфонами, то в случае таких необычных девайсов, как электронные переводчики — всё гораздо интереснее, ведь по сути, это дешёвые альтернативы таким легендарным устройствам, как HP Jornada! Недавно я купил переводчик Ectaco за 1.500 рублей на Windows CE, обошел встроенную оболочку, написал программу, которая твикает реестр и даже портировал туда эмулятор NES. Интересно узнать об этом процессе во всех подробностях? Тогда добро пожаловать под кат!

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

Есть на свете такой интересный класс устройств, как портативные клавиатурные минипк — HPC. Основные особенности таких девайсов перед обычными органайзерами — полноценная QWERTY-клавиатура, возможность запускать кастомный софт и порой интересные процессоры на очень необычных архитектурах. Совсем недавно, я писал статью о том, как купил целых два таких HPC — HP 620LX и HP Jornada 680, причём 620LX я отреставрировал — девайс теперь полностью работает!

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Но буду предельно честен: оба девайса были куплены по низу рынка и не полностью рабочими. Каждый обошёлся в 3.000 рублей, в сумме 6.000 рублей — весьма немалая для меня сумма. Ценники на рабочие экземпляры, причём не всегда с доком и дата-кабелем начинаются от 5-6 тысяч рублей. Кто-то из читателей скажет мол это копейки, но для меня сейчас это прям ощутимые деньги, плюс в моём чате после выхода статьи многие писали что тоже хотели бы заполучить подобные девайсы, но не имеют возможности выложить такую сумму. И тут я подумал, что надо-бы поискать альтернативы джорнаде, которые были бы гораздо дешевле.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Однако с чего начать поиски? Ведь хочется девайс именно компактный и на необычном процессоре, понятное дело что EEEPC (которые, к слову, на вторичке стоят по 500 рублей) тут не подходят. Коммуникаторы на Windows Mobile тоже вполне недорогие — можно найти некоторые модели HTC или Glofiish по 500-1.000 рублей, но всё же это сайд-слайдеры, а хотелось бы форм-фактор ноутбука (к слову, из «ноутбучных» есть Toshiba Portege G910, который я давно хочу заполучить). И тут подписчик из Казахстана заслал мне целую коробку с подогоном ништяков, где среди девайсов оказался электронный органайзер Citizen!

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Девайс меня жутко заинтересовал, даже несмотря на монохромный простенький ЖК-дисплей, мне хотелось под него что-нибудь написать самому. Да хоть понг или стрелялку, где кораблик — один пиксель слева, а астероиды — пиксели справа. Но я понимал, что конкретно в этой модели вся прошивка лежит в ROM (масочной, которая физически прошивается на заводе один раз) и под эту модель ничего написать самому не получится. Поэтому я полез на барахолки с тегами «органайзер» искать девайсы с возможностью подключения к ПК по USB: мало ли, хоть какая-то модель будет поддерживать кастомные программы на манер инженерных калькуляторов.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Но нет, поиски не увенчались успехом. Зато в какой-то момент, онлайн-барахолка подсунула мне объявления о продаже электронного переводчика Ectaco, которые тоже были в разделе «для офиса», как и органайзеры. И всё бы ничего — ну да, цветной дисплей, ну да, выглядит замечательно, но я даже не представлял что за процессор и ОС в таком девайсе стоят. Пока не полистал фото, не присмотрелся к крайне знакомому интерфейсу и не увидел вот это...

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Да! Вы все правильно поняли, некоторые переводчики работают на базе WIndows CE. А если там стоит WinCE, то как минимум есть солидный объем оперативной памяти (хотя бы 64 мегабайта), дисплей с разрешением 240x320 и довольно бодрый процессор, как минимум 150-200МГц. Далее я хотел узнать, с чем же мне предстоит столкнуться и начал гуглить мануал, дабы узнать о доступных пунктах в меню и можно ли выйти через них в оболочку WinCE (как на навигаторах). Чтения мана дало понять что нет, но я узнал что для работы устройства обязательно нужна SD-флэшка из комплекта устройства, иначе девайс стопорится на белом экране.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

А это тоже наводит на определенные мысли. Либо девайс полностью загружается с SD-карты, либо запускает оттуда программы, через которые потенциально можно запустить explorer.exe и выгрузить стандартный софт из памяти. И я начал искать в сети образ родной флэшки. Я нашел на ютубе гайд по восстановлению такого переводчика, где автор видео выложил архив в облако, скачал и начал колупать — да здесь же целая папка System, где лежат отдельные exe'шники каждой программы, представленной на устройстве!

в облако, скачал и начал колупать — да здесь же целая папка System, где лежат отдельные exe'шники каждой программы, представленной на устройстве!

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

На этом моменте я понял, что девайс надо брать! Также на онлайн-барахолках попадаются переводичики и других брендов, которые потенциально работают на других системах. Их тоже было бы интересно поколупать (авось на Linux!), попытаться что-то с ними сделать, но я пока не могу себе позволить их купить.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Когда девайс приехал ко мне, я понял что отдал деньги не зря: он настолько компактный (даже меньше iPhone 14 Pro Max), что помещается в карман летних шорт, у него есть QWERTY-клавиатура и DPAD (что пригодится для игр), а также резистивный тачскрин и реально классный корпус с металлической рамкой дисплея. Придя домой, я сразу же начал его колупать: такие красавчики точно не должны отправляться в утиль, я был уверен что смогу найти для них новое применение!

Тут важно отметить, что устройства от Ectaco были топовыми в свое время и стоили кучу денег. 15 тысяч рублей в 2009 году — очень серьезные деньги, это цена новенького коммуникатора Rover, Xperia X10 вышедшего годом позже, или, например, Mio/Glofiish. Неудивительно, что девайсы построены на базе неплохого железа и полноценной WinCE!

❯ Что под капотом?

Конечно же перед тем, как смотреть софт, нужно посмотреть на каком железе работает наш переводчик. Разбирается девайс несложно, но конструкция весьма замудренная, нужно быть аккуратным. Вытаскиваем флэшку, откручиваем винтики на крышке отсека АКБ и отключаем аккумулятор. В моём девайсе, он уже был кем-то заменен на свежий (родные уже «все»):

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

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Сорян за качество фото на этапе разборки, мой S8, купленный по низу рынка и используемый в качестве камеры уже «подустал» и модуль автофокуса у него поврежден.

Сверху расположена материнская плата с процессором, ОЗУ и флэш-памятью. То есть, по сути, это SoM (система на модуле), но не общего назначения, а разработанная Ectaco для своих нужд. Моделей переводчиков было много и возможно компания меняла конфигурацию ОЗУ/процессора и т. п., оставляя одну и ту же нижнюю плату. Для дальнейшей разборки, стоит отклеить черную наклейку, дабы не повредить шлейф дисплея, открутить три винта, крепящие верхнюю плату и снять крепежи грузиков, впаянные в пластик корпуса. Теперь нужно аккуратно вставить плоскую отвертку так, как показано ниже и упереть её в пластиковую прокладку между коннекторами верхней и нижней платы:

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Не тяните пальцами за другие части платы. Она достаточно тонкая и погнуть/надломить её не составит труда!

Теперь верхнюю плату можно снять. Осторожнее с шлейфом дисплея — он весьма хрупкий и его можно случайно порвать:

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Теперь мы можем разглядеть основную плату нашего девайса подробнее. В качестве процессора используется чипсет NXP LH7A404-N0F000B3. Это ARM922T (ARM9TDMI, ARMv4) ядро, работающее на частоте до 200МГц. Уже вполне неплохо, на уровне ранних Intel StrongARM (XScale)! В качестве оперативной памяти, используются две банки Samsung K4M56163LG по 32Мб каждая. Теоретически, объем ОЗУ можно расширить до 128Мб, как я это делал в статье про апгрейд коммуникатора QTek! Тест-поинты дисплея подписаны, скорее всего используется стандартная TTL-RGB матрица (но найти такую на замену будет сложно).

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

С обратной стороны платы расположился чип флэш-памяти типа NAND в корпусе TSOP Legacy. Это стандартная самсунговская флэшка небольшого объема, но на ней находится скорее всего только загрузчик — сама система грузится в ОЗУ с SD-карты. Приятно радует, что подписаны тест-поинты на плате и среди них мы видим как минимум UART. Это значительно повышает возможности девайса для моддинга в будущем, единственный нюанс — лишь бы на этом UART не висела консоль ядра Windows CE, потому что иначе открыть COM-порт не выйдет и «выпнуть» логи из определенного терминала как в Linux не получится! Именно с такой проблемой я и столкнулся на навигаторах с WinCE на борту (UART'ов в SiRF Atlas IV только два, один на GPS-модуль, т. е. чип придется снимать и напрямую к шару паяться, а второй на логи системы).

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

На основной плате расположился чарджер/КП, кодек AC97, разъемы и другие необходимые модули для функционирования девайса!

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

❯ Обходим оболочку

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

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

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Ага, мы видим два потенциальных вектора для атаки: первый это system.bin, собственно «сырой» образ для загрузки в ОЗУ и папка System/App с системными приложениями. Изучение system.bin я отложил на потом, решив подобраться с самого простого метода — попытка подменить exe'шники программ в System/App. Я открыл в IDA Pro программу-лаунчер, которая представляет из себя меню устройства и проверил на манер наличия проверки каких-либо подписей перед запуском программ. Их, к счастью, не оказалось: правда и реверсил я как оказалось не лаунчер, а стартовую анимацию как потом узнал. Сам лаунчер находится в system.bin, но в прошивке для другого девайса, Launcher находится именно на флэшке.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Помимо этого, в папке лаунчера лежит файл с описанием пунктов меню и соответствующими программами. Я добавил туда пункт, который запускает \Windows\explorer.exe — и это сработало — девайс попал на рабочий стол! Но нужен был способ автоматизации всего этого дела и самое главное — закрытие родной оболочки (она кушает ОЗУ и на нее можно случайно переключиться в панели задач).

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Мы уже вышли на рабочий стол!

Итак: если стартовая анимация запускается лаунчером и нет никаких проверок подписей, то всё просто, нужно лишь написать небольшую программу, которая будет запускать explorer.exe и прибивать родное меню. За минут 30 был написан следующий говнокод (помимо этого, я писал итератор по виндовым окнам дабы найти название класса окна лаунчера):

int WinMain(HINSTANCE inst, HINSTANCE prevInst, LPWSTR cmdLine, int nShowCmd)
{
// Launch explorer
PROCESS_INFORMATION info;
CreateProcess(L"\\Windows\\explorer.exe", 0, 0, 0, 0, 0, 0, 0, 0, &info);

// Terminate launcher
HWND hwnd = FindWindowW(L"NSGL_WINDOW", 0);
if(hwnd)
{
DWORD procId;
GetWindowThreadProcessId(hwnd, &procId);

HANDLE proc = OpenProcess(PROCESS_TERMINATE, false, procId);
TerminateProcess(proc, 0);
CloseHandle(proc);
}
}

Этого кода было достаточно для полноценного запуска системы и полного «выпинывания» стандартной оболочки из памяти :) Но есть важный нюанс: несмотря на то, что здесь используется WinCE 5.0 — довольно свежая система, нормально работают бинарники собранные только для PocketPC 2003 в VS2005/VS2008, иначе система ругается на отсутствие библиотек. Учтите это, если захотите себе такого же красавца!

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

void DbgMessageBox(wchar_t* str)
{
MessageBox(0, str, L"Error", MB_OK);
}

void PatchRegistryKeyI(wchar_t* path, wchar_t* key, DWORD val)
{
HKEY hk;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ | KEY_WRITE | KEY_SET_VALUE, &hk) != ERROR_SUCCESS)
{
DbgMessageBox(L"Failed to open registry path");

return;
}

if(RegSetValueExW(hk, key, 0, REG_DWORD, (BYTE*)&val, sizeof(val)) != ERROR_SUCCESS)
{
DbgMessageBox(L"Failed to patch registry subkey");

return;
}

RegCloseKey(hk);
}

void PatchRegistry()
{
PatchRegistryKeyI(L"Explorer", L"ViewAll", 1);
PatchRegistryKeyI(L"Explorer", L"ShowExt", 1);
PatchRegistryKeyI(L"Explorer", L"ShowSys", 1);
PatchRegistryKeyI(L"Explorer", L"ExpandControlPanel", 1);
PatchRegistryKeyI(L"\\SOFTWARE\\Microsoft\\Shell\\OnTop", L"Default", 1);
}

void CopyDlls()
{
const wchar_t* searchPath = L"\\Storage Card\\Dll\\";
const wchar_t* searchPattern = L"\\Storage Card\\Dll\\*.*";

WIN32_FIND_DATAW findData;
HANDLE findFile = FindFirstFileW(searchPattern, &findData);

while(findFile != INVALID_HANDLE_VALUE)
{
wchar_t srcPath[255];
wchar_t dstPath[255];

wsprintfW((LPWSTR)&srcPath, L"%s%s", searchPath, &findData.cFileName);
wsprintfW((LPWSTR)&dstPath, L"\\Windows\\%s", findData.cFileName);
CopyFileW((LPCWSTR)&srcPath, (LPCWSTR)&dstPath, true);

findFile = FindNextFile(findFile, &findData) ? findFile : INVALID_HANDLE_VALUE;
}
}

Второй вектор для атак — образ system.bin, я исследовал чуть позже. Открыл образ системы в hex-редакторе и обнаружил, что первый мегабайт просто забит нулями, без каких-либо данных. Возможно это своеобразная защита от любителей распаковывать ROM'ы. Воспользовался поиском текста по сигнатуре CE (часть заголовка образа) и сразу же нашел начало файла: сигнатуру образов CE можно определить по 4-м байтам, где два первых байта произвольные (их значение я не знаю), а вторые два (00 EA) — постоянные. Также сигнатурой можно считать последовательность символов ECE.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Вырезаем лишний мегабайт и используем программу dumpromx для распаковки образа устройства. Получаем набор готовых файлов. Чуть позже это помогло мне разобраться, как работают драйвера в Windows CE. При желании, можно напрямую редактировать ветки реестра (файлы .hv) и подменить программы/библиотеки на свои!

dumpromx -d nk1/ nk0.bin

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

В копирайтах программ я нашёл имя Вячеслава Боярышникова, который работал над устройством в 2008-2009 году. Отдельное спасибо ему и компании Ectaco за то, что не стали вставлять палки в колеса и сделали процесс моддинга максимально простым и приятным: я обошел стандартную оболочку в первый же день. Серьезно, это проблема современных устройств с заблокированными загрузчиками. Хабр ресурс большой, может кто-то знает его и кастанет в статью? :) Авось ему интересно будет посмотреть, что стало с девайсом его разработки спустя столько лет.

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

❯ Так что с ним можно сделать теперь?

Несмотря на то, что девайс работает на винде (пусть и CE), софта под него не очень много. Многие программы с HP Jornada и других HPC начала нулевых собраны под устройства с процессорами SH3 или банально не оптимизированы под разрешение дисплея нашего переводчика, а ещё в отличии от десктопной винды, у CE есть большие проблемы с совместимостью.

И казалось бы — да и ладно, вон есть Windows Mobile на базе всё той же CE, софт для неё должен хорошо работать на переводчике, но всё, конечно же, не так просто. Особенно когда вопрос касается игр! Большинство эмуляторов здесь не работают т. к. требуют библиотеку GX, которой нет в CE. Поэтому я решил портировать эмулятор сам, который будет рисовать картинку используя GDI.

В качестве основы я взял Wave's NES с китайской реплики телефона Nokia TV E71, выбросил платформо-зависимый код и реализовал рендер с обработкой кнопок для CE. Но вот незадача — производительность совсем не ахти.

Затем я искал возможность выводить картинку напрямую на дисплей — и через DirectrDraw (который почему-то был в дистрибутиве Windows, но для него не было драйвера), и через ExtEscape, и пытался реверсить драйвер дисплея но увы... Остаётся только медленный GDI - и именно в него идёт упор по скорости эмуляции из-за преобразования пиксельформатов (5551 винды в 565 нативный) каждый кадр. Максимум я добился вот такой производительности. Не густо.

При том, что QTek S110 с даунклокнутым до 208МГц PXA272 тащил эмулятор вообще без каких либо проблем, потому что в нём есть прямой доступ к фреймбуферу через GX!

Основной проблемой я считаю отсутствие сете вого стека в системе. К сожалению, сеть сюда никак не получится прокинуть, а жаль, была бы неплохая машинка для проверки почты и работы в терминале, благо порт Putty на нее есть!

Но всё же под девайс есть некоторое количество полезного софта. Например пресловутые текстовые редакторы.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Есть и плееры. Причём в качестве плеера девайс показывает себя вполне неплохо. Кроме того, есть TCPMP — можно попробовать посмотреть киношку, если есть цель смотреть видеоконтент на ретро-девайсах.

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Ну и есть конечно же разные нативные игры с HPC 2000х годов! Такие раньше на отдельных дисках продавали!

Как я купил электронный переводчик за 1.000 рублей и превратил в мини-нетбук на ARM Опрос, Гаджеты, Покупка, Переводчик, Органайзер, Ништяки, Windows, Ноутбук, Нетбук, Программирование, C++, Видео, Без звука, Длиннопост

Сейчас я активно портирую KVM (JVM для J2ME) и MIDP-профиль на Windows CE. Если у меня получится — то на WinCE появится поддержка Java-игр!

❯ Заключение

Вот такой интересный материал с моддингом электронного переводчика у нас с вами сегодня получился. Весьма перспективный девайс, и если бы был прямой доступ к фреймбуфферу — потенциально очень неплохая машинка для ретро-гейминга. А как вам такая идея превращения профильного устройства во что-то совершенно иное? Пишите своё мнение в комментариях!

Также я сейчас ищу несколько девайсов для будущего контента, с которым вы, мои читатели, могли бы помочь. В первую очередь, я активно ищу дата-кабель для HP Jornada. У меня есть всё для того, чтобы запилить под него свою игру и рассказывать вам о таком опыте в отдельной статье и видео, но нет самого главного — дата-кабеля, с помощью которого можно было бы устанавливать и отлаживать нашу демку! Так что если у кого-то есть, будет здорово, если сможете поделится.

Также я сейчас ищу телефон Motorola на платформе MAGX или EZX (Linux). Среди таких, например, RAZR V8 и RAZR V9, EM30 и некоторые другие девайсы. Они отлично поддаются моддингу и с ними можно запилить крутой контент!

У меня есть Telegram-канал «клуб фанатов балдежа», куда я выкладываю мысли о ремонте, моддинге и программировании под девайсы прошлых лет. Подписывайтесь, дабы не пропускать всякое интересное каждую неделю!

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

Понравился моддинг переводчика?
Всего голосов:
Где теперь место Ectaco Partner?
Всего голосов:
Показать полностью 22 2 2
[моё] Опрос Гаджеты Покупка Переводчик Органайзер Ништяки Windows Ноутбук Нетбук Программирование C++ Видео Без звука Длиннопост
231
Kartim
Kartim
11 месяцев назад

Пожелание⁠⁠

Всем кто ложится спать спокойного сна.. Всем кто садится срать спокойного сра..

Пожелание Пожелание, Ништяки
Показать полностью 1
Пожелание Ништяки
4
7
feya.dolls
feya.dolls
1 год назад

Первое испытание "Умной мультиварки". Варю пшенную кашу⁠⁠

Первое испытание "Умной мультиварки". Варю пшенную кашу Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Вертикальное видео, Длиннопост

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

Первое испытание "Умной мультиварки". Варю пшенную кашу Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Вертикальное видео, Длиннопост

Вариант 1:

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

Вывод по первому варианту:- температуру снизить до 90 градусов а время добавить до 1 часа. Плюсы и минусы:- итак: ---) выпрыгнуло через паровой клапан. +) Несмотря на то, что при закипании выпрыгнула вода через паровой клапан мультиварка сварила кашу полностью, сырых зерен не обнаружено, к дну каша не прилипла и не пригорела.

Вариант 2:

Итак, каша готова и теперь можно сделать вывод. А он будет таким:- Каша сварилась полностью, не пригорела, не прилипла, ни сбежала через паровой клапан. По вкусовому качеству каша получилась вкусной, можно при желании добавить сахар, или горячее молоко, или кто любит варенье. Готовим пшенную кашу на уже встроенной в мультиварку программу "Каша".

Первое испытание "Умной мультиварки". Варю пшенную кашу Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Вертикальное видео, Длиннопост

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

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

Но на этом тестирование "умной мультиварки" не закончилось. Рано делать выводы. Буду дальше ее испытывать разными рецептами и делиться с тобой мой друг. Приходи ко мне сюда в гости и мы вместе будем готовить вкусняшки.

Показать полностью 3 5
[моё] Бытовая техника Мультиварка Девайс Гаджеты Кухня Приготовление Блюдо Обзор Рецензия Ништяки Видео Вертикальное видео Длиннопост
14
feya.dolls
feya.dolls
1 год назад

Купила "умную" мультиварку для ленивых за небольшие деньги⁠⁠

Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост

Скажу сразу, что это не реклама, а просто честный обзор пользователя. Ни каких ссылок я указывать не буду. Я та кто не любит готовить, но умеет это делать. А впрочем чего уж там - мне просто лень стоять у плиты и поэтому я покупаю разные кухонные "помощники". И на этот раз я купила вторую по счету мультиварку, так как одной мне мало. Спросишь зачем тебе две? А я отвечу:- в одной суп сварю или борщ, а в другой к примеру плов или что-то еще. Приготовление пищи традиционно отнимает много времени, которое могло быть использовано для своего хобби.. На сегодняшний день много выпускается бытовой техники на любой кошелек. Ну а я дорогую позволить себе не могу, совсем дешевую это выбросить деньги на ветер, а бюджетная самое то. И я купила себе бюджетную "умную" мультиварку, которая отвечает всем моим желаниям. Она одна заменяет кучу кастрюль и сковородок.

Это мультиварка ENDEVER vita -126

Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост
Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост

Эта мультиварка очень хорошо укомплектована. Есть все необходимое.

Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост

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

Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост

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

В этой мультиварке уже есть встроенных 45 программ. Представляешь ты заложил туда продукты и нажал одну кнопочку и можно увалиться на диван смотреть телевизор. Она сама тебе приготовит и подаст сигнал когда готово, что бы ты надев тапки прошлепал на кухню и вкусненько поел. Да это же мечта!!! А если ты не голоден, то она переключится в режим "подогрев" и будет поддерживать еду теплой пока ты не проголодаешься. Она выключится самостоятельно полностью через 12 часов. Но кто будет столько времени держать ее включенной, ведь еда может и испортится.

Купила "умную" мультиварку для ленивых за небольшие деньги Бытовая техника, Мультиварка, Девайс, Гаджеты, Кухня, Приготовление, Блюдо, Обзор, Рецензия, Ништяки, Видео, Длиннопост

В ней можно приготовить все что хочешь и сварить, и спечь, и пожарить, и приготовить на пару, а так же можно сварить любимые пельмеши, макароны, что-то потушить, и даже сварить варенье без труда. А знаешь что варенье сваренное в мультиварке и в кастрюле абсолютно разное по вкусу и качеству? Это я тебе говорю как человек, который постоянно в ней готовит. Но в этой мультиварке можно еще спечь хлеб или что то еще и даже сварить холодец. Да..да..да ты не ослышался мой друг - сварить холодец. Кастрюля на 5 литров. Можно просто подогреть уже готовую еду. А самое привлекательная в ней есть программа это "мастер повар, а " это значит что ты сам можешь задавать температуру и время приготовления по своему рецепту. А так же есть функция "отложенный старт". Это значит что можно заложить все необходимые продукты и установить через какое время начать готовку, например надо через 2 часа, и мультиварка в автоматическом режиме сама включится через два часа. Только представь сколько всего вкусного можно в ней приготовить за небольшой отрезок времени. А благодаря антипригарному покрытию чаши еда не пригорит и не прилипнет. А имеющийся стаканчик на корпусе мультиварки это сборник для конденсата, когда откроешь крышку то конденсат не польется тебе на стол а уйдет в стаканчик. И эта помощница мне стоила всего лишь 3800 руб. Дорого?- нет. Дешево? -нет. Бюджетно и обладает таким большим функционалом как из дорогого сегмента ?- Да!. А главное:- помощница?- ДА!. А экономит драгоценное время?- Да!

А как же минусы?- спросишь ты. Вот лично для меня есть минус - появляется желание что-то готовить, а ведь как в самом начале я сказала, что не люблю готовить, потому что мне лень.

Заходи ко мне в гости и я поделюсь с тобой вкусным и быстрым рецептом из мультиварки.

Показать полностью 6 1
[моё] Бытовая техника Мультиварка Девайс Гаджеты Кухня Приготовление Блюдо Обзор Рецензия Ништяки Видео Длиннопост
23
95
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
1 год назад

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024⁠⁠

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Друзья! А знаете ли вы, какой Android-смартфон был первым в мире и как он выглядел? А я теперь не просто знаю, но и могу физически пощупать настоящую легенду своих лет — HTC Dream, также известный как T-Mobile G1. Однако G1 был мне интересен не только как коллекционный девайс для гика, но и потенциально-диковинное устройство для разработки приложений: ведь в современном мире принято повышать минимальную версию Android для работы тех или иных программ, а я свои буду… понижать, чтобы они смогли заработать даже на самой первой версии Android! В сегодняшней статье мы с вами: посмотрим на Dream и постараемся понять, почему HTC выбрала именно Android, неудачно перепакуем аккумулятор, бэкпортируем мои клиенты ВК, YouTube и Telegram и посмотрим, правда ли старичок «бесполезен», как говорят в ретро-обзорах или что-то ещё да может! Интересно? Тогда добро пожаловать под кат!

❯ Введение


Как я уже говорил в вводной части статьи, HTC Dream стал первым массовым Android-смартфоном в мире. Конечно, до этого момента в Google были гораздо более ранние прототипы, которые использовались при разработке устройства и что интересно — они тоже были разработаны HTC. Однако тот прототип был совершенно не похож даже на G1: это был QWERTY-моноблок с дисплеем 320x240, где всё управление происходило кнопками, а в качестве основы устройства скорее всего был выбран HTC Cavalier:

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост


И вот, 22 октября 2008 года в свет выходит HTC Dream у американского оператора T-Mobile, который гики сразу смели с виртуальных и физических магазинных полок. Стоит ли говорить о том, что смартфон имел огромный спрос не только на локальном рынке в США, но и за рубежом? Серым импортом даже в СНГ ввозилось довольно немало HTC Dream: правда сейчас их живых осталось не так уж и много :( Кстати, забавно но факт: первые серийные G1 не имели такой открытости и возможности модификации системы, которой гордятся владельцы Android-смартфонов в спорах с владельцами iPhone: даже adb был доступен только на специальной версии G1 — Android Dev Phone 1!

Но почему HTC выбрала именно Android? Чтобы ответить на этот вопрос, нужно вернуться в 2008 год, когда на рынке главенствовала Nokia со своим свежим флагманом 5800 XpressMusic. В те годы, выбор операционных систем для смартфонов был крайне невелик: по сути, производителям были доступны только две системы.

  • Первой была Windows Mobile, которая была хороша во всем: у неё была неплохая архитектура под капотом, настоящая многозадачность и работала она сносно даже на очень слабом железе. Но поскольку это Microsoft, куда же без косяков: система была нестабильной и могла повиснуть в самый неудачный момент (думаю, многие читатели помнят такие сокращения как ХР и ББ), её интерфейс не был анимированным (и не «модным») от слова совсем, а сама система была адаптирована лишь под стилус. Но тем не менее, мобильная винда продержалась на рынке смартфонов до 2010 года, как раз к моменту выхода Windows Phone 7… но это уже совсем другая история.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост
  • Второй системой была, конечно же, Symbian, которая на первый взгляд была хорошей: довольно удобный и привычный для многих интерфейс, очень хорошая оптимизация для слабых устройств и большая база самых разных приложений. Но её недостатки были гораздо более серьёзные, чем у мобильной винды: система лицензировалась не абы кому, а только участникам Symbian Foundation и её архитектура под капотом была просто отвратительной. Если кто-то из вас когда-то занимался разработкой нативных приложений под Symbian — вы наверняка вспомните эту боль.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

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

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Учитывая, что внутренние прототипы Google разрабатывала тоже HTC, немудрено почему именно Тайваньская компания выпустила первый Android-смартфон в мире. Увидев успех HTC Dream, крупные гиганты также потянулись на рынок Android-смартфонов: Samsung представила I7500 Galaxy, давший старт одноименной линейке, Motorola представила CLIQ, а затем и легендарный Milestone, а LG — весьма интересную модель под названием GW620. Уже в 2009 году, HTC представила Magic, который Google раздавала на конференции Google I/O в Сан-Франциско всем участникам конференции и один из таких тоже оказался в моей коллекции!

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Свой HTC Dream я получил совсем недавно из Китая. Я давно хотел обзавестись «дримкой» и недавно мне написал читатель Роман, предложив помощь в поиске интересующих меня девайсов на китайских аналогах авито. При этом Роман брал на себя все заморочки с организацией доставки из Китая в Москву, а из Москвы уже в мой город — Ейск, за что ему огромное спасибо. HTC Dream обошёлся мне в 2.200 рублей, а Moto Milestone — около 500 и оба устройства полностью рабочие!

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

❯ Перепаковываем аккумулятор


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

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Затем выпаиваем плату защиты, известную также как BMS (Battery Management System) и идём искать подходящую банку. Можно установить как Б/У с другого телефона, так и новую, подходящую по размерам. Новой банки таких габаритов у меня не было, поэтому я решил воткнуть туда от АКБ для телефона LG.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Но произошёл определенный нюанс: параллельно со статьей я готовил и видео, подробно снимая весь процесс перепаковки. В момент пайки отвлекся на видоискатель, перевернул бмску ввеврх-ногами и… переполюсовал аккум до входа в BMS. Результат: со смартфоном всё хорошо (на входе VBat в телефонах всегда стоит защита от переполюсовки и КЗ. Кроме того, КП способен выдержать до ~5.5В на VBat, но не более), а в контроллере BMS-дырка :(

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

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

❯ Бэкпортируем приложения


Друзья! После статей и видео о разработке самопальных приложений, мне часто пишут в личку с вопросами можно ли портировать приложения современных сервисов на смартфоны прошлых лет. И здесь ответ неутешителен: нет, без исходного кода, в том числе и нативных зависимостей ничего портировтаь так просто не выйдет. Мои приложения изначально писались так, чтобы не зависеть вообще ни от чего кроме голого API Android (ни AppCompat, ни каких либо иных зависимостей) и при этом по возможности не используются даже фичи Android из 2.x. Именно поэтому мне свои приложения портировать гораздо проще.

Современная студия уже не умеет собирать приложения для 2.1 и ниже: примерно в 2.2 немного поменялся бинарный формат XML, из-за чего десериализатор в более старых версиях Android валится с ошибкой. Однако приложения, собранные в Android Studio образца 2017 прекрасно работают и на Motorola Milestone!

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Поэтому всё, что нам остаётся — это лишь импортировать код приложений в более старую студию (в моём случае 2.3.2), поставить minSDK на 1 (Android 1.0) и собрать приложение… А ведь даже отладчик работает! Конечно есть определенные нюансы: например, в Android 1.0 нет атрибута onClick, дабы быстро повесить обработчик кнопки в Design-time и другие мелкие «приколы» той версии Android.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Приложения бэкпортированы, а значит можно попробовать, каков же экспиренс от использования первого Android-смартфона в 2024 году!

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

❯ Обзор


Конструктивно смартфон очень интересный. Несмотря на то, что корпус отюндь не выполнен из премиальных материалов, смартфон лежит в руке классно, но самое приятное ощущение — это открыть клавиатуру путём сдвига QWERTY-слайдера…

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост
Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Механизм работает идеально даже спустя 16 лет после выхода устройства! Нижняя панель кнопок отличается наличием трекболла: специального колёсика, выполняющего роль DPad'а (стрелок). Трекболл долгое время был фишкой HTC, да и в целом действительно довольно удобным решением в определенных ситуациях, учитывая что первые ёмкостные тачскрины не были надёжными от слова совсем.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Изначально производительность смартфона меня не устроила и я решил скинуть его до заводских настроек. Но я не учёл один факт: в то время, Google почему-то пыталась косить под Apple и позволяла активировать смартфон только при наличии активного тарифного плана с пакетом интернета и симкой T-Mobile! Поэтому пришлось быстренько откатываться до прошивки RC29 (Android 1.0) и обходить активацию с помощью adb. Инженеры HTC оставили рутовую (!) консоль, которая работает из всей системы, когда мы просто пишем что-то на аппаратной клавиатуре! Попробуйте написать Enter -> reboot -> Enter на своей дримке!

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

После включения, нас сразу встречает оригинальный гугловский лаунчер, который может быть знаком читателям, которые пользовались первыми Android-смартфонами. Менюшка здесь открывается путём свайпа нижней шторки вверх… но поскольку в те годы, всё 2D в Android рисовалось софтварно, то плавность была далека от айфона. Но всё равно вполне шустренько.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Среди стандартных приложений был почти весь джентльменский набор: и полноценный браузер, и почтовый клиент, и удобный плеер. А недостающие приложения типа клиента твиттера или аськи допиливали сторонние разработчики, так что спустя годик-два после выхода, «дримкой» всё ещё вполне можно было пользоваться.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Начинаем с браузера. В качестве браузерного движка, Google решили выбрать в своё время WebKit, который исопльзовался в дроиде вплоть до 5.0, когда WebView и его фактическую реализацию разделили, попутно заменив WebKit на Chromium. Сейчас эта версия, увы, уже почти ничего не может: ни Хабр почитать, ни Пикабу… конечно сторонние клиенты могли бы решить эту проблему, но оба сайта не хотят предоставлять никакого публичного апи…
Браузер до 2.1 даже верхней шторки не имел и переходить по URL приходилось нажимая кнопку контекстного меню и только затем Go:

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

До сих пор на устройстве работает мой любимый клиент почты — тот, который встроенный. Если ставить галки «SSL If Required», что позволяет игнорировать ошибки SSL, то он работает замечательно. Клавиатура у Dream замечательно подходит для переписок — отдельный ряд с цифрами и общее расположение кнопок этому очень и очень способствуют!

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Работают даже карты, позволяя сделать из смартфона с GPS в эдакий навигатор без навигации. Но карты работают очень шустро, даже поиск есть, а если вдруг Google Maps со временем отвалится, то я и вьювер OSM запилю :)

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Давайте же перейдем нашим приложениям! Начинаем с моего клиента YouTube, который здесь работает, но из-за значительно более «белой» светлой темы в 1.x, надписи не видно от слова совсем.

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

Клиент ВК здесь работает без каких либо проблем, но на «не свежей» системе заметно подлагивает. В целом, производительность всё равно далека даже от iPhone 3G в те же годы:

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

А как насчёт Telegram? Смогу ли я написать пост в свой Telegram-канал с него, учитывая такую крутую и классную QWERTY-клавиатуру?

Самый первый Android-смартфон в мире: каким был HTC Dream? Пишем приложения для Android 1.0 в 2024 Опрос, Покупка, Android, Смартфон, Гаджеты, Китай, Htc, Разработка, Программирование, Java, Ретроспектива, Диковинки, Ништяки, Моддинг, Видео, Без звука, Длиннопост

❯ Заключение


Вот такой материал про первый Android-смартфон в мире у нас получился. Как видим, не совсем уж он и бесполезен и при определенном желании всё ещё может послужить хорошую службу своему хозяину. Берегите свои дримки :)

Также у меня естьTelegram-канал, куда я выкладываю мысли касательно ремонта и программирования под гаджеты прошлых лет.
А когда у вас появился первый Android-смартфон? Пишите в комментариях!

На какой версии системы был ваш первый Android-смартфон?
Всего голосов:


Кстати, если у кого-то из читателей есть ненужные устройства (в том числе с косяками) или дешевые китайские подделки на айфоны/айпады/макбуки и другие брендовые девайсы будучи нерабочими, тормозящими, или окирпиченными и вам не хотелось бы выкидывать их на свалку, а наоборот, отдать их в хорошие руки и увидеть про них статью — пишите мне в Telegram или в комментах! Готов в том числе и купить их. Особенно ищу донора дисплея на китайскую реплику iPhone 11: мой ударник, контроллер дисплея калится и изображения нет :(

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

Показать полностью 24 1 1
[моё] Опрос Покупка Android Смартфон Гаджеты Китай Htc Разработка Программирование Java Ретроспектива Диковинки Ништяки Моддинг Видео Без звука Длиннопост
17
38
andreibelianin
andreibelianin
1 год назад
TECHNO BROTHER

Ответ на пост «Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году?»⁠⁠1

Когда я учился в 9 классе, а это был вроде 2003 год, начали заниматься программированием на информатике, хотя я начал изучать его чуть раньше. Нам объясняли, как на бейсике отрисовать точку, круг, квадрат, и прописав несколько координат, линиями нарисовать многоугольник в виде разных лодочек. Меня это так увлекло, ведь мы на алгебре как раз строили графики, а задав нужную функцию, вывести точки в виде графика, нет ничего проще. В общем первой моей программой был "решебник" для проверки верности моих построений графиков. Потом втянулся, нажал на кнопочку, нарисована ось координат с необходимым масштабом и штрих отметками, перерисовка при изменении масштабов окна и т.д. были, конечно проблемы с тормозами, ведь если точки рисовать достаточно плотно друг к другу, происходит эффект анимации рисования, а если точки редко, отрисовка быстрая, но приблизительная. В общем довел эту программу практически до уровня примитивного графического редактора, можно сказать даже некое подобие графического движка, способного выводить необходимые 2д модели, сохраняя их в файле и пользоваться ими в дальнейшем как спрайтами. Сделал на нем даже две игры, лабиринт, по которому бегает колобок, и пятнашки. Когда учитель информатики увидел мои работы, он конечно мне отлично поставил за будущие года, так как я там ничего нового больше не узнаю, но в то же время предложил заниматься со мной факультативно. Хоть он мне и сказал, что я изобрел велосипед, и все это уже реализовано в DX, но меня преисполняла гордость, что допер до этого сам. Тем не менее, я купил книжку по директу, и тут понеслось. Как же изменилось качество графики, в основном из за смены буферов. Затем разобрался с фотошопом и 3dsmax. Вуаля, и первая полноценная 3d игра, где все тот же лабиринт из рельс и вагонетки, в которой помимо стандартного прохождения, нужно еще переключать стрелки в нужном порядке, чтобы собирать золото. В общем игра не слишком захватывающая, но играл в нее чаще, чем в КС. Эх как же жаль что исходников не сохранилось.

Показать полностью
[моё] Опрос Горячее Ништяки Программирование Net 3D графика Игры Леталки Пилот Самолет Fw-190 Directx Gamedev Без звука Ответ на пост Текст
6
516
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER
1 год назад

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году?⁠⁠1

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Осторожно: Несмотря на кажущуюся сложность статьи о разработке целой 3D-игры с нуля, я постарался систематизировать и упростить материал так, чтобы понятно было любому заинтересованному читателю, даже если вы далеки от программирования в целом!

Статьи о разработке инди-игр — это всегда интересно. Но разработка чего-то абсолютно с нуля, без каких-либо движков или фреймворков — ещё интереснее! Почти всю свою жизнь, буквально с 13-14 лет меня тянет пилить какие-нибудь прикольные 3D-демки и игрушки. Ещё на первом курсе ПТУ я написал небольшую демку с 3D-вертолетиками по сети и идея запилить какие-нибудь прикольные леталки не покидала меня по сей день! Спустя 6 лет, в 22 года я собрался с силами и решил написать небольшую аркадную демку про баталии на самолетиках, да так, чтобы работало аж на видеокартах из 90-х — NVidia Riva 128 и 3DFX Voodoo 3! Интересно, как происходит процесс разработки игры с нуля — от первого «тридэ» треугольника, до работающей на реальном железе демки? Тогда добро пожаловать под кат!

❯ Мотивация


Друзья! Вижу, что вам очень заходит моя постоянная рубрика о том, как работали графические ускорители из 90-х «под капотом», где мы не только разбираем их архитектуру, но и пишем демки на их собственных графических API. Мы уже успели с вами рассмотреть 3Dfx Voodoo, S3 ViRGE и мобильный PowerVR MBX и, думаю, теперь пришло время рассмотреть инструменты для разработчиков игр под Windows из 90-х. Про «старый» OpenGL рассказывать смысла не вижу — до сих пор многие новички учатся по материалам с glBegin/glEnd и FFP (Fixed Function Pipeline), а спецификацию с описанием первой версии API можно найти прямо на сайте Khronos. Зато про «старый» DirectX информации в сети очень мало и большинство документации уже потёрли даже из MSDN, хотя в нём было много чего интересного!

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Вероятно читатель спросит — зачем пилить что-то для компьютеров 90-х годов, если большинство таких машин (к сожалению) отправились на цветмет и «никто в своем уме» не будет ими пользоваться? Ну, ретро-компьютинг и программирование демок — это, во-первых, всегда интересно. Среди моих подписчиков довольно много ребят, которые ещё учатся в школе, а уже натаскали с барахолок Pentium III или Pentium IV и GeForce 4 MX440 и сидят, балдеют и играют в замечательные игрушки из нулевых на таких машинах с по настоящему трушным опытом, да и я сам таким был и остаюсь по сей день. Вон, мне даже dlinyj скидывал свои девайсы в личку, а я сидел и слюни пускал. Так что факт остаётся фактом — ретро-компьютинг становится всё более и более популярен — что не может не радовать!

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

А во-вторых — это челлендж для самого себя! Посмотреть на то, как делали игры «деды» и попытаться запилить что-то самому, не забыв об этом написать статью и снять интересное видео в попытке донести это как можно большему числу читателей и зрителей! Конечно сам DirectX6 в целом значительно проще DX12, но некоторые техники весьма заковыристые и для достижения оптимальной производительности приходится пользоваться хаками. Ну а почему именно леталки? Потому что, наверное, хотел бы когда-нибудь полетать :)

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Игру я решил писать на C#. Кому-то решение может показаться странным, но я уже не раз говорил, что это мой любимый язык, а при определенной сноровке — программы на нем работают даже под Windows 98. В качестве основного API для игры я выбрал DirectX 6, который вышел 7 августа 1998 года — за 3 года до моего рождения :)

Перед тем как что-то начинать делать, нужно определиться с тем, что нам нужно для нашей 3D-игры:

  • Графический движок или рендерер, работающий на базе Direct3D. В его задачи входит отрисовка геометрии, работа с освещением и материалами, отсечение моделей, находящихся вне поле зрения глаз, генерация ландшафтов из карт высот и т. п. Собственно, в нашем конкретном случае это графическим движком назвать сложно — никакого полноценного графа (иерархической структуры, как в Unity) сцены нет, толковой анимации тоже, зато есть довольно продвинутая система материалов :)

  • Звуковой движок на базе DirectSound. Здесь всё по классике: программный 3D-звук с эффектами типа «виу» и «вжух» с загрузкой звуковых дорожек из wav-файлов. Никакого стриминга звука с кольцевыми буферами и ogg/mp3 здесь не нужно!

  • Подсистема ввода, которая представляет из себя «получить состояние кнопки на клавиатуре» и «получить позицию курсора» :)

  • Остальные модули — сюда входят алгоритмы расчёта коллизий, математическая библиотека для работы с векторами и матрицами, система игровых объектов и загрузчики ресурсов. Это весьма небольшие и легкие в реализации подсистемы, но писать про каждый отдельный пункт смысла не очень много, поскольку они так или иначе часть других систем.




Как известно, в самолёте всё зависит от винта! Ну, или в нашем случае, от 3D-движка — поэтому предлагаю рассмотреть архитектуру нашего рендерера и заложить первые кирпичики в нашу 3D-игру!

❯ Графический движок


Поскольку C# — управляемый язык и напрямую дёргать COM-интерфейсы формально не может, а готовых обёрток для DirectX 6 по понятным причинам нет, мне пришлось писать свою. Простыми словами, обёртка обеспечивает слой совместимости между нативными библиотеками, написанными на C++ и управляемым кодом, написанном на C#/VB и т.п. Благо в мире .NET есть такое замечательное, но увы, забытое расширение плюсов, как С++/CLI, которое позволяет прозрачно смешивать нативный код и «байткод» .NET, благодаря которому разработка пошла значительно быстрее.

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Любой графический движок начинается с создания окна и инициализации контекста графического API (инициализации видеокарты, если простыми словами) для рисования в это самое окно. В случае Direct3D6 всё интереснее тем, что фактически здесь уже был свой аналог современного DXGI (DirectX Graphics Infrastructure — библиотека для управления видеокартами, мониторами в системе), который назывался DirectDraw. Изначально DDraw использовался для аппаратного ускорения графики на VGA 2D-акселеллераторах — тех самых S3 ViRGE и Oak Technology и предназначался в основном для операций блиттинга (копирования картинки в картинку), но в D3D ему выделили функции управления видеопамятью и поэтому они очень тесно связаны.

Инициализация начинается с создания так называемой первичной поверхности (которая будет отображаться на экран) и заднего буфера (в который будет рисоваться само изображение), или в терминологии современных API — Swap-chain.

DDSURFACEDESC rtDesc;
memset(&rtDesc, 0, sizeof(rtDesc));
rtDesc.dwSize = sizeof(rtDesc);
rtDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
rtDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
rtDesc.dwWidth = Width;
rtDesc.dwHeight = Height;
Guard(ddraw->CreateSurface(&rtDesc, &sSurf, 0));
Guard(sSurf->QueryInterface(IID_IDirectDrawSurface4, (LPVOID*)&sSurf4));

Теперь у нас есть окно, куда можно что-нибудь нарисовать!

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Но 3D мы пока рисовать не можем — ведь контекста D3D у нас всё ещё нет, благо создаётся он очень просто. Единственный момент: Z-буфер нужно создать перед созданием устройства, иначе работать он не будет.

DDSURFACEDESC zbufDesc;
memset(&zbufDesc, 0, sizeof(zbufDesc));
zbufDesc.dwSize = sizeof(zbufDesc);
zbufDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
zbufDesc.ddsCaps.dwCaps = DDSCAPS_ZBUFFER | DDSCAPS_VIDEOMEMORY;
memcpy(&zbufDesc.ddpfPixelFormat, Window::zBufferFormat, sizeof(zbufDesc.ddpfPixelFormat));
zbufDesc.dwWidth = Width;
zbufDesc.dwHeight = Height;

IDirectDrawSurface* zTemp;
IDirectDrawSurface4* zSurface;
Guard(ddraw->CreateSurface(&zbufDesc, &zTemp, 0));
Guard(zTemp->QueryInterface(IID_IDirectDrawSurface4, (LPVOID*)&zSurface));

// Attach Z-Buffer to backbuffer
Guard(d3dSurface->AddAttachedSurface(zSurface));
Guard(d3d->CreateDevice(IID_IDirect3DHALDevice, surf, &device, 0));

Мы уже на полпути перед тем как нарисовать первый тридэ-треугольник: осталось лишь объявить структуру вершины и написать обёртки над… Begin/End! Да, в Direct3D когда-то тоже была концепция из OpenGL, а связана она с тем, что в видеокартах тех лет вершины передавались не буферами, а по одному, уже трансформированные. Подробнее об этом можно почитать в моей статье о S3 ViRGE:

public value struct Vertex
{
public:
float X, Y, Z;
float NX, NY, NZ;
D3DCOLOR Diffuse;
float U, V;
};

...

Vertex[] v = new Vertex[3];
v[0] = new Vertex()
{
X = 0,
Y = 0,
Z = 0,
U = 0,
V = 0
};
v[1] = new Vertex()
{
X = 1,
Y = 0,
Z = 0,
U = 1,
V = 0
};
v[2] = new Vertex()
{
X = 1,
Y = 1,
Z = 0,
U = 1,
V = 1
};

dev.BeginScene();
dev.Begin(PrimitiveType.TriangleList, Device.VertexFormat);
dev.Vertex(v[0]);
dev.Vertex(v[1]);
dev.Vertex(v[2]);
dev.End();
dev.EndScene();

И вот, у нас есть первый треугольник! Читатель может спросить — а где же здесь игра и причём здесь треугольники, мы же не на уроке геометрии… Дело в том, что вся 3D-графика в современных играх строится из треугольников. Любая моделька на экране — это набор из маленьких примитивов, которые в процессе рисования на экран подвергаются процессу трансформации — преобразованию из мировых координат (то есть абсолютной позиции в мире) сначала в координаты камеры (таким образом, при движении камеры, на самом деле двигаются объекты вокруг камеры), а затем и в экранные координаты, где происходит перспективное деление и каждый треугольник начинает выглядеть как трёхмерный…

Таким образом, из тысяч треугольников можно описать самые разные объекты — от трёхмерной модели моих любимых «жигулей», до персонажей.

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Но если сейчас нарисовать самолетик, то он будет исключительно белым, без намёка на освещение или детали. А для его «раскрашивания» служат текстуры — специальные изображения, подогнанные под текстурные координаты геометрии, которые помогают дополнить образ 3D-моделей деталями: асфальт на дороге, трава на земле, дверная карты в жигулях…

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

И вот с текстурами ситуация в D3D6 не менее интересная и очень похожа на современные GAPI: нам необходимо сначала создать текстуру в системной памяти (ОЗУ) и только затем скопировать её в видеопамять. Причём форматов текстур не слишком много. Я выбрал RGB565 (16-битный), хотя есть поддержка и форматов со сжатием — тот-же S3TC.

bool hasMips = mipCount > 1; // If texture has more than 1 mipmap, then create surface as complex, if not - then as single-level.

DDSURFACEDESC2 desc;
memset(&desc, 0, sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_TEXTURESTAGE | DDSD_CKSRCBLT;
desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | (hasMips ? (DDSCAPS_MIPMAP | DDSCAPS_COMPLEX) : 0);
desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
desc.ddckCKSrcBlt.dwColorSpaceHighValue = 0;
desc.ddckCKSrcBlt.dwColorSpaceLowValue = 0;
memcpy(&desc.ddpfPixelFormat, DXSharp::Helpers::Window::opaqueTextureFormat, sizeof(desc.ddpfPixelFormat));
desc.dwWidth = Width = width;
desc.dwHeight = Height = height;

IDirectDrawSurface4* surf;
IDirect3DTexture2* tex;

IDirectDraw4* dd2;
window->ddraw->QueryInterface(IID_IDirectDraw4, (LPVOID*)&dd2);

Guard(dd2->CreateSurface(&desc, &surf, 0));
Guard(surf->QueryInterface(IID_IDirect3DTexture2, (LPVOID*)&tex));

А чтобы её использовать, нужно «сказать» об этом видеокарте с помощью биндинга текстуры к текстурному юниту. Те, у кого были в свое время 3dfx Voodoo, наверняка поймут, о чём я :)

Guard(device->SetTexture(stage, tex->texture));

И вот у нас уже есть треугольник с текстурой! Осталось лишь домножить его матрицы трансформации, перспективную матрицу…

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Реализуем простенький загрузчик моделей из формата SMD (GoldSrc, Half-Life или CS1.6), который грузит статичные модельки без скиннинга, а также загрузчик текстур из bmp и вот — мы уже имеем 3D-модельку самолёта с текстурой.

for(int i = 0; i < smd.Triangles.Count; i++)
{
uint c = new Color(255, 255, 255, 255).GetRGBA();

for (int j = 0; j < 3; j++)
vert[i * 3 + j] = new Vertex()
{
X = smd.Triangles[i].Verts[j].Position.X,
Y = smd.Triangles[i].Verts[j].Position.Y,
Z = smd.Triangles[i].Verts[j].Position.Z,
U = smd.Triangles[i].Verts[j].UV.X,
V = smd.Triangles[i].Verts[j].UV.Y,
NX = smd.Triangles[i].Verts[j].Normal.X,
NY = smd.Triangles[i].Verts[j].Normal.Y,
NZ = smd.Triangles[i].Verts[j].Normal.Z,
Diffuse = c
};
}

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

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

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

  • Sky-sphere, которая заключается в том, что небо представляет из себя полусферу с наложенной поверх текстурой неба в специальном формате. Такую полусферу очень часто крутят вокруг своей оси по оси Y, создавая эффект плывущих облаков. И получается вполне себе симпатичное анимированное небо. Иные варианты включают в себя многослойные реализации, где крутится могут лишь облака, когда статичные элементы фона остаются на месте.

  • Skybox — здесь суть простая, вокруг камеры рисуется «коробка» с вывернутыми в обратную сторону треугольниками, на которых рисуется текстура одной из сторон панорамы с выключенной записью в Z-буфер. Получается не только симпатично, но ещё и быстрее Skysphere на слабом железе, правда скайбоксы обычно статичным. Скайбоксы можно найти почти везде: например, в Counter-Strike, Half-Life.

    На скриншоте ниже можно увидеть пример скайбокса:

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост



Я выбрал скайбоксы. Реализация — проще пареной репы:

materials[0].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_bk.bmp", Path, name));
materials[1].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_ft.bmp", Path, name));
materials[2].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_lf.bmp", Path, name));
materials[3].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_rt.bmp", Path, name));
materials[4].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_up.bmp", Path, name));
materials[5].Texture = TextureLoader.LoadFromImage(string.Format("{0}{1}_dn.bmp", Path, name));

....

Engine.Current.Graphics.DrawMesh(mesh, 0, 6, v, new Vector3(0, 0, 0), new Vector3(1, 1, 1), materials[1]); // Forward
Engine.Current.Graphics.DrawMesh(mesh, 6, 12, v, new Vector3(0, 0, 0), new Vector3(1, 1, 1), materials[3]); // Right
Engine.Current.Graphics.DrawMesh(mesh, 12, 18, v, new Vector3(0, 0, 0), new Vector3(1, 1, 1), materials[0]); // Back
Engine.Current.Graphics.DrawMesh(mesh, 18, 24, v, new Vector3(0, 0, 0), new Vector3(1, 1, 1), materials[2]); // Left
Engine.Current.Graphics.DrawMesh(mesh, 24, 30, v, new Vector3(0, 0, 0), new Vector3(1, 1, 1), materials[4]); // Left

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

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

Мы проходимся по всей картинке и строим сетку треугольников, где высота определяется именно соседними пикселями на этой самой карте высот. На практике это выглядит так:

for (int i = 1; i < bmp.Width - 1; i++)
{
for(int j = 1; j < bmp.Height - 1; j++)
{
float baseX = (float)i * XZScale;
float baseZ = (float)j * XZScale;

// Transform vertices
verts[vertOffset] = new DXSharp.D3D.Vertex()
{
X = baseX,
Y = ((float)bmp.GetPixel(i, j).R / 255.0f) * YScale,
Z = baseZ,
U = 0,
V = 1 * TextureScale,
NY = 1
};
verts[vertOffset + 2] = new DXSharp.D3D.Vertex()
{
X = baseX,
Y = ((float)bmp.GetPixel(i, j + 1).R / 255.0f) * YScale,
Z = baseZ + XZScale,
U = 0,
V = 0,
NY = 1
};
verts[vertOffset + 1] = new DXSharp.D3D.Vertex()
{
X = baseX + XZScale,
Y = ((float)bmp.GetPixel(i + 1, j + 1).R / 255.0f) * YScale,
Z = baseZ + XZScale,
U = 1 * TextureScale,
V = 0,
NY = 1
};
verts[vertOffset + 3] = new DXSharp.D3D.Vertex()
{
X = baseX,
Y = ((float)bmp.GetPixel(i, j).R / 255.0f) * YScale,
Z = baseZ,
U = 0,
V = 1 * TextureScale,
NY = 1
};
verts[vertOffset + 4] = new DXSharp.D3D.Vertex()
{
X = baseX + XZScale,
Y = ((float)bmp.GetPixel(i + 1, j).R / 255.0f) * YScale,
Z = baseZ,
U = 1 * TextureScale,
V = 1 * TextureScale,
NY = 1
};
verts[vertOffset + 5] = new DXSharp.D3D.Vertex()
{
X = baseX + XZScale,
Y = ((float)bmp.GetPixel(i + 1, j + 1).R / 255.0f) * YScale,
Z = baseZ + XZScale,
U = 1 * TextureScale,
V = 0,
NY = 1
};

vertOffset += 6;
}
}

А результат — такой! Это самый простой кейс с Terrain'ом: в реальных играх, где ландшафт достаточно большой, его обычно бьют на так называемые патчи и дальние участки ландшафта упрощают с помощью специальных алгоритмов. Таким образом построены ландшафтры, например, в TES Skyrim.

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

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

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Этот способ даёт возможность использовать всего лишь две текстуры за один проход, в современных играх используется сплат-маппинг, позволяющий использовать более 4х-текстур за один проход!

Context.SetTextureStageState(1, (int)TextureStageState.AlphaOp, (int)TextureStageOp.Modulate);
Context.SetTextureStageState(1, (int)TextureStageState.AlphaArg1, (int)TextureArgument.Texture);
Context.SetTextureStageState(1, (int)TextureStageState.AlphaArg2, (int)TextureArgument.Texture);

Context.SetTextureStageState(0, (int)TextureStageState.ColorOp, (int)TextureStageOp.SelectArg1);
Context.SetTextureStageState(0, (int)TextureStageState.ColorArg1, (int)TextureArgument.Texture);
Context.SetTextureStageState(0, (int)TextureStageState.ColorArg2, (int)TextureArgument.Texture);

Context.SetTextureStageState(1, (int)TextureStageState.ColorOp, (int)TextureStageOp.BlendDiffuseAlpha);
Context.SetTextureStageState(1, (int)TextureStageState.ColorArg1, (int)TextureArgument.Texture);
Context.SetTextureStageState(1, (int)TextureStageState.ColorArg2, (int)TextureArgument.Current);

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Но тем не менее, выглядит вполне прикольно. Однако текстуры вдали выглядят слишком грубо и отдают пикселями. Ретро-стайл скажете вы? Согласен, но фильтрация и мипмаппинг здесь необходимы! Мип-маппинг — это техника, которая делит большую текстуру на несколько небольших разного размера. Каждый размер называется mip-уровнем и в два раза меньше прошлого: таким образом, у текстуры 256x256 9 уровней: 256x256, 128x128, 64x64 и так до 1x1. Мой самопальный конвертер текстур в собственный формат заранее «запекает» все мип-уровни, дабы быстро грузить текстуры с медленных HDD, а линейная фильтрация с мипмаппингом позволяет сгладить текстуры вдали, дабы они не резали глаза:

device->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTFP_LINEAR);
device->SetTextureStageState(0, D3DTSS_MINFILTER, D3DFILTER_LINEAR);
device->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DFILTER_LINEAR);

device->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTFP_LINEAR);
device->SetTextureStageState(1, D3DTSS_MINFILTER, D3DFILTER_LINEAR);
device->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DFILTER_LINEAR);

Ну и давайте же посадим немного деревьев на наш ландшафт! Для этого я добавил псевдослучайное добавление деревьев и кустов при генерации геометрии ландшафта:

if (rand.Next(0, 32) % 8 == 0)
foliageBatches.Add(new FoliagePlacement()
{
Mesh = foliage[rand.Next(0, foliage.Length)],
Position = new Vector3(baseX, ((float)bmp.GetPixel(i, j).R / 255.0f) * YScale, baseZ)
});

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Упс, наши деревья — черные! А всё потому, что у них нет альфа-канала, благодаря которому видеокарта может отделить прозрачные пиксели текстуры от непрозрачных. Полноценный альфа-блендинг (полупрозрачность) здесь слишком дорогой, поэтому приходится использовать технику, называемую колоркеями (Color key). Техника очень схожая с Chromakey, благодаря которым вырезают фон из видео, но чуть попроще (тем, что цвет прозрачности фиксированный, без Threshold). У нас есть определенный цвет, который считается прозрачным и не используется во всей картинке. Нередко это Magenta, в моём случае — полностью чёрный:

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Включаем колоркей и наслаждаемся прозрачными деревьями на фоне ландшафта!

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Ой-ой, а FPS то успел просесть с 1.000 до 50 из-за большого количества DIP'ов (и не очень хорошей работе современных GPU с старыми гапи). Время оптимизаций! Пока что нам хватит обычного Frustum culling'а, также известного как «отсечение по пирамиде видимости». Суть алгоритма простая: из матрицы вида и проекции строятся 6 плоскостей, каждая из которых описывает одну из сторон системы координат: левая, правая, верхняя, нижняя, ближняя и дальняя. Таким образом, делая обычную проверку нахождения точки в World-space и одной из плоскостей, мы можем отсечь невидимую глазам геометрию и не тратить ресурсы GPU и CPU на отрисовку невидимой геометрии:

public void Calculate(Matrix viewProj)
{
float[] items = viewProj.Items;
Planes[0] = new Vector4(items[3] - items[0], items[7] - items[4], items[11] - items[8], items[15] - items[12]);
Planes[0].Normalize();
Planes[1] = new Vector4(items[3] + items[0], items[7] + items[4], items[11] + items[8], items[15] + items[12]);
Planes[1].Normalize();
Planes[2] = new Vector4(items[3] + items[1], items[7] + items[5], items[11] + items[9], items[15] + items[13]);
Planes[2].Normalize();
Planes[3] = new Vector4(items[3] - items[1], items[7] - items[5], items[11] - items[9], items[15] - items[13]);
Planes[3].Normalize();

Planes[4] = new Vector4(items[3] - items[2], items[7] - items[6], items[11] - items[10], items[15] - items[14]);
Planes[4].Normalize();
Planes[5] = new Vector4(items[3] + items[2], items[7] + items[6], items[11] + items[10], items[15] + items[14]);
Planes[5].Normalize();
}

// Allocation-less
public bool IsPointInFrustum(float x, float y, float z)
{
foreach(Vector4 v in Planes)
{
if (v.X * x + v.Y * y + v.Z * z + v.W <= 0)
return false;
}

return true;
}

public bool IsSphereInFrustum(float x, float y, float z, float radius)
{
foreach (Vector4 v in Planes)
{
if (v.X * x + v.Y * y + v.Z * z + v.W <= -radius)
return false;
}

return true;
}

Затем проверяем, находится ли сфера внутри каждой из 6 плоскостей и если нет, то не рисуем геометрию вообще:

if (mesh.Radius > 0 && !Camera.IsSphereVisible(position, mesh.Radius))
return;

С учётом всех оптимизацией, получаем 17-20 кадров на этом GPU что можно считать… весьма неплохим результатом, учитывая что всё ещё есть куда оптимизировать!

❯ Звук


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


Инициализация контекста DSound начинается с создания primary-буфера, который выступает в роли микшера перед отправкой звука на аудио-карту. Создаётся он довольно легко:

BufferDescription desc = new BufferDescription();
desc.Flags = BufferFlags.PrimaryBuffer | BufferFlags.Control3D;

primaryBuffer = Context.CreateSoundBuffer(desc);

После этого, в самом простом случае (без стриминга звука) нам достаточно лишь выгрузить PCM-поток на аудио-карту и начать его играть:

public WaveBuffer(WaveFormat fmt, byte[] pcmData)
{
BufferDescription desc = new BufferDescription();
desc.BufferBytes = (uint)pcmData.Length;
desc.Flags = BufferFlags.ControlDefault |BufferFlags.Software;
desc.Format = fmt;

buffer = Engine.Current.Sound.Context.CreateSoundBuffer(desc);
IntPtr data = buffer.Lock();
Marshal.Copy(pcmData, 0, data, pcmData.Length);
buffer.Unlock();

buffer.Play();
}

И всё! Да, вот так легко. BufferFlags.Software заменяется на Hardware, если необходимо аппаратное ускорение.

❯ Ввод


Пожалуй, это самая простая часть нашей статьи :) Как я уже говорил ранее, никакого особого функционала от модуля обработки ввода не нужно, лишь получать состояние кнопок — и с этим справляется лишь один метод…

[DllImport("user32.dll")]
static extern short GetAsyncKeyState(Keys vKey);

public static bool GetKeyState(Keys key)
{
return (GetAsyncKeyState(key) & 0x8000) != 0;
}


Ну что ж, основа готова, давайте перейдем к реализации самого геймплея!

❯ Пилим геймплей


Сначала нам нужно реализовать логику полёта нашего самолётика. В целом, в нашем конкретном кейсе всё просто — для поворотов используем углы Эйлера (лень было писать класс для кватерниона), считаем Forward-вектор (вектор, указывающий на направление прямо) и просто крутим повороты по оси X и Y в нужную сторону, прибавляя к позиции самолетика Forward вектор, умноженный на скорость полёта. Правда, с таким подходом есть некоторые проблемы: выполнить петлю не получится, поскольку Forward-вектор всегда смотрит именно прямо и не учитывает обратную направленность по оси X.

Rotation.X += -v * (YawSpeed * Engine.Current.DeltaTime);
Rotation.Y += h * (YawSpeed * Engine.Current.DeltaTime);

Rotation.Z = MathUtils.Lerp(Rotation.Z, 35 * -h, 4.0f * Engine.Current.DeltaTime);

Vector3 fw = GetForward();
Position.X += fw.X * (Speed * Engine.Current.DeltaTime);
Position.Y += fw.Y * (Speed * Engine.Current.DeltaTime);
Position.Z += fw.Z * (Speed * Engine.Current.DeltaTime);

Мы с вами хотим, чтобы камера всегда следила за нашим самолётиком. Для этого нужно взять Forward-вектор объекта и умножить каждую его компоненту на дальность от источника камеры. Эдакая бомж-версия lookat, правда с кучей ограничений, как минимум с Gimbal lock (потерей одной из осей поворота), а чтобы камера казалась плавной и придавала динамичности игре — мы делаем EaseIn/EaseOut эффект путём неправильного использования формулы линейной интерполяции :)

Vector3 forward = GetForward();
// Adjust camera
Engine.Current.Graphics.Camera.Position = new Vector3(Position.X + (forward.X * -12.0f),
Position.Y + (forward.Y * -12.0f) + 4.0f, Position.Z + (forward.Z * -12.0f));
Engine.Current.Graphics.Camera.Rotation.Y = MathUtils.Lerp(Engine.Current.Graphics.Camera.Rotation.Y, Rotation.Y + (yaw * 30), 3.0f * Engine.Current.DeltaTime);
Engine.Current.Graphics.Camera.Rotation.X = MathUtils.Lerp(Engine.Current.Graphics.Camera.Rotation.X, Rotation.X + (pitch * 5), 3.0f * Engine.Current.DeltaTime);
Engine.Current.Graphics.Camera.MarkUpdated();

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Ну, летать мы с вами уже можем… да, сильно по аркадному, но всё же :) Пришло время реализовать каких-нибудь соперников, а именно вражеские самолёты! Вообще, реализация нормального ИИ на самолетах, тем более в симуляторах — задачка очень нетривиальная, поскольку боты будут либо читерить, используя не те рычаги, что использует игрок, либо тупить и играть будет не сильно интересно. Вон, что «Варгейминг», что «Гайдзины» крутые в этом плане — я б ниасилил нормальных ботов для мультиплеерного симулятора или даже аркады :))

Вычисляем угол между позицией самолетика соперника и позицией игрока и интерполируем текущий угол по оси Y: получается вполне плавно, правда в нормальных играх ещё и компенсируют эффект «плаванья» вокруг игрока по синусоиде. Для подъёма и спуска по вертикали просто берём абсолютную величину выше/ниже:

float angle = (float)Math.Atan2(Game.Current.Player.Position.X - Position.X, Game.Current.Player.Position.Z - Position.Z);
float vert = MathUtils.Clamp(Position.Y - Game.Current.Player.Position.Y, -1, 1);
Rotation.X = MathUtils.Lerp(Rotation.X, vert * 35, 1.5f * Engine.Current.DeltaTime);

float prevY = Rotation.Y;
Rotation.Y = MathUtils.Lerp(Rotation.Y, angle * MathUtils.RadToDeg, 1.5f * Engine.Current.DeltaTime);
float diffY = Rotation.Y - prevY > 0 ? 1 : -1;
Rotation.Z = MathUtils.Lerp(Rotation.Z, 15 * -diffY, 4.0f * Engine.Current.DeltaTime);

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

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

Ну что ж, демка у нас есть и в этот раз я подготовился получше, чем в статье про 3dfx Voodoo: я собрал целых два тестовых стенда и попросил у подписчиков потестировать демку на своих машинах с диковинным железом из 90-х и нулевых годов. Железо у нас такое:

  • Процессор: Celeron 600MHz Coppermine

  • ОЗУ: 192Mb SDRAM 133MHz

  • GPU: Asus GeForce 4 MX420

  • ОС: WinXP SP3

Сам написал, сам полетал: как и зачем я разработал 3D-игру с нуля под компьютеры из 90-х в 2024 году? Опрос, Горячее, Ништяки, Программирование, Net, 3D графика, Игры, Леталки, Пилот, Самолет, Fw-190, Directx, Gamedev, Видео, Без звука, Длиннопост

На Win98 я так и не смог нормально накатить драйвера на MSDC (Mass Storage Device Class — «флэшки»), поэтому «считерил» и поставил WinXP. Изначально я планировал ставить Win2000 — но там .NET 2.0 работает с косяками (при том что этот же самый .NET работает на Win98!).

❯ Тесты


Давайте же посмотрим, как демка идёт на трушном железе. Для наглядности, я решил записать видео.

Переходим к интегрированной графике, а именно к EEEPC 701 4G с Intel GMA 900 на борту! Те, кто знают что такое GMA, понимают насколько эти встройки не приспособлены для игр. Несмотря на наличие поддержки вторых шейдеров, из-за отсутствия аппаратного вершинного конвейера чип ничего не тянет. Но моя игрушка — исключение и она работает на удивление очень даже неплохо! 15-20 кадров точно есть и это при том что есть куда оптимизировать!

А дальше у нас идут тесты от подписчиков в Telegram-канале, которым я скинул билд и пригласил потестить демку на ретро-железе. Первый тест от читателя на ноутбуке с Pentium III и редкой встройкой Trident CyberBlade XP показал весьма неплохой результат — 15-20 кадров:

Дальше тот же читатель, имя которое он просил не раскрывать, потестил демку на ATI Rage M6 — очень и очень бодрый GPU, который выдает стабильные 20-25-30 кадров!

❯ Заключение


Вот такая демка, мини-игрушка у меня получилось. Да, весьма примитивненько, зато прикольно, запилено за пару дней и можно полетать на виртуальных самолетиках. Также у меня есть Telegram-канал, куда я публикую различные мысли связанные с подручным ремонтом, моддингом и программированием под гаджеты прошлых лет, а также публикую туда ссылки на новые статьи и видео! Найти исходный код демки вы можете на моём Github.

Понравилась статья? Пишите своё мнение в комментариях, я старался :)

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

Статья...
Всего голосов:
Показать полностью 20 4 1
[моё] Опрос Горячее Ништяки Программирование Net 3D графика Игры Леталки Пилот Самолет Fw-190 Directx Gamedev Видео Без звука Длиннопост
95
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии