Как запустить игру на виртуальной машине
1
1
3,291 | уникальных посетителей |
28 | добавили в избранное |
Данный способ 100% работоспособен, но в состоянии вынести мозг не подготовленному человеку или человеку не имевшего дел с виртуальными машинами. Руководство создано мною лично и мною же и протестировано. Постараюсь как можно популярнее описать процесс создания виртуальной машины. Если вы в состоянии выполнить пошаговую инструкцию, имеете железные нервы, уверенность в своих силах и готовы потратить около 30 минут,то приступайте=)
- Прямые руки (если их нет помочь ничем не могу)
- Виртуальная машина VirtualBOX [www.virtualbox.org]
- Дистрибутив windows xp [nnm-club.me] (либо любой другой)
Вы все скачали и убедились в своих прямых руках?Тогда продолжаем=)
Прежде всего, нужно установить утилиту VirtualBox. Во время установки важно отметить такие опции:
Также будут установлены системные устройства. Соответствующие запросы на установку нужно разрешить.
Когда установка будет завершена, запускаем утилиту и нажимаем на кнопку Создать:
Должен запустится Мастер создания новой виртуальной машины:
Нажимаем Далее. Указываем имя и тип новой виртуальной машины(Имя любое,тип в нашем сучае это хр):
Нажимаем Далее. Задаем объем оперативной памяти виртуальной машины. При ее запуске он автоматически будет выделятся из оперативной памяти. Я выделил 2 гига,минимум для хр 512мб:
Переходим на следующее окно. Поскольку, виртуального жесткого диска у нас нет, то нужно создать новый:
Нажимаем Далее:
Выбираем тип виртуального жесткого диска. Я рекомендую Динамически расширяющийся образ:
Нажимаем Далее и указываем имя, желаемый объем виртуального жесткого диска, а также где файл с его содержимым будет расположен(иконка папки рядом с названием):
Нажимаем Далее и два раза Готово:
Вот и все. Виртуальная машина создана. Теперь можно переходить к ее настройке.
Выбираете в окне VirtualBox созданную виртуальную машину и нажимаете на кнопку Свойства:
Далее если вы не понимаете в виртуальных машинах выставляйте все,как на скриншотах!(исключение может быть ТОЛЬКО в объеме оперативной памяти!)
Начнем с вкладки Система:
Вкладка Дисплей:
Вкладка Носители:
Вкладка Аудио:
Вкладка Сеть:
Вкладка Интерфейс пользователя:
Поскольку толку от Windows XP на виртуальной машине без возможности работы с файлами на основной нет, нужно организовать общий доступ к определенным папкам на винчестере.
Перейти во вкладку Общие папки:
Щелкаем мышкой на значке с плюсиком и выбираем папку или диск на винчестере вашего компьютера, с которой будет работать Windows XP на виртуальной машине:(укажите папку или диск где установлен Steam!)
Вводим ее название и нажимаем ОК. Вот она и появилась в списке:
Виртуальная машина настроена!
Остался последний совсем маленький штрих. Нужно как-то установить Windows XP 🙂
Переходим на вкладку Носители:
Выбираем виртуальный дисковод в левом столбце, нажимаем иконку диска в правом, указываем на образ,который скачали ранее
Щелкаем ОК. Теперь можно переходить к установке Windows XP.
Запускаем виртуальную машину:
Должна запустится обычная установка Windows XP:
Подробно ее описывать не буду. Драйвера в этом случае не нужны, все необходимое уже содержится в составе Windows XP.
После установки получим работающую Windows XP в виртуальной машине. Теперь нужно установить Дополнения гостевой ОС. Для этого перезапустите виртуальную машину в безопасном режиме.(выключаете ОС,включаете и нажимаете f8,выбираете пункт безопасный режим,в общем так же,как с обычным компом=))
Запустив виртуальную машину в безопасном режиме выбирите пункт устройства в верхней вкладке:
Важное замечание: поскольку клавиатура и мышка в ноутбуке или в компьютере зачастую одна, то основная операционная система и операционная система, которая запущена в виртуальной машине вынуждены как-то ее делить. Для этого используется механизм захвата. Иными словами, если на переднем плане виртуальная машина, то все, что вводится с клавиатуры будет адресоваться ей. Можно и вручную переключать. Для этого по-умолчанию используется правый Ctrl. Когда виртуальная машина работает с клавиатурой и мышкой, то горит зеленая стрелочка в нижнем правом угле окна с виртуальной машиной.
Должна начаться установка дополнений для гостевой ОС:
Возможные вопросы: если установка у вас не началась, то вручную добавьте образ VBoxGuestAdditions.iso в папке с VirtualBox в виртуальный привод как это делалось при установке Windows XP, а потом запустите диск в виртуальной машине.
Ставим галочку возле Direct3D Support:
При установке могут несколько раз появятся подобные предупреждения:
Нажимаем Все равно продолжить. После установки желательно перезагрузить виртуальную машину:
Теперь осталось еще разобраться с общими папками. В Windows XP запускаем Командную строку:
Подключаем созданную ранее общую папку как сетевой диск. Для этого вводим команду net use x: \\vboxsvr\Documents (Documents здесь название общей папки,которую мы ранее создавали):
В Моем компьютере появился диск x:\, который мы только что подключили:
Содержимое этого диска соответствует содержимому общей папки, которую мы раньше создавали.
На этомс установкой виртуальной машины все.
Вот и научил я вас всех гадостям коих не все сисадмины знают=))
А если серьезно,то все что осталось это:
Тестируем игры в виртуальной машине VMware Workstation 15 Pro — наконец-то в «виртуалке» можно поиграть
Не знаю как у вас, а у меня есть набор любимых игр, которые постоянно установлены на моем ПК, даже если я в них давно не играл. Это Heroes of Might and Magic III и V, Disciples II: Dark Prophecy, Sid Meier’s Civilization V, Age of Empires II и многие другие хиты прошлых лет. Я писал о таких играх в блогах «10 великолепных игр — я перепрохожу их снова и снова уже более 10 лет».
реклама
Не все из этих игр запускаются после переустановки Windows, некоторые не идут под Windows 10, как например, стратегия Majesty 2. А если вы ищете редкую игру 10-20 летней давности, которую уже нельзя купить, высок и шанс нахватать вирусов. Да даже при установке этих лицензионных игр с диска, защищенного системой StarForce, можно получить кучу проблем на новых версиях Windows.
реклама
У меня бывало и такое, что после установки древней игры Windows настолько повреждалась и глючила, что оставалось только переустанавливать ее.
Теперь, я думаю, вы поймете мое желание засунуть кучу старых игр в виртуальную машину, что решит сразу множество проблем.
Плюсы игровой виртуальной машины
Во-первых, можно создать виртуальные машины с нужной версией Windows: 7, XP и даже 98. И игра пойдет в нужной ей версии Windows без проблем.
реклама
Во-вторых, вы не будете замусоривать основную Windows и избежите вирусного заражения. Если старые игры что и заразят, то это ОС виртуальной машины.
В-третьих, ваша виртуальная машина будет независима от основной ОС и вам не придется переустанавливать и настраивать игры после переустановки Windows.
Я давно следил за развитием виртуальных машин VMware Workstation и помню даже момент, когда у них появилось простейшее 3D ускорение. Тогда это казалось прорывом, но было не играбельно для большинства игр.
Время шло, проект развивался и сегодня версия VMware Workstation 15.5.6 Pro поддерживает API DirectX 10.1, что позволяет запустить множество замечательных игр.
реклама
А теперь я опишу пошагово, как создать игровую виртуальную машину.
Создание виртуальной машины
После запуска VMware Workstation 15.5.6 Pro вас ждет окно с предложением создать виртуальную машину.
Выбирайте «Создать новую виртуальную машину».
Обычного типа конфигурации будет достаточно.
Выбираем местоположение виртуальной машины.
Указываем место с образом ОС. Я буду ставить Windows 7.
Диска в 60 Гб будет пока достаточно.
Приступаем к настройке конфигурации виртуальной машины. Я для начала выделил ей 8 Гб ОЗУ из 32 имеющихся и два потока из 12-ти своего Ryzen 5 1600.
Видеопамяти можно выделить аж 3 Гб.
Нажимаем «Готово» и виртуальная машина создается.
Установка Windows 7
Автоматически начинается установка Windows 7 из указанного образа.Я создал виртуальную машину на SSD диске, что очень настоятельно вам рекомендую. Установка Windows 7 происходит очень быстро.
Основной ПК загружен во время установки не сильно. Но ОЗУ уже тратится прилично.
Windows 7 установлен и в простое почти не «напрягает» процессор.
Папка с виртуальной машиной весит 19.3 Гб.
Настройка и тесты
Я сразу посмотрел через dxdiag свойства графики. Версия «DirectX 11» внушила надежду, но запуск 3DMark 11 все расставил по местам.
С включенным Aero при перемещении и развертывании окон ощущалась какая-то задержка. Включение упрощенного стиля решило эту проблему.
Проблема с окнами озадачила меня я и решил посмотреть, какую задержку дает система в целом, программой LatencyMon.
Мониторинг за минуту. В целом — вполне терпимо.
Для мониторинга FPS и снятия скриншотов я установил MSI Afterburner.
К сожалению, разогнать видеокарту VMware SVGA 3D не получится.
Оценить графическую производительность я решил с помощью 3DMark Vantage, рассчитанного как раз на системы с DirectX 10.
3DMark Vantage будет запускаться с пресетом High.
Результаты очень неплохие.
Это уровень производительности процессора AMD FX-8350 с видеокартой GeForce GTX 1060. А наша виртуалка крутится, напомню, на одном ядре Ryzen 5 1600!
Тесты в играх
Игры я подобрал учитывая требования DirectX 10 и небольшого размера на диске.
Первым под руку попался Portal.
Игра выдает 300 кадров. Играется нормально, но иногда проскакиваю фризы, которые почти целиком убираются фиксацией кадровой частоты на 60.
Очень удивил факт отсутствия «тиринга».
Sid Meier’s Civilization V идет гладко, неотличимо от настоящего ПК.
Стратегия про викингов Northgard тоже отлично играется.
Добавляем еще два потока процессору и тестируем дальше
После успешных тестов игр я решил добавить виртуальной машине процессорной мощи. Я добавил еще одно ядро Ryzen 5 1600, получив аналог Core i3-2100, два ядра и четыре потока. Перетест в 3DMark Vantage дает уже более 30000 очков.
Это уровень производительности Core i5-3570K и GeForce GTX 1060. Очень недурно, но учтите, что мой Ryzen 5 1600 работает на 4000 МГц, а память разогнана до 3400 МГц с настройкой всех таймингов.
После этого мне стало интересно протестировать процессорную производительность в AIDA64.
Сведения о системе, обратите внимание на название чипсета.
Тест кеша и памяти выдает вот такие результаты. Латентность отличная для виртуальной машины.
Очень высокий результат в тесте CPU PhotoWorxx.
Итоги
Результаты получились обнадеживающими. Теперь вполне можно создать виртуальную машину, наполнить ее кучей игр и держать обособленно от основной системы. Учитывая возможность создания «слепков» виртуальной машины, можно держать ее в «свежеустановленном» состоянии в «облаке». И даже если произойдет какой-нибудь сбой, восстановить ее можно будет за пару часов.
Очень порадовала производительность VMware Workstation 15.5.6 Pro даже на моем, не особо мощном процессоре. А на Ryzen 7 3700X, к примеру, и с более мощной видеокартой, все будет просто «летать».
Запуск старых программ и игр на Windows 7, 8. Виртуальная машина
Время неумолимо бежит вперед и, рано или поздно, те или иные программы, игры устаревают. Операционные системы, в которых они работали, так же массово начинают заменяться на более новые.
А как быть тем, кто хочет вспомнить молодость, или ему просто по работе необходима та или иная программа или игра, которая отказывается работать в новомодной Windows 8?
В этой статье хотелось бы рассмотреть запуск старых программ и игр на новых компьютерах. Рассмотрим несколько способов, в том числе и виртуальные машины, которые позволяют запустить практически любое приложение!
1. Эмуляторы игровых приставок
Пожалуй, первое слово в этой статье должно остаться за эмуляторами игровых приставок (Sega, Dendy, Sony PS). Эти приставки появились в 90-х и сразу же получили бешеную популярность. В них играло от мала до велика в любое время года и суток!
К 2000-ным годам ажиотаж спал, стали появляться компьютеры и об них как-то все подзабыли. А ведь в эти приставочные игры можно играть и на компьютере, скачав специальную программу — эмулятор. Затем скачать игру и открыть ее в этом эмуляторе. Все достаточно просто.
Dendy
Наверное, в танчики и Марио играли все, кто вообще играл в Денди. А уж эту приставку и картриджи к ней продавали почти на «каждом углу».
Sega
Еще одна популярнейшая приставка в России, в конце 90-х годов. Конечно, она была не так популярна, как Денди, однако, про Соника и Мортал Комбат 3 слышали, наверное, тоже многие.
Sony PS
Эта приставка, пожалуй, была третья на постсоветском пространстве по популярности. На ней есть много хороших игр, но выделить явных лидеров сложновато. Возможно, «Война свиней», или драки в стиле «Tekken»?
Кстати! В сети полно эмуляторов и для других игровых приставок. Целью этого небольшого превью для этой статьи было показать, что в приставочные игры на компьютере играть можно!
А теперь перейдем с приставочных игр на компьютерные игры и программы…
2. Запуск при помощи средств совместимости ОС Windows
Если программа или игра отказалась запускаться или ведет себя нестабильно, можно попробовать ее запустить в режиме совместимости с определенной ОС. Благо, что сами разработчики встроили данную возможность в Windows.
П равда, за все время использования, наверное, этот способ меня выручил от силы пару раз из нескольких сотен запусков проблемных приложений! Поэтому, попробовать его стоит, но верить в 100% успех — нельзя.
1) Щелкаем правой кнопкой по нужному исполняемому файлу программы и выбираем свойства. Кстати, можно щелкнуть и по значку на рабочем столе (т.е. ярлыку). Эффект тот же.
Далее переходим в раздел совместимости. См. скриншот ниже.
2) Теперь поставьте галочку напротив пункта «режима совместимости» и выберите ОС, которую хотите эмулировать.
Затем сохраняете настройки и пытаетесь запустить программу. Есть шанс что она заработает.
3. Запуск игр и программ в среде DOS
Даже самые старые программы можно запустить в современной ОС, правда, для этого потребуются специальные программы, эмулирующие среду DOS.
О дним из лучших эмуляторов DOS в среде Windows является DOSBox . Скачать можно с оф. сайта программы.
У становка DOSBox
Установка программы не представляет сложности. Только я бы рекомендовал при установки обязательно создать значок (ярлык) исполняемого файла на рабочем столе. Поставьте галочку напротив пункта «Desktop Shortcut».
З апуск игр в DOSBox
Возьмем какую-нибудь старую игру, которую нужно запустить в ОС Windows8. пусть будет пошаговая стратегия Сида Мейера Civilization 1.
Если попытаться запустить эту игру проста так или в режиме совместимости, перед вами неустанно будет всплывать сообщение о невозможности открыть данный исполняемый файл.
Поэтому просто перенесем исполняемый файл (при помощи левой кнопки мышки) на значок (ярлык) программы DOSBox (который находится на рабочем столе).
Можно просто попробовать так же отрыть исполняемый файл игры (в данном случае «civ.exe») с помощью DOSBox’a.
Далее игра должна запуститься в новом окне. Вас попросят указать видеокарту, звуковую карту, и пр. В общем, вводите везде нужно цифру и игра будет запущена. См. скриншоты ниже.
Если ваша программа будет требовать ОС Windows 98, например, то без виртуальной машины вам уже не обойтись. Далее речь пойдет именно о них!
4. Запуск старых ОС в новых версиях Windows
Запустить любую старую программу на новой ОС возможно только с помощью виртуальных машин. Они представляют из себя обычные программы, которые эмулируют, как бы, работу настоящего компьютера. Т.е. получается так, что вы можете в Windows 8 запускать ОС, например, Windows 2000. А уже в этих запущенных старых ОС запускать любые исполняемый файлы (программы, игры и пр.).
О том, как это все сделать и поговорим в данном разделе этой статьи.
4.1. Виртуальная машина. Установка
Virtual Box
(скачать можно с оф. сайта)
Это бесплатная виртуальная машина, которая позволит вам запускать на своем новом компьютере десятки ОС, начиная Windows 95 и заканчивая Windows 7.
Единственное, такого типа программы довольно требовательны к системным ресурсам, поэтому если вы хотите запускать в Windows 8, ОС Windows 8 — нужно иметь не менее 4 гб оперативной памяти.
Работает как в 32-х, так и в 64-х битных системах. Установка происходит стандартным образом, лично, не трогаю никакие галочки, все по умолчанию.
Единственное, оставляю галочку, чтобы установщик создал ярлык на рабочем столе для запуска программы (Create a shortcut on the desktop).
В общем-то, после установки VirtualBox, можно приступить к установки в него ОС. Но об этом чуть ниже.
4.2. Настройка виртуальной машины
Прежде, чем приступить к установки ОС, необходимо настроить виртуальную машину.
1) После первого запуска в VirtualBox можно нажать только одну кнопку — «создать». Собственно, нажимаем.
2) Далее указываем название нашей виртуальной машины, указываем ОС, которую будем устанавливать. Так VirtualBox уже подберет оптимальные настройки для ее работы.
3) Жесткий диск создаем новый.
4) Рекомендую выбрать тип дисков VHD. Почему — об этом. см. далее в статье. Если кратко — то на них легко можно копировать информацию прямо в ОС Windows, открыв их как обычный файл.
5) Виртуальный жесткий диск, который вы создаете в этой программе представляет из себя обычный файл-образ. Он будет располагаться в папке, которую вы укажите при настройке.
Есть два типа виртуального жесткого диска:
— динамический: значит что файл будет расти по размером по мере заполнения диска;
— фиксированный: размер сразу же будет задан.
6) На этом, как правило, настройка виртуальной машины заканчивается. У вас должна, кстати, появиться кнопка запуска созданной машины. Вести она себя будет так, как будто бы вы включили компьютер без установленной ОС.
4.3. Установка Windows 2000 на виртуальную машину
В этом посте остановимся в качестве примера на ОС Windows 2000. Ее установка мало чем будет отличаться от установки ОС Windows Xp, NT, ME.
Д ля начала вам нужно создать или скачать образ установочного диска с этой ОС. Кстати, образ нужен в формате ISO (в принципе, сойдет любой, но с ISO вся процедура установки пройдет быстрее).
1) Запускаем виртуальную машину. Здесь все просто и никаких проблем быть не должно.
2) Вторым шагом нужно подключить к виртуальной машине наш образ в формате ISO. Для этого выберите пункт устройства/выбрать образ оптического диска . Если образ присоединился, то вы должны наблюдать такую картинку, как на скриншоте ниже.
3) Теперь нужно перезагрузить виртуальную машину. Сделать это можно при помощи одноименной команды. См. скриншот ниже.
4) Если образ рабочий и вы правильно все сделали в предыдущих 3-х шагах, вы увидите экран приветствие и начало установки ОС Windows 2000.
5) После 2-5 мин. (в среднем) копирования установочных файлов, вас попросят прочитать лицензионное соглашение, выбрать диск для установки, форматировать ли его и пр. — в общем все то же самое как и при обычной установки Windows.
Единственное. Вы можете не боятся делать ошибки, ведь все равно все что будет происходить, будет происходить на виртуальной машине, а значит основной ваше операционной системе это никак не повредит!
6) После перезагрузки виртуальной машины (перезагрузится она, кстати, сама) — продолжится установка, вам будет нужно указать часовой пояс, ввести пароль и логин администратора, ввести лицензионный ключ.
7) После еще одной перезагрузки вы уже будете наблюдать установленную Windows 2000!
Кстати, в нее можно устанавливать игры, программы, да и вообще работать в ней как если бы это был компьютер под управлением Windows 2000.
4.3. Обмен файлами с виртуальной машиной (подключение жесткого диска)
Многие пользователи не испытывают больших проблем с установкой и заданием основных настроек виртуальной машине. Но трудности могут начаться, когда вы решите добавить какой-нибудь файл (или наоборот, скопировать с диска виртуальной машины). Напрямую, через «правка-копировать-вставить» фокус не пройдет…
В предыдущем разделе данной статьи, лично, рекомендовал вам делать образы диска в формате VHD. Почему? Просто их легко можно подключить к ОС Windows 7,8 и работать как с обычным жестким диском!
Для этого проделаем несколько шагов…
1) Сначала заходите в панель управления. Далее переходите в администрирование. Можно найти, кстати, через поиск.
2) Далее нас интересует вкладка « управление компьютером «.
3) Здесь нужно выбрать раздел « управление дисками «.
В колонке справа нажимаете по кнопке управления и выбираете пункт «присоединить виртуальный жесткий диск». Вводите адрес, где он располагается и подключаете файл VHD.
Как найти файл VHD?
Очень просто, по умолчанию, при установке, файл будет по адресу:
C:\Users\alex\VirtualBox VMs\winme
где «alex» — имя вашей учетной записи.
4) Далее заходите в «мой компьютер» и наблюдаете, что в системе появился жесткий диск. Кстати, с ним можно работать как с обычным диском: копируйте, удаляйте, правьте любую информацию.
5) После того, как поработали с файлом VHD, отключите его. По крайней мере, желательно не работать одновременно с виртуальным жестким диском в двух операционных системах: виртуальной и вашей реальной…
5. Заключение
В этой статье мы рассмотрели все основные способы запуска старых игр и программ: начиная с эмуляторов и заканчивая виртуальными машинами. Конечно, жалко, что некогда любимые приложения перестают запускаться на новых операционных системах, и для одной любимой игры держать дома старый компьютер — оправдано ли? Все таки лучше этот вопрос решить программно — один раз настроя виртуальную машину.
PS
Лично бы сам и не стал разбираться, если бы не столкнулся с тем, что программа, необходимая для расчетов не была столь древняя и не отказывалась бы работать в ОС Windows XP. Пришлось устанавливать и настраивать виртуальную машину, затем в нее Windows 2000, и в ней уже проводить расчеты…
Кстати, а как вы запускаете старые программы? Или не используете вообще их?
Еще один пост, как играть в виртуальной машине.
Знаю, был пост подобной тематики. Но ставить Proxmox для того, чтобы просто попробовать, для новичка, я считаю, малость чересчур. Будем препарировать Ubuntu.
Итак, по сути, я расскажу, как поставить QEMU с пробросом видеокарты, чтобы можно было поиграть. На схеме это выглядит так (ну очень схематично):
Это позволяет запускать в виртуальной машине на отдельном мониторе приложения, требующие полноценной видеокарты. По сути это практически эквивалент второго компьютера. Дальше сами додумаете.
Я не рассматривал типовые проблемы, которые могут возникнуть, чтобы не перегружать пост текстом, если они возникнут, вам придется копнуть чуть глубже или спросить совета. Не надо писать «ололо, у меня ошибка 43, мануал говно».
— Один Linux типовой — Ubuntu, чем свежее, тем лучше.
— Камень и мать с поддержкой AMD-Vi/VT-d и IOMMU соотв. Погуглите.
— Вторая видюха, очень желательно во втором PCI-e порту.
— Второй видеокабель и очень желательно — второй комплект клавиатура/мышь.
Качаем и ставим qemu, в убунту это:
Лучше со стандартным ядром и qemu из реп, если не шарите.
Накатим систему по вкусу пока без GPU. Разметим образ:
и запустим систему, поставив туда любимую десяточку/семерочу/что-то еще:
Как поставить виндовс — можно найти в интернете))
Далее надо запустить драйвер vfio и присобачить к нему видюшку, которую надо пробросить.
Для этого нам надо узнать адрес и идентификатор карты. Сделаем волшебное:
ищем нужные девайсы (VGA и HDMI Audio), в моем случае нас интересует это (запишите то, что жирным):
Запилим такое действо:
Теперь добавим нужные модули.
Перезагрузимся. Этого должно быть достаточно.
Теперь проверим, как прошло.
Должно выдать что-то вроде:
Наконец запустим нашу машину башскриптом типа:
Можно заметить, что скрипт использует аргумент:
Это идентификатор клавиатуры/мыши 2.4 ГГц. Его можно (и нужно) узнать через
Сам скрипт запускается так:
Но пока не запускаем!
Да. У многих мониторов по два входа, так что проброшенную видеокарту стоит подключить вторым кабелем и не париться. Можно и на телек кинуть, как сделал я.
По поводу звука — лучше HDMI, конечно, но в скрипте есть волшебная строчка
которая добавит стандартную звуковуху ac97 и будет выводить звук на хост. Но на Windows10 с установкой дров придется немного помудрить (можно найти в интернете). Если звук идет по HDMI, строку надо убрать.
На этом все. Удачных опытов.
979 постов 15.3K подписчик
Правила сообщества
Все дистрибутивы хороши.
0409 | 36 events @ 4 min: F, WordPad + Новости проекта
Индия запустила в космос станцию Aditya-L1, которая будет исследовать Солнце. Доберётся до нужной орбиты через 126 дней.
Космический корабль SpaceX Crew Dragon вернулся с МКС на Землю. На борту четыре человека, в т.ч. наш космонавт Андрей Федяев.
Клиенты Dell заказали серверы для ИИ на 2 млрд $. Акции компании +21% за день, рекордный скачок за пять лет.
Девять китайских компаний, в т.ч. Alibaba T-Head и Baidu StarFive, объединились в альянс China RISC-V Industry Alliance. Договорились упростить продажу лицензий на патенты архитектуры RISC-V и не подавать в суд друг на друга за их нарушение.
# Software
▸[4] Apple запустила багбаунти для iPhone 14 Pro. Рассылает смартфоны с отключённой защитой и с шелл-доступом.
▸[5] Google Saved удаляет сохранённые ссылки на торренты и другие сайты, нарушающие авторские права.
▸[6] Ядро Linux 6.5 доступно для Ubuntu. Инструкция в статье.
▸[7] Microsoft прекратила поддержку WordPad. Приложение скоро исчезнет из Windows.
▸[8] Apple сделала сайт с описанием всех своих приложений.
▸[9] Apple закрыла приложение iTunes Movie Trailers.
▸[10] Релиз Nitrux 3.0: форк Debian без systemd, пропатчили уязвимости процов Intel и AMD, несколько новых утилит шифрования и драйверов.
▸[11] Релиз Linux Lite 6.6: форк Ubuntu, добавили языки, в т.ч. русский, нейронку-помощницу в разделе «Справка» и новые обои.
▸[12] Google Maps тестируют новую цветовую схему.
▸[13] Релиз ArcaOS 5.1: форк OS/2, добавили поддержку UEFI и дисков более 2 Тб.
# Hardpron
▸[14] Камера наружного наблюдения Bosch Eyes Outdoor Camera II: 1080p, мимикрирует под софит. Цена 350 €.
▸[15] Консоль Xbox Series S black: ПЗУ 1 Тб, корпус чёрного цвета, в остальном не отличается от базовой модели. Цена 350 $.
▸[16] Видеокарты XFX Radeon RX 7800 XT и RX 7700 XT версии MERC и QICK: характеристик нет. В продаже на этой неделе, QICK по 450 и 500 $, цены MERC нет.
# Business
▸[17] Суд штата Джорджия будет стримить слушания по делу Дональда Трампа на YouTube.
▸[18] Московский государственный университет запустил суперкомпьютер МГУ-270 для обучения нейросетей. Мощность 400 Петафлопс.
▸[19] Церковь Саентологии выступила против законопроекта США «О праве на ремонт», который обяжет её опубликовать схему Электропсихометра.
▸[20] Новостной сайт Gizmodo уволил переводчиков испанской версии. Статьи теперь публикует нейросеть.
▸[21] Европол взломал шифрование чатов EncroChat, Sky ECC и ANOM. Полиция Сербии, используя сообщения из них, накрыла наркоторговцев с 2,7 тоннами кокаина.
▸[22] Биржа Nasdaq перенесла систему работы с ценными бумагами на серверы AWS.
▸[23] Выручка Broadcom во II квартале: +8,9 млрд $, +5%, чем год назад. Чистая прибыль: +3,3 млрд $, +7%.
▸[24] Пентагон запустил сайт с информацией об НЛО.
▸[25] Фонд Нобеля передумал приглашать на церемонию вручения премии нашего, белорусского и иранского послов из-за протеста шведских политиков.
▸[26] Профсоюз голливудских актёров начал голосование о забастовке в индустрии видеоигр из-за внедрения нейросетей.
▸[27] Apple отказалась разрабатывать систему для iCloud, которая ищет фотографии с сексуальным насилием над детьми. Заявила, что это создаст новый вектор хакерских атак.
▸[28] Соцсеть X обновила пользовательское соглашение: будет обучать нейросеть на постах юзеров.
▸[29] Уволенные сотрудники Twitter подали уже 2200 судебных исков против Маска. Говорят, не выплатил выходные пособия.
▸[30] Британское детское печенье Paw Patrol отзывает продукцию из магазинов. Компания забыла продлить домен и теперь там порносайт.
▸[31] Оператор спутниковой связи Globalstar, услуги которого покупает Apple, забронировал места в ракетах SpaceX на 64 млн $ в 2025.
▸[32] МТС купила долю 85% сервиса продажи билетов на концерты Ticketscloud и собирается выкупить его полностью в течение двух лет. Почём не говорит, но менее 900 млн ₽.
▸[33] SpaceX закинула на орбиту 21 спутник Starlink.
▸[34] Huawei запустила ЦОД в Саудовской Аравии для госсектора и филиалов китайских компаний.
▸[35] Директор по продукту [CPO] Binance уволился. Не сказал почему.
# Спасибо @fix4fix за Пикабу-донат!
# Новости проекта
# Аудиоверсия
+ Звуки начала и конца
+ Hardpron читает Алёна, чтобы Филиппу было не так одиноко
OPQAM, IJKL, 67890. О том, как нам реально повезло с курсорными клавишами
Клавиатура Суры ПК8000
Первый компьютер появился у меня дома в 6 лет. Это была Сура ПК8000 с черно-белым телевизором. Затем я попробовал игры на MSX-2 с цветным монитором, различные модели БК, PC и ZX Spectrum.
Последний был моим любимцем на протяжении нескольких лет. Он достался мне в корпусе от “Суры”, которую собирали на заводе в Пензе, с черно-белым монитором “Корвет” и двумя дисководами. Естественно, что в начале 90-х я понятия не имел, как выглядит настоящий “Спектрум”. Важнее было, что софта для него, в отличие от “Суры” и БК, было навалом, а клоны были во многих семьях и проблем с обменом коллекциями не существовало.
Что бесило, так это кривые сочетания клавиш управления во многих играх. Какой синклер-джойстик? Почему OPQAM? Есть же нормальные курсорные стрелки на клавиатуре?
Скриншот выбора управления в игре Rolling Thunder (Keyboard ― те самые OPQAM)
Что еще хуже, при написании программ приходилось либо долго втыкать в мелкие наклейки на клавишах, либо заучивать сочетания. Отдельных кнопок для управления курсором или того же backspace не было.
Почитав историю Синклера, я решил, что это было сделано в угоду дешевизне, минитюаризации, а еще потому, что многие использовали в играх джойстик.
Но после того, как я посмотрел на клавиатуры популярных компьютеров конца 70-х и начала 80-х, я решил, что создатели ПК не особенно заморачивались, и взяли за базу печатные машинки. Действительно, кому могут понадобиться курсорные клавиши, расположение которых будет одинаковым на всех клавиатурах, которые можно нажимать одной рукой, да еще вслепую?
Хотя нет, в Apple настолько заморочились, что на Apple Lisa и Macintosh курсорных клавиш не было вообще. Так покупателей приучали пользоваться мышкой.
Клавиатура Apple M0110
Пожалуй, все неудобства и “боль” пользователей при переходе с модели на модель можно понять только показав, как это было.
❯ Худшие из худших
На печатных машинках курсорные клавиши не были нужны, но на компьютерах для перемещения по листингам, меню, управлению в играх вроде бы необходимы?
Однако, возникает ощущение, что создатели компьютеров просто не пользовались своими творениями, т.к. на некоторых моделях типа Атари 400, 800 и 800XL клавиатура в неизменном виде существовала несколько лет.
Apple
Про Apple Lisa и Macintosh я написал в самом начале. На Apple II курсорные клавиши появились. Но… только влево и вправо. Было бы интересно понять логику.
Клавиатура Apple II
Неудобство проявлялось еще и в том, что в играх управление было совершенно разным. Например, в Ms.Pac-Man клавиши A и Z отвечали за вверх-вниз, а в Lode Runner управление было вообще без курсорных клавиш ― IJKL.
Скриншот игры Ms.Pac-Man
Полноценный блок был добавлен в модели Apple IIc и IIe
В Apple III разработчики снова учудили, и расположили клавиши, как получилось (три клавиши в ряд, а одна сверху).
Пользоваться любым из решений одной рукой неудобно. Но хуже всего, что пересесть с ПК одного производителя на на другой было реальным кошмаром.
Atari 400, 800, 800XL (1979)
Для управления курсором приходилось удерживать Control, а в младшей модели еще и мириться с мембранной клавиатурой.
BBC Micro (1981)
Раскладка уже в ряд, и без CTRL.
То есть, если вы работали на Атари, а потом вдруг решили перейти на BBC, нужно переучиваться заново пользоваться клавиатурой.
HP 9835 (1979)
Маленькие клавиши в верхней части корпуса размещены так, что положить руки, ничего не задев, не получится.
Кстати, порядок клавиш отличается и от Атари и от BBC Micro.
TRS-80 (1977) и Tandy Color Computer (1980)
Есть вверх, вниз, влево, вправо, но на разных частях клавиатуры.
Casio
Надо отметить, что в Японии дела обстояли ничуть не лучше.
Портативный ПК Casio FX 9000p
Commodore
Очень странным мне показалось решение в Commodore 64, который получил огромную популярность и репутацию игрового ПК. Обратите внимание — за вверх-вниз и влево-вправо отвечают по одной клавише. Хорошо, хоть кнопку shift разместили так, чтобы можно было управлять одной рукой.
Commodore 128 получил уже рядную раскладку:
А вот в Commodore Plus/4, на мой взгляд, вышло совсем неудачное решение. Блок с курсорными кнопками слишком мал и подойдет только для редактирования текста.
Amiga
Ближе к привычному нам расположению, но средний палец должен совершать менее удобное движение для перемещения вниз-вверх.
Клавиатура Amiga 1000
А вот Amiga 500 и 2000 уже получили Т-образное расположение.
❯ Под занавес. Первыми были вовсе не IBM!
Я был убежден, что изобретение стандарта принадлежит IBM, но оказалось, что еще раньше появления клавиатуры IBM Modem M (1985) по-крайней мере, две компании использовали Т-образное расположение курсорных клавиш. Но, надо отдать должное, IBM повлияла на широкое распространение этого варианта.
Я специально потратил время на поиск картинок старых компьютеров и терминалов. Первые клавиатуры с привычным нам расположением появились еще в 1970 или раньше.
Терминал ADDS Consul 880
А более современный вариант появился в 1982 году благодаря Digital Equipment.
Плохих примеров реализации курсорных клавиш очень много. Во время подготовки статьи я не раз мысленно говорил “спасибо” дизайнерам и разработчикам, благодаря которым можно легко пересесть за другой компьютер, и продолжить редактировать свой пост, не спотыкаясь, на чужой клавиатуре.
Если у вас есть предположения, почему так долго не было единого стандарта, или у вас есть объяснение логики производителей, поделитесь в комментариях!
Больше интересных статей в нашем блоге на Хабре. Недорогие сервера для ваших проектов — здесь.
Умер «отец» легендарного текстового редактора, который обожают программисты
Скоропостижно скончался создатель легендарного текстового редактора Vim Брам Моленар. Инструмент с более чем 30-летней историей, который по-прежнему любим разработчиками ПО, остался без главного «поставщика» патчей.
Умер Брам Моленар
Нидерландский программист, автор и ключевой разработчик текстового редактора Vim Брам Моленар (Bram Moolenaar) умер 3 августа 2023 г. Ему было 62 года. По сообщению родственников, опубликованному в Google Groups проекта Vim, причиной смерти Моленара стало быстро прогрессирующее заболевание.
Vim (Vi imporoved) – свободный экранный текстовый редактор с открытым исходным кодом, портированный на большинство современных платформ. Vim является клоном классического редактора vi для операционной системы Unix, в котором однако же не используется программный код vi. Вместо этого из соображений лицензионной чистоты в качестве основы для Vim изначально использовался другой клон vi – Stevie.
За 31 год существования Vim Моленар внес наибольший вклад в его развитие. Так, согласно данным Github, пользователь brammool добавил в проект в период с 2004 по 2023 г. 16515 коммитов и почти 3,5 млн строк кода. Ближайший конкурент Моленара по производительности в рамках проекта Vim yegappan может похвастаться 69051 коммитом и принятыми патчами на 69 тыс. строк кода в совокупности.
Похороны Моленара состоятся на его родине – в Нидерландах. О точных времени и месте проведения прощальной церемонии семья Моленара объявит отдельно.
Что такое Vim
Vim отличает большая гибкость и широкие возможности настройки редактора, а также максимально лаконичный интерфейс. Управление программой осуществляется при помощи текстовых команд, а не путем выбора соответствующих пунктов меню или нажатия кнопок, расположенных на экране. Vim поддерживает несколько тысяч модулей расширения, которые, к примеру, позволяют превратить редактор в практически полноценную интегрированную среду разработки – с подсветкой синтаксиса и интеграцией с операционной системой.
Исходный код распространяется на условиях особой charityware-лицензии, совместимой с GNU GPL 2.0. Она предоставляет пользователю право свободно копировать, модифицировать и распространять программу и призывает по возможности жертвовать деньги благотворительной организации ICCF Holland, у истоков которой стоит Моленар.
Сверхпопулярный инструмент разработчика
Согласно опросу, проведенному Stack Overflow, популярной площадкой для программистов, в 2023 г. своей любимой средой разработки программного обеспечения Vim назвало 22,29% респондентов.
По показателю популярности среди аудитории портала Vim уступил лишь Notepad++ (24,54%), IntelliJ IDEA (26,82%), Visual Studio (28,43%) и Visual Studio Code (73,71%). Редактор Брама Моленара оставил позади такие инструменты разработчика как Android Studio (16,82%), PyCharm (14,63%), Eclipse (9,9%), Emacs (4,69%).
Краткая биография Брама Моленара
Брам Моленар родился в 1961 г. в Лиссе (Южная Голландия). В 1985 г. окончил Делфтский университет (Делфт, Нидерланды) по специальности «электротехника» (electrical engineering).
В 1988 г. Моленар, став обладателем компьютера Amiga, занялся разработкой аналога текстового редактора vi, который не был представлен на этой платформе. Взяв за основу один из клонов vi – Stevie, программист значительно обогатил его функциональность.
В этом же году плоды его труда, получившие название Vim (тогда – Vi Imitarion; «имитация Vi»), вошли в подборку дисков с бесплатным ПО, распространяемым Фредом Фишем (Fred Fish) – другим видным деятелем сферы ПО с открытым исходным кодом того времени, который, в частности, известен благодаря своему вкладу в разработку отладчика GNU Debugger (GDB).
Усилиями сторонних программистов Vim был портирован на ряд других платформ, таких как MS-DOS и Unix. С выходом версии 1.22 в 1992 г. Vim расшифровывается как Vi Improved («Vi усовершенствованный»).
Помимо Vim, Моленар известен как автор проекта A-A-P по созданию инструментария для легкой сборки программ и создатель экспериментального языка программирования Zimbu c С-подобным синтаксисом и некоторыми возможностями по контролю за стилем написания кода – для обеспечения лучшей его читаемости.
Наконец, именно Моленар основал ранее упомянутую ICCF Holland и вплоть до самой смерти выступал ее казначеем.
ICCF Holland – небольшая неправительственная организация, действующая на территории Уганды (Африка), которая оказывает помощь жертвам СПИДа, в частности детям, оставшимся без попечения родителей. Организация помогает сиротам в получении базовых образовательных и медицинских услуг.
В период с 2006 по 2021 г. Моленар являлся сотрудником офиса Google в Цюрихе (Швейцария). Часть своего свободного времени он по-прежнему уделял поддержке Vim.
Исходники закрыты, но мы не сдадимся: Пишем полностью нативное GUI-приложение под No-Name смартфон без Android
Для многих разработчиков приложений далеко не секрет, что экосистема Android не предполагает написание полностью нативных приложений: в этой платформе очень многое завязано на Java и без ART можно запустить только простые службы без какого-либо интерфейса. Однако, есть один способ писать практически под «голый» Linux, не перекомпилируя ядро и при этом пользоваться самыми интересными фишками устройства без оверхеда в виде тяжелого Android: ускорение 3D-графики (OpenGLES), микшер звука, ввод с различных устройств, OTG, Wi-Fi и если очень постараться — даже 3G. Это открывает множество разных интересных применений старым устройствам: «железо» смартфонов зачастую гораздо мощнее современных недорогих одноплатников. Сегодня я покажу вам, как написать и запустить программу, которая полностью написанное на C без Android, на No-Name Android-смартфоне практически без модификаций. Интересно? Жду вас в статье!
❯ Что нам нужно знать?
Даже относительно старые устройства флагманского сегмента обладают весьма неплохими характеристиками. Зачастую они гораздо мощнее современных дешевых одноплатников и могут выполнять самые разные задачи: эмуляция консолей, работа в качестве плееров, да даже просто сделать настольные часики самому было бы здорово. Но есть одно но — это Android. Платформа от Google может тормозить даже на достаточно мощном железе, что резко ограничивает потенциально возможные применения подобных гаджетов. Да и многие программисты не особо хотят заморачиваться и учить API Android для реализации каких-то своих проектов.
Но конечно же, есть один способ писать нативные программы, при этом используя все ресурсы смартфона/планшета. Для этого нужно понимание, как работает процесс загрузки на многих Android-гаджетах:
Первичный загрузчик (BootROM) инициализирует какую-то часть периферии и загружает вторичный загрузчик (U-boot/LK).
Вторичный загрузчик, используя определенные аргументы (например зажата ли какая-то кнопка) выбирает, с какого раздела грузить ядро системы.
После загрузки ядра Linux и подключения ramdisk начинается выполнение процессов системы.
Как раз в третьем пункте и лежит ключ к способу, который будем использовать мы. Дело в том, что в смартфоне обычно есть несколько boot-разделов и у каждого свой образ ядра Linux со своим ramdisk. Первый из них — это знакомый моддерамboot.img, который отвечает за загрузку системы и инициализирует железо/монтирует разделы/подготавливает окружение к работе (.rc файлы) и запускает главный процесс Android —zygote. При этом используется собственная реализация init от Android.
Второй, не менее знакомый многим раздел —recovery, отвечает за так называемый режим восстановления, в котором мы можем сбросить данные до заводских настроек/очистить кэши или прошить кастомную прошивку. Вероятно, многие из вас замечали, насколько быстро ваш девайс загружает этот режим, гораздо быстрее, чем загрузка обычного Android. И именно в его реализацию нам нужнозаглянуть(я намеренно выбрал бранч версии 2.3 — т.е Gingerbread для простоты):
А recovery оказывается самой обычной нативной программой, написанной на C со своим небольшим фреймворком для работы с графикой и вводом. В процессе загрузки режима recovery, скрипт запускает одноименную программу в /sbin/, благодаря которому мы видим простую и понятную менюшку. Так почему бы не использовать этот раздел в своих целях и не написать какую-нибудь нативную программу самому?
Как я уже говорил выше, в этом режиме доступны многие аппаратные возможности вашего смартфона, за исключением модема. Используя полученную информацию, предлагаю написать наше небольшое приложение под Android-смартфон без Android сами!
❯ Подготавливаем окружение
В первую очередь, хотелось бы отметить, что программы под «голый» смартфон можно писать не только на C/C++. Нам доступен как минимум FPC, который довольно давно умеет компилировать голые бинарники под Android. Кроме того, мы можем портировать маленькие embedded-версии интерпретаторов таких языков, как lua, micropython и duktape (JS).
Однако в случае нативных программ, есть два важных правила, которые необходимо понимать. Во-первых, в Android используется собственную реализацию стандартной библиотеки libc — bionic, в то время как на десктопных дистрибутивах используется glibc. Между собой они не совместимы — именно поэтому вы не можете просто взять и запустить консольную программу для Raspberry Pi, например.
А второе правило заключается в том, что начиная с версии 4.1, Androidтребует, чтобы все нативные программы были скомпилированы в режиме -fPIE — т. е. выходной код должен не зависеть от адреса загрузки программы в виртуальную память. Для этого достаточно добавить ключ -fPIE, однако учтите, что если вы разрабатываете программу под Android 4.0 и ниже, то fPIE наоборот необходимо убрать — старые версии Androidнеподдерживают такой способ генерации кода и будут вылетать с Segmentation fault.
Для разработки нам понадобится ndk — там есть все необходимые заголовочники и компиляторы для нашей работы. Я используюndk r9c, поскольку в свежих версиях Google регулярно может что-то сломать.
ndk-build, к сожалению, здесь работать не будет, поэтому Makefile придется написать самому. Я составил полностью рабочий Makefile, который без проблем скомпилирует валидную программу, вам остаётся лишь поменять NDK_DIR.
NDK_DIR = D:/android-ndk-r11c/
TOOLCHAIN_DIR = $(NDK_DIR)toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/
GCC = $(TOOLCHAIN_DIR)arm-linux-androideabi-g++
PLAT_DIR = $(NDK_DIR)platforms/android-17/arch-arm/usr/
LINK_LIBS = -l: libEGL.so -l: libGLESv1_CM.so
OUTPUT_NAME = cmdprog
build:
$(GCC) -I $(PLAT_DIR)include/ -L $(PLAT_DIR)lib/ -fPIE -Wl,-dynamic-linker=/sbin/linker $(LINK_LIBS) -static -o $(OUTPUT_NAME) main.cpp micro2d.cpp
После этого пишем простенькую программу, которая должна вывести «Test» и компилируем её.
❯ Деплоим на устройство
Несмотря на то, что грузиться мы будем в режим recovery, нам всё равно будет доступен adb, через который мы сможем запускать и отлаживать нашу программу. Это очень удобно, однако по умолчанию adb включен только в TWRP, который нужно сначала найти или портировать под ваш девайс (на большинство старых брендовых устройств порты есть, на нонейм придется портировать самому — гайды есть в интернете). Под ваше устройство есть TWRP? Отлично, распаковываете recovery.img с помощью так называемой «кухни» (MTKImgTools как вариант):
Открываете init.recovery.service.rc и убираете оттуда запуск одноименной службы (можно просто оставить файл пустым).
Запаковываем образ обратно тем же MTKImgTools и прошиваем флэшером для вашего устройства — в моём случае, это SP Flash Tool (MediaTek):
Заходим в режим рекавери и видим зависшую заставку устройства и звук подключения устройства к ПК. Если у вас установлены драйвера, то вы сможете без проблем зайти в adb shell и попасть в терминал для управления устройством. Теперь можно закинуть программу — прямо в корень рамдиска (записывается программа в ОЗУ, но при переполнении, телефон уйдет в ребут — осторожнее с этим). Пишем:
adb push cmdprog /: adb shell chmod 777 cmdprog ./cmdprog
И видим результат. Наша программа запускается и работает!
Это просто отлично. Однако я ведь обещал вам, что мы напишем программу, которая сможет выводить графику и обрабатывать ввод, предлагаю перейти к практической реализации!
❯ Выводим графику
Для вывода графики без оконных систем, мы будем использовать API фреймбуфера Linux, которое позволяет нам получить прямой доступ к массиву пикселей на экране. Однако учтите, что этот способ полностью программный и может оказаться тормозным для вашего приложения: скорость работы прямо-пропорциональна разрешению дисплея вашего устройства. Чем выше разрешение, тем ниже филлрейт. В моём случае, матрица была с разрешением 960×540, 32млн цветов, IPS — очень недурно, согласны?
Фреймбуфер Linux может работать с самыми разными форматами пикселя, имейте это ввиду. На некоторых устройствах может быть 16-битный формат (262 тысячи цветов, RGB565), на моём же оказался 32х-битный с выравниванием по строкам (имейте это также ввиду). 32х битный формат. Работать с ним легко: открываем устройство /dev/graphics/fb0, получаем параметры (разрешение, формат пикселя), делаем mmap для отображения буфера с пикселями на экране в память нашего процесса и выделяем второй буфер для двойной буферизации дабы избежать неприятных мерцаний.
void m2dAllocFrameBuffer()
<
fbDev = open(PRIMARY_FB, O_RDWR);
fb_var_screeninfo vInfo; fb_fix_screeninfo fInfo;
ioctl(fbDev, FBIOGET_VSCREENINFO, &vInfo);
ioctl(fbDev, FBIOGET_FSCREENINFO, &fInfo); fbDesc.width = vInfo.xres;
fbDesc.height = vInfo.yres;
fbDesc.pixels = (unsigned char*)mmap(0, fInfo.smem_len, PROT_WRITE, MAP_SHARED, fbDev, 0); f
bDesc.length = fInfo.smem_len; fbDesc.lineLength = fInfo.line_length;
backBuffer = (unsigned char*)malloc(fInfo.smem_len); memset(backBuffer, 128, fInfo.smem_len);
printf(«Framebuffer is %s %ix%ix%i\n», (char*)& fInfo.id , fbDesc.width, fbDesc.height, vInfo.bits_per_pixel, fInfo.type);
>
Если не сделать предыдущий шаг и запускать нашу программу параллельно с recovery, то они обе будут пытаться друг друга «перекрыть» — эдакий race condition:
После этого пишем простенькие функции для блиттинга картинок (в том числе с альфа-блендингом). В инлайнах и критичных к скорости функциям лучше не делать условия на проверку границ нашего буфера — лучше «отрезать» ненужное еще на этапе просчета ширины/высоты:
__inline void pixelAt(int x, int y, byte r, byte g, byte b, float alpha)
<
if(x < 0 || y < 0 || x >= fbDesc.width || y >= fbDesc.height) return;
unsigned char* absPtr = &backBuffer[(y * fbDesc.lineLength) + (x * 4)];
if(alpha >= 0.99f)
<
absPtr[0] = b;
absPtr[1] = g;
absPtr[2] = r;
>
else <
absPtr[0] = (byte)(b * alpha + absPtr[0] * (1.0f — alpha));
absPtr[1] = (byte)(g * alpha + absPtr[1] * (1.0f — alpha));
absPtr[2] = (byte)(r * alpha + absPtr[2] * (1.0f — alpha));
> absPtr[3] = 255; >
for(int i = 0; i < image->height; i++)
<
for(int j = 0; j < image->width; j++)
<
byte* ptr = &image->pixels[((image->height — i) * image->width + j) * 3]; pixelAt(x + j, y + i, ptr[0], ptr[1], ptr[2], alpha);
>
>
И загрузчик TGA:
CImage* m2dLoadImage(char* fileName) <
FILE* f = fopen(fileName, «r»);
printf(«m2dLoadImage: Loading %s\n», fileName);
if(!f)
<
printf(«m2dLoadImage: Failed to load %s\n», fileName);
return 0;
>
CTgaHeader hdr;
fread(&hdr, sizeof(hdr), 1, f);
if(hdr.paletteType)
<
printf(«m2dLoadImage: Palette images are unsupported\n»);
return 0;
>
if(hdr.bpp != 24) <
printf(«m2dLoadImage: Unsupported BPP\n»);
return 0;
>
byte* buf = (byte*)malloc(hdr.width * hdr.height * (hdr.bpp / 8));
assert(buf);
fread(buf, hdr.width * hdr.height * (hdr.bpp / 8), 1, f);
fclose(f);
CImage* ret = (CImage*)malloc(sizeof(CImage));
ret->width = hdr.width;
ret->height = hdr.height;
ret->pixels = buf;
printf(«m2dLoadImage: Loaded %s %ix%i\n», fileName, ret->width, ret->height);
return ret;
>
И попробуем вывести картинку:
m2dInit();
test = m2dLoadImage(«test.tga»);
test2 = m2dLoadImage(«habr.tga»);
while(1)
<
m2dClear();
m2dDrawImage(test, 0, 0, 1.0f);
m2dDrawImage(test2, tsX — (test2->width / 2), tsY — (test2->height / 2), 0.5f);
m2dFlush();
>
Не забываем про порядок пикселей в TGA (BGR, вместо RGB), меняем канали b и r местами в pixelAt и наслаждаемся картинкой на большом и классном IPS-дисплее:
Производительность отрисовки не очень высокая, однако если оптимизировать код (копировать непрозрачные картинки сразу сканлайнами и убрать проверки в инлайнах), то будет немного шустрее. Google для подобных целей сделали собственный простенький софтрендер —libpixelflinger.
Есть вариант для быстрой и динамичной графики: использовать GLES, который без проблем доступен и из recovery. Однако, насколько мне известно (в исходники драйверов посмотреть не могу), указать фреймбуфер в качестве окна не получится, поэтому в качестве Surface для рендертаргета у нас будет служить Pixmap (так называемый off-screen rendering), которому нужно задать правильный формат пикселя (см. документацию EGL). Рисуем туда картинку с аппаратным ускорением и затем просто копируем в фреймбуфер с помощью memcpy.
❯ Обработка нажатий
Однако, ни о каких GUI-программах не идёт речь, если мы не умеет обрабатывать нажатия на экране с полноценным мультитачем! Благо, даже механизм обработки событий в Linux очень простой и приятный: мы точно также открываем устройство и просто читаем из него события в фиксированную структуру. Эта черта мне очень нравится в архитектуре Linux!
Каждое устройство, которое может передавать данные о нажатиях, находится в папке /dev/input/ и имеет имя вида event. Как узнать нужный нам event? Нам нужен mtk-tpd — реализация драйвера тачскрина от MediaTek (у вашего чипсета может быть по своему), для этого загружаемся в Android и пишем getevent. Он покажет доступные в системе устройства ввода — в моём случае, это event2:
Из event можно читать как в блокирующем, так и не в блокирующем режиме, нам нужен второй. Более того, в них можно инжектить события, что я показывал в статье про создание своей консоли из планшета с нерабочим тачскрином:
// Open input device evDev = open(INPUT_EVENT_TPD, O_RDWR | O_NONBLOCK);
После этого, читаем события с помощью read и обрабатываем их. На устройствах с резистивным тачскрином, передается просто ABS_POSITION_X, на устройствах с поддержкой нескольких касаний — используетсяпротокол MT. Когда пользователь нажал на экран, посылается нажатие BTN_TOUCH с значением 1, а когда отпускает — соответственно BTN_TOUCH с значением 0. Разные драйверы тачскрина используют разные координатные системы (насколько я понял), в случае MediaTek — это абсолютные координаты на дисплее (вплоть до ширины и высоты). На данный момент, я реализовал поддержку только одного касания, но при желании можно добавить трекинг нескольких нажатий:
void m2dUpdateInput()
<
input_event ev;
int ret = 0;
while((ret = read(evDev, &ev, sizeof(input_event)) != -1))
<
if(ev.code == ABS_MT_POSITION_X) tsState.x = ev.value;
if(ev.code == ABS_MT_POSITION_Y) tsState.y = ev.value;
if(ev.code == BTN_TOUCH) tsState.isPressed = ev.value == 1;
>
tsState.cb(tsState.isPressed, tsState.x, tsState.y); >
Теперь мы можем «возить» логотип Хабра по всему экрану:
void onTouchUpdate(bool isTouching, int x, int y) <