Timeweb.Cloud

Timeweb.Cloud

Блог компании
То самое облако Наш сайт: https://timeweb.cloud/ ТГ: https://t.me/timewebru Хабр: https://habr.com/ru/companies/timeweb/articles/
На Пикабу
123К рейтинг 2701 подписчик 21 подписка 468 постов 408 в горячем
Награды:
самый сохраняемый пост недели более 1000 подписчиков5 лет на Пикабу
57

Хватит кормить Chrome! Как я подружил браузер с ноутбуком 2007 года

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

В качестве демонстрации. FreeBSD и ноутбук 2007 года, но ниже будет и про ваши любимые Windows c Linux

❯ Хром

Браузер Chrome, созданный и разрабатываемый корпорацией Google давно стал главным инструментом для большинства пользователей компьютерной техники:

в вашем телефоне, планшете, телевизоре, ноутбуке и стационарном компьютере в подавляющем большинстве случаев будет установлен именно этот браузер, либо что-то на его основе.

Исключения редки, это продукция Apple со своим собственным браузером Safari, медленно умирающий Firefox и совсем уж сказочная альтернативщина.

Два вечных конкурента в виде браузеров Opera и Internet Explorer сдались в попытке угнаться за прогрессом и ныне используют под капотом движок от Chrome.

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

Даже эта статья создавалась с помощью браузера Chrome:

❯ Скорость

Конечно высокооплачиваемые разработчики самого популярного браузера на планете, щедро финансируемые «корпорацией добра» — не полные идиоты и разбираются в вопросах производительности собственного продукта гораздо лучше автора.

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

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

Применимость

Описываемые ниже инструкции — для десктопной версии браузера Chrome и с учетом специфики трех разных операционных систем: Windows, Linux и FreeBSD.

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

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

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

Производительность

Я использую браузер Chrome на ноутбуках с момента его появления и часто работаю «в поле» — от батареи и без подключения к розетке. Помимо браузера на машине постоянно присутствуют еще несколько тяжелых приложений — в первую очередь среды разработки и разнообразные редакторы.

Все это в итоге формирует следующий набор требований:

  1. браузер не должен нападать на человека забирать на себя все доступные ресурсы;

  2. браузер не должен «сжирать» батарею ноутбука;

  3. браузер должен продолжать работать с современными сайтами, сохраняя отзывчивость интерфейса.

Время «холодного запуска» и скорость отрисовки страниц при таких вводных разумеется могут пострадать, но будут оставаться в пределах разумного.

Версии и названия

Чтобы не было путаницы, стоит сразу прояснить ряд нюансов с названиями продуктов и используемыми терминами.

Официально браузер от Google называется «Chrome» и поставляется (даже для Linux) в виде готовой сборки с инсталлятором, т.е. это закрытый коммерческий продукт, хотя и бесплатный для пользователя.

Именно эта версия доступна для скачивания с официального сайта и имеет максимальную интеграцию с сервисами и другими продуктами Google.

Открытая часть браузера Chrome называется «Chromium» и с точки зрения обычного пользователя никак не поставляется, поскольку Chromium предназначен в первую очередь для технических специалистов, участвующих в процессе разработки и тестирования.

Именно Chromium а не Chrome чаще всего установлен по-умолчанию в различных дистрибутивах Linux, в виде сборки от ментейнеров дистрибутива.

Наконец существует проект «Ungoogled Chromium», авторы которого постарались удалить из Chromium абсолютно все интеграции с сервисами Google и все закрытые инструменты сборки.

Ungoogled Chromium за последние годы набрал популярность, поэтому активно используется в BSD-системах и дистрибутивах Linux, ориентированных на безопасность.

Поскольку использование сервисов Google в наше непростое время может приводить к непредсказуемым проблемам и сбоям подключения, я буду использовать для всех описываемых оптимизаций Ungoogled Chromium либо просто Chromium, но не официальный Google Chrome.

Тем не менее для простоты повествования, в статье используется термин «Chrome» в качестве обозначения браузера, поскольку описываемые методы оптимизации полностью совпадают и частично применимы и к другим браузерам на основе Chromium.

Тестовая среда

Для статьи использовались современные 64-битные сборки браузера, с версиями начиная с 147 и выше:

147.0.7727.101 (Official Build) (64-bit)

Ungoogled Chromium имеет свою собственную нумерацию версий, отличную от оригинальной, для этой статьи использовались версии 137 и выше:

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

Поскольку разницу лучше всего видно на устаревшем оборудовании, в качестве тестовой среды будут использованы два настоящих «боевых пенсионера»:

<a href="https://specspro.net/laptops/6879-lenovo-ideapad-z580-2151/" target="_blank" rel="nofollow noopener">Lenovo Z580</a>, 2013 года

Lenovo Z580, 2013 года

<a href="https://gadgetaz.com/Laptop/ASUS_F3Ke--76" target="_blank" rel="nofollow noopener">ASUS F3Ke</a>, 2007 год

ASUS F3Ke, 2007 год

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

❯ Оптимизация

Поскольку целевая аудитория статьи — обычные пользователи, не владеющие с пеленок компилятором и отладчиком, ограничусь тремя вариантами оптимизации браузера, доступными без залезания непосредственно в код:

хитрые настройки, хитрые плагины и хитрое окружение.

Все ради того чтобы крутить ленту каких-нибудь Reddit/LinkedIn без зависания браузера и 100% загрузки процессора.

Так выглядит работа браузера со всеми оптимизациями на Ubuntu Linux и ноутбуке 2012 года

❯ Chrome и Linux

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

Debian, Ubuntu, Manjaro, Mageia, Calculate — только то что установлено на железе, без виртуализации.

Сразу уточню, что Calculate Linux (на базе Gentoo) использует OpenRC вместо systemd, поэтому трюк с systemd-run тут не используется, но все остальные инструкции отлично работают на всем этом зоопарке и по своей сути применимы для любого окружения на базе Linux, везде где есть браузер Chrome.

Начнем со скрипта запуска браузера, в котором специальными параметрами включаются или отключаются разные хитрые опции, а также используется специальное окружение:

#!/bin/bash

systemd-run --user --slice=chromium.slice chromium \
--enable-features=VaapiVideoDecoder,VaapiVideoEncoder \
--enable-gpu-rasterization \
--disable-gpu-compositing \
--enable-zero-copy \
--disable-background-networking \
--disable-client-side-phishing-detection \
--disable-prompt-on-repost \
--disable-sync \
--metrics-recording-only \
--no-first-run \
--safebrowsing-disable-auto-update \
--ignore-gpu-blocklist \
--renderer-process-limit=4 \
--disable-smooth-scrolling \
--wm-window-animations-disabled \
--animation-duration-scale=0 \
--disable-spell-checking \
--disable-features=WhatIsNewPage,Promotions,LensOverlay \
--enable-unsafe-swiftshader "$@"

Сохраняете текст выше в какой-нибудь /opt/own/bin/chrom, выставляете бит запуска:

chmod +x /opt/own/bin/chrom

И используете этот скрипт для первого запуска браузера.

Стоит напомнить, что символ \ отвечает за перенос строк, т.е. для программы весь набор параметров выше это одна длинная строка.

Если при копировании текста что‑то сломается — просто удалите все \ и сведите все в одну длинную строку — так тоже запустится.

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

Теперь рассказываю страшную сказку про «прожорливый» Chrome и пропавшую память, точнее про эту интересную строку:

systemd-run --user --slice=chromium.slice chromium

Дело в том, что у браузера Chrome есть дурная привычка считать весь компьютер своей собственностью и захватывать максимум доступных ресурсов — всю свободную память и все доступные процессоры и ядра.

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

Но стоит лишь немного просесть по мощности используемого оборудования или доступным ресурсам для более прожорливых программ (привет Davinci Resolve) и любимый браузер от «корпорации добра» немедленно показывает звериный оскал свое истинное лицо.

В случае ноутбука (тем более мощного) немедленно проявляется еще один дурной эффект:

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

Так что становится жизненно необходимым сажать браузер на ресурсную диету с помощью systemd и функционала cgroups.

Делается это в современных Linux-дистрибутивах довольно просто, для начала создаем файл ~/.config/systemd/user/chromium.slice со следующим содержимым:

[Slice] MemoryAccounting=yes MemoryHigh=1G MemoryMax=1.5G MemorySwapMax=3000M CPUAccounting=true CPUQuota=70%

Помимо очевидных лимитов на объем используемой памяти (MemoryHigh и MemoryMax), тут еще задается квота на загрузку процессора (CPUQuota), что не дает поднять ее выше заданного лимита — 100% загрузку CPU от процессов Chrome вы больше не увидите.

Теперь самое важное:

все указанные лимиты применяются ко всем дочерним процессам, которые запускает Chrome во время работы.

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

Ну и сам запуск с помощью черной магии systemd-run и указания слайса:

systemd-run --user --slice=chromium.slice chromium

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

Замечу, что сей хитрый трюк работает и с приложениями, работающими внутри AppImage или snapd-пакетов, так что с его помощью замечательно урезаются аппетиты версий Chrome/Chromium в Ubuntu/Manjaro, управляемые snapd.

Отключение анимации в действии

Отключение анимации в действии

❯ Отключение анимации

Существует одно интересное расширение для Chrome, позволяющее отключать анимированные картинки на всех страницах:

вместо мигающей хтони анимации будет отображаться один статичный кадр.

Нетрудно догадаться, что этим сильно снижается нагрузка на CPU/GPU (особенно в случае устаревшего оборудования), с чего происходит серьезная экономия заряда батареи.

Так что очень рекомендую к использованию.

Ungoogled Chromium и установка расширений

К сожалению для установки расширений из официального магазина для «левого» Ungoogled Chromium необходимо специальное расширение, без которого вас обрадуют ошибкой:

CRX_REQUIRED_PROOF_MISSING

А кнопка установки в интерфейсе магазина окажется скрытой.

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

Теперь переходим к самому интересному — к параметрам запуска.

❯ Параметры Chrome

У браузера Chrome есть огромное количество разнообразных параметров запуска, как документированных так и не очень. Часть из них дублируется во внутреннем служебном интерфейсе chrome://flags/, часть — нет.

Так выглядит служебный интерфейс с настройками браузера Chrome

Так выглядит служебный интерфейс с настройками браузера Chrome

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

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

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

Так выглядит небольшая часть параметров в динамике:

Тут показано менее 1% всех параметров запуска браузера

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

Поехали.

--enable-features=VaapiVideoDecoder,VaapiVideoEncoder

Параметр --enable-features= как нетрудно догадаться из названия используется для принудительного включения опций браузера.

В данном случае принудительно включаются кодеки для аппаратного декодирования видео, работающие на базе Video Acceleration API (VAAPI).

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

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

Комфортно смотреть видео даже на современном железе без работающего VAAPI вряд ли получится из-за сильной загрузки процессора, поэтому настройка актуальна для всех пользователей.

--enable-gpu-rasterization

Данный ключ принудительно включает аппаратную отрисовку страниц с помощью GPU:

Chrome 37 introduced a GPU rasterizer. When enabled, some paint workloads can go from 100ms/frame to 4-5ms/frame.

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

--disable-gpu-compositing

Принудительное отключение GPU-реализации композитора страниц.

Актуально для сильно устаревшего оборудования, вроде моего Asus F3KE, поскольку GPU-композитор на нем порождает совершенно дикие визуальные артефакты:

Феерический баг

--enable-zero-copy

Согласно строчке с описанием в исходном коде браузера:

Enable rasterizer that writes directly to GPU memory associated with tiles.

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

--disable-background-networking

Запрещает браузеру использовать фоновые сетевые запросы, например проверку обновлений для установленных расширений.

--disable-client-side-phishing-detection

Отключает фоновую проверку сайтов на фишинг.

Этот параметр вроде как удален в новых версиях браузера, но все еще часто встречается в различных руководствах и материалах.

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

--disable-prompt-on-repost

Отключает дурацкое предупреждение о повторной отправке формы:

--disable-sync

Отключает облачную синхронизацию учетной записи Google.

Актуально только для обычного Chromium, для ungoogled-версии не используется, поскольку функционал глобальной учетной записи там вырезан.

--metrics-recording-only

Указывает браузеру только записывать отчеты с метриками производительности, но запрещает отправлять их на сервера Google. Отчеты сохраняются в текущем профиле, актуальны при поиске проблем с медленной работой браузера или отдельных сайтов.

--no-first-run

Отключает приветственный диалог при первом запуске браузера.

--safebrowsing-disable-auto-update

Отключает автоматическое фоновое обновление баз для «Safe Browsing» — специального сервиса Google для защиты от фишинга и подозрительных сайтов. Актуально для обычного Chromium, поскольку в ungoogled‑версии функционал «Safe Browsing» удален.

--ignore-gpu-blocklist

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

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

--renderer-process-limit=2

Еще один «магический» параметр, критически влияющий на производительность браузера и потребляемые ресурсы:

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

Количество таких процессов напрямую влияет на потребляемые ресурсы, поэтому в случае ограниченных ресурсов стоит выставить какое-то небольшое число.

--disable-smooth-scrolling

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

Влияет настолько сильно, что разницу становится видно визуально после перезапуска.

--wm-window-animations-disabled

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

--animation-duration-scale=0

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

--disable-spell-checking

Отключает фоновую проверку правописания, которая серьезно влияет на скорость работы браузера (вплоть до подвисания страниц).

--enable-unsafe-swiftshader

Еще один важный параметр, который разрешает использование «небезопасного» программного рендера WebGL, что позволяет использовать 3D-графику в браузере даже на устаревшем оборудовании, которое не поддерживает современное Vulkan API.

--disable-features=WhatIsNewPage,Promotions,LensOverlay,OptimizationGuideOnDeviceMode

Данный параметр по прямой аналогии с описанным в самом начале --enable-features= переопределяет опции браузера, которые необходимо отключить.

В данном случае отключаем встроенную рекламу новых фич браузера, которые вылезают при обновлениях и очень сильно бесят отвлекают.

Актуально только для обычного Chromium, поскольку в ungoogled-версии все эти радости вырезаны целиком.

Теперь рассказываю для самой широкой аудитории — про оптимизацию браузера под Windows.

Прокрутка ленты Reddit в качестве демонстрации, поскольку Reddit — один из самых «тяжелых» популярных сайтов, известных автору

❯ Хром и Windows

Я использую Windows 11, 10 и 7 на рабочих станциях а также множество разных виртуальных машин с серверными версиями Windows.

Поскольку оптимизации актуальны только при использовании браузера на рабочей станции (мало кому интересно работать из браузера прямо с сервера, правда?), поэтому в качестве тестовой среды будут выступать только три пользовательских версии Windows: 11, 10 и 7.

Технические характеристики машины из ролика с лентой Reddit

Технические характеристики машины из ролика с лентой Reddit

Скрипт запуска выглядит следующим образом:

chrome.exe --enable-features=VaapiVideoDecoder,VaapiVideoEncoder^

--disable-features=WhatIsNewPage,Promotions,LensOverlay^

--enable-gpu-rasterization^

--disable-gpu-compositing^

--enable-zero-copy^

--disable-background-networking^

--disable-client-side-phishing-detection^

--disable-prompt-on-repost^

--disable-sync^

--metrics-recording-only^

--no-first-run^

--safebrowsing-disable-auto-update^

--ignore-gpu-blocklist^

--renderer-process-limit=4^

--disable-smooth-scrolling^

--wm-window-animations-disabled^

--animation-duration-scale=0^

--enable-unsafe-swiftshader %*

Сохраняете текст выше в файле run.cmd, кладете в каталог рядом с chrome.exe и используете для первого запуска.

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

Замечу, что символ ^ — аналог \ в UNIX-мире и используется для переноса длинных строк в командных скриптах под Windows.

Если что‑то перенесется неправильно — просто удаляете символы ^ и сводите все в одну длинную строку.

Также добавлю, что в последние версии и Chrome (и даже Chromium) под Windows авторы напихали AI-фич под завязку, поэтому на моих рабочих станциях с Windows ныне используются только и исключительно Ungoogled-сборки.

Ungoogled Chromium на Windows 7 со всем тюнингом. Справа менеджер задач и загрузка памяти

Chrome и старые Windows

Официально Google перестала поддерживать Windows 7 для Chrome/Сhromium еще в 2023 году, поэтому если у вас осталась живая «семерка» и есть необходимость использовать современный браузер — будут определенные сложности.

Обратите внимание на версию браузера и дату сборки

Обратите внимание на версию браузера и дату сборки

Цитируя одну известную шутку: чем бы вы ни занимались — обязательно найдется азиат, который сделает еще круче. В случае с портированием Chrome на устаревшие версии Windows именно так и произошло:

стоило только начать изучать вопрос и доступные варианты — немедленно нашелся репозиторий со сборками последних версий Chrome... под Windows XP!

Windows XP вышла в далеком 2001м году и процесс портирования под настолько старую ОС был весьма непростым занятием. Вот тут выложены готовые сборки браузера под Windows XP с поддержкой аппаратного ускорения (!) — невероятный хардкор.

Теперь переходим к разделу для самых ярых фанатов своего дела.

Да, это современная сборка браузера Chrome, летающая на антикварном оборудовании. Без записи с экрана все работает еще быстрее

❯ Chrome и FreeBSD

Наконец последним разделом описываю то, с чего началась эта статья в далеком 2023-м году:

оптимизация работы браузера Chrome под FreeBSD на очень сильно устаревшем оборудовании.

«Очень сильно устаревший» — про тот самый Asus F3KE из 2007 года, спасенный автором от достойного погребения за долгую службу.

Так выглядит вывод fastfetch с описанием оборудования:

<a href="https://www.warhammer-community.com/en-gb/articles/iIP5RR4u/40-years-of-warhammer-even-in-death-i-still-serve/" target="_blank" rel="nofollow noopener">Even In Death, I Still Serve</a> (ц)

Even In Death, I Still Serve (ц)

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

Так выглядит скрипт запуска:

#!/usr/local/bin/bash

source ~/.exports.sh

/usr/local/bin/ungoogled-chromium
--enable-features=VaapiVideoDecoder,VaapiVideoEncoder \
--enable-gpu-rasterization \
--disable-gpu-compositing \
--enable-zero-copy \
--disable-background-networking \
--disable-prompt-on-repost \
--metrics-recording-only \
--no-first-run \
--ignore-gpu-blocklist --renderer-process-limit=2 \
--wm-window-animations-disabled \
--animation-duration-scale=0 \
--enable-unsafe-swiftshader "$@"

Поскольку во FreeBSD довольно давно используется ungoogled-версия браузера, поэтому были убраны параметры для того функционала, который был вырезан в ungoogled-версии.

Строка:

source ~/.exports.sh

на самом деле скрывает портал в ад отдельный механизм повторного использования сессии DBus, подключаемый тут файл ~/.exports.sh создается вот таким специальным скриптом:

#!/usr/local/bin/bash

FF=0

if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
lines=$(pgrep "dbus-daemon" -u "$USER" | (while read -r line
do
echo $line
exp=`procstat -h -e $line`
if [[ "$exp" == *"DBUS_SESSION_BUS_ADDRESS="* ]]; then
echo "DBus session found"
exp2=`echo $exp |sed 's/.*DBUS_SESSION_BUS_ADDRESS=\([^ ]*\).*/\1/'`
echo export DBUS_SESSION_BUS_ADDRESS="$exp2" > ~/.exports.sh
FF=1
break
fi
done; echo $lines) )
echo $FF
if [[ "$FF" = 8 ]]; then
echo "DBus session not found, starting.."
dbus_out=`dbus-launch`
echo $dbus_out > ~/.exports.sh
fi
if [[ -f ~/.exports.sh ]]; then
source ~/.exports.sh
fi
fi

Этот скрипт натуральным образом ворует сессию работы с DBus, забираясь в окружение другого запущенного процесса (да, так можно было) — все ради того чтобы не запускать процесс dbus-launch повторно.

Помимо приседаний с параметрами, в версии для FreeBSD также используется описанное выше расширение браузера для отключения анимации, но вместо изоляции через cgroups используется более простой вариант со сниженным лимитом на количество запущенных процессов рендера:

--renderer-process-limit=2

Чего вполне достаточно для комфортной работы.

❯ За кадром

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

--profile-directory=test-profile

Указывает альтернативное название профиля, по-умолчанию он называется Default и находится в каталоге пользователя.

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

--single-process

Заклинание чудовищной силы, которое заставляет браузер работать в одном единственном процессе:

Браузер Chrome, работающий целиком в одном процессе. Шок-контент

Браузер Chrome, работающий целиком в одном процессе. Шок-контент

Этот весьма опасный (во всех смыслах) параметр переключает Chrome в нестандартный режим работы, при котором браузер не порождает отдельные процессы на каждую вкладку.

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

Тем не менее, это единственный известный мне способ заставить Chrome работать без порождения дополнительных процессов.

--disable-features=UseSkiaRenderer

Отключает бекэнд Skia Renderer, используемый для отрисовки практически всей графики:

Chrome uses Skia for nearly all graphics operations, including text rendering. GDI is for the most part only used for native theme rendering; new code should use Skia.

К сожалению этот параметр является обязательным если вы собираетесь использовать --single-process, думаю очевидно что скорость отрисовки страниц при этом упадет.

❯ Эпилог

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

Поэтому с радостью почитаю про ваш опыт и применяемые практики.


Автор текста: alex0x08

Написано при поддержке Timeweb Cloud

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.


📚 Вам может быть интересно:

Реклама. ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 18
11

Обновили ядро Linux на всех Ryzen-серверах в Москве

В копилку стабильности — и с конкретным обновлением под капотом.

Во время работы с высокопроизводительными серверами на Ryzen 7950X нашли причину редких зависаний нод. На старом ядре Ubuntu 22.04 эти процессоры могли работать нестабильно.

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

Чтобы устранить проблему, обновили ОС и ядро на всех Ryzen-серверах в московской локации.

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

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

Если вам нужны мощные серверы в Москве, есть еще одна новость — расширили парк Ryzen 7950X, чтобы было больше доступных конфигураций под ваши проекты.

Показать полностью 2
37

Оживление android-планшета глазами новичка. Как я нашел себе классную читалку на лето

По личным ощущениям, индустрия планшетов потихоньку отошла на второй план у массовых пользователей. И речь сейчас про буквально все сегменты, от недорогих устройств на Android до всей линейки iPad. Эта история осталась актуальной для гораздо более узкой прослойки людей, как будто.

Я же, в свою очередь, любил свой iPad сначала mini второго поколения (еще в студенческие годы), а затем и Air 2, который дожил до 2023 года, пока его случайно не разбила старшая дочь. Но вот как-то новый мне покупать не хотелось — я банально не нашел ни одной причины это делать по большей части.

А недавно, разбирая шкафы в квартире родителей, я нашел артефакт — Samsung Galaxy Tab A8. Компактный, красивый и, что самое главное, рабочий. И тут возникла у меня идея, ход исполнения и результаты которой я и расскажу в этом материале.

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

❯ Автор, на кой ты туда полез?

С одной стороны, ну валяется старый планшет (а скорее даже фаблет, потому что там аж два слота под сим-карту) и пусть, зачем тебе он нужен? Справедливо и весьма обоснованно спросит меня читатель.

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

Из этого весьма компактного (а в случае меня ростом 194 сантиметра так вообще карманного) планшета выйдет, например, неплохая читалка книг и манги.

Что? На телефоне читать? Увольте. Телефон — это мессенджеры, пуш-уведомления и работа, я за раздельное употребление контента и деятельности, о чем мы когда-нибудь поговорим отдельно.

❯ Он неплохо работает из коробки, зачем заниматься кастомной прошивкой

Первое, что я попытался сделать, это начать использовать девайс на родной версии Android, здесь это древняя «пятерка».

И на удивление — планшет откровенно шустро работает на родной прошивке, всё плавно открывается, нигде ничего не виснет, и вообще всё отлично. Однако... за одним исключением.

Пятая версия Андроида как бы то ни было устарела в дрова. Ни один сайт не открывается, ссылаясь на проблемы с сертификатами и внутренними часами, приложения не устанавливаются, ссылаясь на битые пакеты и так далее.

То есть да, ни читалку, ни приложение с мангой (а по сути, только оно мне и надо) поставить сюда просто не получится. А значит... Давайте прошивать.

❯ Кастомная прошивка древних устройств руками человека что последний раз делал это в юношестве

Скажу сразу, последний раз темы рута, прошивок, кастомных рекавери и всего прочего я касался еще будучи студентом на своем модном планшете Explay, который правда впоследствии таки поменял на iPad.

Поэтому для меня километровые ветки на одном известном форуме сравни манускриптам Древнего Китая, а еще, как назло, даже на английском языке толкового контента конкретно по моей модели и нет.

В итоге кое как скомпилировав кучу информации... оказалось, что все не так страшно. Вот что я делал:

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

  • Скачал программу Odin и столкнулся с фактом, что она просто не видит планшет. Поменял провод... Бесполезно. Нашел дома еще один (а это, на секундочку, micro-USB) и тоже всё бестолку.

  • На этом этапе я уже трижды пожалел, что взялся за эту статью, и... понял, что мой компьютер, в общем-то, тоже планшет не видит, и, оказывается, надо ставить определенной версии драйвера, чтобы это исправить.

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

  • Из-под кастомного рекавери установил LineageOS, легкую и более-менее актуальную версию Android без лишнего софта.

И, по сути, всё. К счастью, мне не потребовалось ни разблокировать разгрузчик, ни шить через терминал, ни делать что-либо, что выходит за рамки «нормисного» юзера современной техники.

Планшет теперь работает на актуальной ОС, приложения устанавливаются и браузер работает. И вот теперь главный вопрос — а точно ли оно того стоило?

❯ Да, в целом оно того стоило

Зайду издалека. Я человек, что не очень сильно любит нынешний формат «всё в одном», когда у тебя смартфон — это и плеер, и читалка, и игровая приставка. Поэтому в своем рюкзаке, если я выхожу дольше чем на час, я очень комфортно (без шуток) таскаю то, что вы можете видеть на фото выше.

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

Поэтому старый планшет 2016 года на процессоре Qualcomm Snapdragon 410 APQ8016 с двумя гигабайтами памяти я определил для следующих задач:

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

  • Классика андроид-гейминга начала десятых. На этом планшете отлично полетит, например, Dead Space Mobile или классические Angry Birds, что более чем круто и вообще ностальгия.

  • Планшет нормально подходит для просмотра кино и видео на YouTube. Пару дней он просто жил на кухне в качестве экрана с подкастами. Звук, кстати, даже без наушников у него вполне норм..

  • Сомнительно для, наверное, всех, но не для меня. Здесь очень вайбовая камера на всего 5 мегапикселей, но фото получаются с отпечатком эпохи.

Как девайс справляется с этим? С нюансами. Главный — на LineageOS он работает и близко не так плавно, как на родном пятом Андроиде. Не слайд-шоу уровня китайских бюджетников 2013 года, но и не уровень современных среднебюджеток. Не критично, но плавности хочется больше.

Второй нюанс — не самый мощный аккумулятор (всего 4200 мАч) и медленная зарядка по старому разъему microUSB. При умеренном использовании его хватает на день, но заряжается он мучительно долго, и лучше всего оставлять на ночь.

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

Стоит ли покупать старый девайс и оживлять его по такому же принципу? Скорее нет, чем да, а если и стоит, то лучше какой-нибудь iPad Mini из тех же поколений — там банально экран и оптимизация будут получше.

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

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

Автор текста: AkaneKuroshiki

Написано при поддержке Timeweb Cloud

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.


📚 Вам может быть интересно:

ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 14
3

AI-агенты в связке с Cline, Codex и OpenCode

AI-агенты в связке с Cline, Codex и OpenCode

Наших AI-агентов и AI Gateway можно использовать прямо в инструментах разработки.

Подключаете один раз → и дальше задаете вопросы по проекту, редактируете код и запускаете команды в терминале — прямо в рабочем окне.

Как это устроено: среда обращается к модели через OpenAI-совместимый API по вашему ключу. Используете наши модели и инфраструктуру, а интерфейс — привычный редактор или окно чата.

Подключение сводится к трем полям в настройках расширения:

1️⃣Тип провайдера — OpenAI Compatible

2️⃣ Базовый URL агента или AI Gateway

3️⃣ И, наконец, ваш API-ключ.

Дальше можно отправлять запросы модели прямо из кода. Если используете AI Gateway, в настройках доступны и параметры генерации — размер контекста, лимит токенов, температура.

Подробнее о каждой среде в доке → Cline, Codex и OpenCode.

Показать полностью 1
75

Разбор медицинского анализатора: Bayer Clinitek Status+

Приветствую всех!

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

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


❯ Суть такова

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

Несколько лет назад известный в наших кругах товарищ @dlinyj скинул мне ссылку на объявление на вторичке, где продавался какой-то медицинский аппарат. Интерфейс на монохромном экране подозрительно напоминал PalmOS, что меня довольно сильно заинтересовало. Если WinCE не то что иногда встречается в спецоборудовании, а буквально была создана для него, то вот подобных девайсов на базе «пальмы» за исключением ТСД и электронной пишущей машинки я вообще не припоминаю. Цена той штуки была вполне молодёжная, и после недолгих раздумий я её заказал.

<a href="https://www.woernermedical.de/Praxisbedarf/Praxislabor/Laborgeraete/Point-of-Care/Siemens-Clinitek-Status-Plus-Geraet-f-Urinanalyse/p/28499" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Через неделю я стал обладателем некоего Bayer Clinitek Status+ — лабораторного анализатора мочи для выявления заболеваний почек или для проведения теста на беременность.

❯ Вообще

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

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

❯ Обзор оборудования

Ну что же, взглянем, что за девайс мне вообще достался.

А вот и подопытный экземпляр.

Спереди только экран и кнопка включения. Внизу под наклейкой отсек для лотка для препарата (с этого ракурса не виден).

Вид сбоку.

Сзади COM-порт для связи с компьютером и гнездо для БП. Над ними дверца отсека для бумаги.

Снизу заводская наклейка, отсек для батареек и единственный саморез.

❯ Запускаем

Ну что же, взглянем на девайс в работе.

Подаём питание и жмякаем кнопку включения.

Спустя несколько секунд девайс загружается и проходит самотестирование.

После этого на экране появляется вот такой интерфейс.

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

Это настройки прибора. Здесь довольно много пунктов, от диагностики до ввода данных об операторе.

Попробуем запустить какой-нибудь тест.

Из аппарата выезжает предметный столик, куда нужно положить тест-полоску, после чего жмякнуть на сенсорном экране START.

Никаких расходников к этому аппарату у меня нет, поэтому тест завершается провалом.

<a href="http://www.frankshospitalworkshop.com/equipment/documents/automated_analyzer/user_manuals/Siemens%20Clinitek%20Status%20Analyzer%20-%20User%20manual.pdf" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Поскольку тест-полосок у меня нет, обратимся к РЭ. После того, как образец загружен в аппарат и произведена автокалибровка, начинается тестирование.

<a href="http://www.frankshospitalworkshop.com/equipment/documents/automated_analyzer/user_manuals/Siemens%20Clinitek%20Status%20Analyzer%20-%20User%20manual.pdf" target="_blank" rel="nofollow noopener">Источник</a>

Источник

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

<a href="http://www.frankshospitalworkshop.com/equipment/documents/automated_analyzer/user_manuals/Siemens%20Clinitek%20Status%20Analyzer%20-%20User%20manual.pdf" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Пример кадра с результатами анализа.

❯ Внутренности

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

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

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

Внутри мы видим батарейный отсек и мотор привода предметного столика. Также виден датчик его выдвижения.

Провода батарейного отсека подпаяны к отдельным пятачкам. Сам шлейф пропущен через ферритовые кольца.

А это мотор, который выдвигает и задвигает предметный столик.

Он же отдельно. Для возможности его мытья он специально сделан съёмным.

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

Продолжаем разбирать.

Сняв верхнюю часть и отключив парочку шлейфов от дисплея, видим плату управления. Справа от неё термопринтер для распечатки отчётов.

Плата отдельно. Увы, процессора MC68000 на ней не оказалось. Таким образом, работает эта штука не на PalmOS, а на какой-то RTOS или даже чём-то попроще.

ПЛИС явно занимается обработкой сигнала с датчика.

А это HD64F13006F20V — 16-битный управляющий МК.

С обратной стороны платы батарейка RTC, несколько электролитических конденсаторов, пищалка и слот под SD-карту.

Откручиваем ещё один винт и снимаем пластиковое крепление платы.

Под ним сердце прибора — оптическая часть.

Крышка закреплена простыми саморезами, так что снимем её. Вся оптика находится в ней.

На этой плате расположены подсвечивающие образец светодиоды — RGB и УФ.

Сняв металлическую пластину, видим внутренности оптической системы.

Чёрная рамка закрывает ПЗС-матрицу, над ней расположен объектив. Закрученные с локтайтом винты намекают на то, что, не имея алгоритма юстировки, разбирать это всё лучше не стоит.

Световод из оргстекла. Закреплён он ни на чём не был, просто прижимался крышкой с расположенной на ней оптикой.

Больше на шасси прибора ничего интересного нет.

Дисплейный модуль.

Обратная сторона. Маркировка не гуглится, но, судя по всему, у дисплея достаточно простой параллельный интерфейс, который при необходимости легко можно отреверсить.

❯ Как работает этот девайс

Как можно видеть, на самом деле какой-то экзотической начинки конкретно в этом девайсе нет. Здесь практически весь анализ делает не электроника, а химия.

<a href="https://medpostavka.su/product/6l/" target="_blank" rel="nofollow noopener">Источник</a>

Источник

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

Более подробно это всё описано тут, так что повторяться не буду.

Так вот. Раз существуют такие штуки с обычной бумажной контрольной шкалой, то почему бы не автоматизировать их считывание? Такое решение позволит ускорить процесс, а заодно и сделать анализ более точным и менее чувствительным к ошибкам оператора.

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

<a href="https://gezond-centrum.nl/ru/poloski-dlya-analiza-mochi/169171-multistiks-poloski-dlya-mochi-8-sht-100-sht-5016003230400.html" target="_blank" rel="nofollow noopener">Источник</a>

Источник

А вот пример того, с чем работает данный аппарат.

<a href="https://www.siemens-healthineers.com/de/urinalysis-products/urinalysis-reagents/clinitest-hcg-pregnancy-test" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Также в него можно вставлять вот такие вот тест-кассеты, использующиеся для более точных (в сравнении с привычными нам) тестов на беременность.

А это щель сканера, с обратной стороны которой находится световод.

При каждом включении девайс калибруется, сканируя белую полоску на предметном столике.

Попробовал запечатлеть процесс сканирования, заслонив концевик и включив прибор.

❯ Так что в итоге?

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

Что же до изначальной цели приобретения этой штуки, то, как уже было сказано ранее, никакой PalmOS в нём не оказалось. Так что, возможно, спецоборудования на базе «пальм» (за исключением различных адаптеров к серийным КПК) не существовало вовсе.

Такие дела.


Автор текста: MaFrance351

Написано при поддержке Timeweb Cloud

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.


📚 Вам может быть интересно:

Реклама. ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 40
11

IPv6 в базах данных


Теперь облачной базе данных можно выдать бесплатный публичный IPv6-адрес.

Полезно, если:

1️⃣ Уже раскатали IPv6 в своей инфраструктуре и не хотите держать IPv4 только ради базы

2️⃣ Масштабируете проект и постепенно уходите от дефицитных IPv4-адресов

3️⃣ Строите cloud-native или корпоративную инфраструктуру, где важна поддержка IPv6.

Подключается в пару кликов: при создании новой базы или в настройках существующей «Сеть» → «Публичный IPv6-адрес». Если переключателя IPv6 у базы нет — значит, на вашей сети он пока недоступен.

При защищенном TLS-подключении адрес автоматически привяжется к техническому домену базы. Остальные детали в документации →

Фича появилась не случайно — ее давно просили в разделе идей (тут и тут), теперь она в проде.

Привязать айпишник к базе →

Показать полностью
220

Почему мы до сих пор неправильно пишем физические движки и 3D-графику

Стоит открыть исходники любого современного игрового движка – неважно, это C++-рендер, сделанный на коленке, или какая-нибудь гигантская экосистема вроде Unity или Unreal Engine – вы первым делом натыкаетесь на одни и те же знакомые сущности. Все вокруг живет в Vector3: координаты, направления движения, точки столкновений. Каждая частица указывает, куда она смотрит, с помощью Quaternion. А если требуется что-то покруче – переносить и одновременно крутить объект, то Matrix4x4. Это уже как стандарт де-факто: кто пробовал крутить объекты руками, тот точно переписывал код с этими структурами. Ещё конечно же отдельно существуют лучи, плоскости, сферы, bounding boxes, а между ними тянутся километры функций вроде dot(), cross(), normalize(), lookAt(), inverse(), project() и бесконечных преобразований типов.

Привыкаешь к этому быстро. Нам кажется совершенно естественным тасовать эти типы между собой – уж слишком давно так делается по всей индустрии. Но стоит лишь чуток задуматься, и начинает прорезаться легкий когнитивный диссонанс: выходит, вся наша графика построена на наборах несовместимых между собой математических запчастей. Для одного действия нам нужен один тип данных, для второго – другой, а пересчитать простое столкновение луча со сферой или плоскостью без пятого велосипеда никак не получается. Вроде бы всё работает и даже неплохо работает… Но ощущение конструктора из костылей не отпускает.

И самое интересное заключается в том, что так было не обязательно.


И тут интересно вспомнить XIX век. Тогда математики как раз ломали головы над тем, чтобы придумать нормальный универсальный язык для описания пространства – не мелочиться кучей частных формул на каждый случай жизни. William Rowan Hamilton придумывает кватернионы: компактный инструмент для вращений в пространстве, который становится сегодня основой всей компьютерной анимации (даже те же Unity и Unreal ими внутри манипулируют).

<a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D1%82%D0%B5%D1%80%D0%BD%D0%B8%D0%BE%D0%BD" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Графическое представление таблицы умножения базисных кватернионов (цвет шара определяет первый множитель, цвет выходящей стрелки – второй множитель, стрелка указывает на результат умножения)

<a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D1%82%D0%B5%D1%80%D0%BD%D0%B8%D0%BE%D0%BD" target="_blank" rel="nofollow noopener">Источник</a>

Источник

Параллельно Hermann Grassmann выносит мозг коллегам идеей: почему бы алгебре не оперировать сразу плоскостями и объемами целиком? Ну действительно: мы привыкли складывать числа и векторы, а как быть с более сложными сущностями? Дальше подключается William Kingdon Clifford, собирает всё это в одну систему – получает Геометрическую Алгебру.

По сути, Клиффорд пытался создать универсальную операционную систему для геометрии.Но индустрия пошла другим путем.

Когда физикам и инженерам понадобилась удобная математика для электромагнетизма и механики, Josiah Willard Gibbs и Oliver Heaviside взяли идеи Клиффорда и разрезали их на части. Из цельной алгебры были извлечены только самые прикладные куски – скалярное и векторное произведения. Так появился привычный нам vector calculus, который сегодня преподают во всех технических вузах и используют почти все графические API.

Фактически современная графика работает не на полной геометрической теории, а на ее урезанной инженерной версии. Проблема этой урезанности особенно хорошо видна на векторном произведении. Все знают формулу:

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

Клиффорд предложил гораздо более общую идею. Вместо отдельного скалярного и отдельного векторного произведения он ввел единую операцию:

На первый взгляд формула выглядит странно. Слева произведение двух векторов, справа сумма каких-то совершенно разных объектов. Но именно здесь скрывается главная идея Геометрической Алгебры.

Первая часть привычное скалярное произведение. Число. Ничего нового. А вот – это внешнее произведение Грассмана. И его результатом является не вектор, а новый геометрический объект – бивектор.

Бивектор очень трудно понять, если смотреть на него через призму привычной линейной алгебры. Нас с детства учили, что результат взаимодействия двух векторов – это либо число, либо еще один вектор. Но Грассман предложил мыслить иначе. Если два вектора натягивают параллелограмм, то естественным результатом их комбинации должна быть сама ориентированная площадь этого параллелограмма. Не стрелочка, торчащая перпендикулярно плоскости. А сама плоскость.

Бивектор хранит площадь и ориентацию обхода. По сути, это элемент поверхности. Вот тут у многих мир переворачивается: оказывается наше привычное векторное произведение («дай-ка найду нормаль к плоскости») – это такой засекреченный хак ради удобства старой учебной математики! Мы подсознательно заменяем настоящую плоскость перпендикулярным ей вектором просто потому, что так проще считать по старинке. Но Геометрическая Алгебра говорит: зачем вообще выбрасывать информацию о самой плоскости?

<a href="https://habr.com/ru/articles/542030/" target="_blank" rel="nofollow noopener">Источник</a>

Источник

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

А затем появляется самая странная и одновременно самая мощная концепция – мультивектор. А дальше начинается магия серьёзной математики. Стоит расширить наше 3D-пространство до пятимерного (!) за счет двух спец-направлений – одно станет отвечать за начало координат вселенной, другое символизирует бесконечность во всех смыслах слова. Получаем Conformal Geometric Algebra (CGA): звучит максимально экзотично и сначала похоже на сугубо теоретические упражнения… Но вот что удивительно: CGA позволяет описывать сферы, окружности и прочие объекты как такие же элементы своей алгебры так же естественно, как вы оперируете обычными точками или прямыми.

Выглядит всё это так будто из учебника магии для программиста. На практике же происходит нечто почти магическое: все геометрические объекты начинают описываться одинаково.Точка становится мультивектором. Сфера становится мультивектором. Плоскость тоже становится мультивектором. Причем в CGA плоскость фактически является сферой бесконечного радиуса. Это уже не отдельный тип сущности, а частный случай более общего объекта.

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

Сегодня практически любой физический движок содержит десятки специализированных функций:

IntersectRaySphere()
IntersectRayPlane()
IntersectSphereSphere()
IntersectCapsuleTriangle()

Каждая написана отдельно. У каждой свои edge cases. В каждой свои проверки на epsilon, вырожденные случаи и численные артефакты.

В CGA идея совершенно другая: пересечение – это не набор специальных алгоритмов, а базовая операция самой алгебры. Вместо огромного набора формул появляются универсальные операции вроде внешнего произведения или операции Meet. Геометрия начинает выглядеть не как коллекция инженерных костылей, а как цельная система преобразований. Еще более радикально это проявляется в трансформациях.

Современная графика использует целый зоопарк представлений. Повороты кодируются кватернионами. Переносы – матрицами. Масштабирование – другими матрицами. Для анимации часто добавляются dual quaternions. Внутри движка постоянно происходит конвертация между разными представлениями одной и той же геометрии.

В CGA все это заменяется единым объектом – ротором. Любое преобразование записывается одинаково:

И неважно, что именно делает RR. Если он кодирует вращение – объект повернется. Если перенос – объект сдвинется. Если масштаб – масштабируется. Формула остается одной и той же.

Для человека, который годами писал графический код, это выглядит почти незаконно. Особенно впечатляет то, как меняется сам стиль программирования. Например, в библиотеке clifford код начинает напоминать скорее школьную геометрию, чем традиционный graphics programming:

from clifford.g3c import *

# Создаем две точки в конформном пространстве
point1 = up(eo + 1*e1)
point2 = up(eo + 5*e1)

# Линия - это просто внешнее произведение двух точек и бесконечности
line = point1 ^ point2 ^ einf

# Сфера с центром в point1 и радиусом r
r = 2.0
sphere = point1 - 0.5 * (r**2) * einf

# Ищем пересечение линии и сферы. ОДНА СТРОЧКА!
intersection = line.meet(sphere)

В этом фрагменте почти шокирует отсутствие привычных вещей. Нет матриц. Нет ручной тригонометрии. Нет вызовов cos() и sin(). Нет километров условий вроде if(dot < 0). Код начинает выражать не алгоритм вычисления, а саму геометрическую идею. Именно поэтому многие люди, впервые столкнувшиеся с GA, испытывают странное чувство. Возникает ощущение, будто вся современная 3D-графика десятилетиями решала геометрические задачи окольным путем.

Но тогда возникает очевидный вопрос: если Геометрическая Алгебра настолько красива, почему индустрия до сих пор массово не перешла на нее?

Потому что у этой красоты есть цена. Главная проблема – производительность. В конформной алгебре мультивектор в 5D содержит  коэффициента. Для сравнения: обычный Vector3 хранит всего три числа. То есть даже простая точка внезапно становится огромной структурой данных. Для CPU-кэша и особенно для GPU это настоящая катастрофа.

Современные видеокарты десятилетиями оптимизировались под операции над четырехкомпонентными векторами и матрицами 4×4. Под них существуют SIMD-инструкции, специализированные блоки вычислений, драйверы и шейдерные пайплайны. Вся индустрия буквально выращена вокруг матричной математики. GA пока остается чужаком на этом празднике жизни.

Есть и другая проблема – психологическая. Геометрическая Алгебра требует полностью перестроить мышление. Разработчик должен отказаться от привычной модели вектор + матрица + кватернион и начать воспринимать геометрию как единую алгебраическую систему. Это не просто новая библиотека. Это почти смена языка мышления.


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

Самое интересное, что индустрия может прийти к Геометрической Алгебре не через университеты, а через компиляторы. Уже появляются генераторы кода, которые умеют анализировать мультивекторы на этапе сборки, выкидывать нулевые коэффициенты и превращать красивые абстрактные формулы в очень эффективные SIMD-инструкции. То есть разработчик пишет чистую геометрию, а компилятор превращает ее в быстрый машинный код.

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

Возможно, правильная математика для графики была придумана еще в XIX веке. И мы только начинаем к ней возвращаться.

Всем спасибо за внимание!


Автор текста: asomegoodboy

Написано при поддержке Timeweb Cloud

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.


📚 Вам может быть интересно:

Реклама. ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 7
11

Вы можете победить бинарный поиск

Иногда нам нужно найти значение в отсортированном массиве. Простейший алгоритм заключается в последовательном переборе значений, пока мы не встретим искомое значение или не достигнем конца массива. Такой алгоритм иногда называют линейным поиском. В C++ добиться такого же эффекта можно с помощью функции std::find.

Для больших массивов лучшего результата можно достичь с помощью бинарного поиска. Бинарный поиск является классическим алгоритмом, который эффективно находит целевое значение в отсортированном массиве, многократно деля интервал поиска пополам. Начиная со всего массива, он сравнивает целевое значение со средним элементом: если цель меньше, верхняя половина отбрасывается; если больше — отбрасывается нижняя. Этот процесс продолжается, пока цель не будет найдена или интервал не станет пустым. На больших наборах данных бинарный поиск значительно быстрее линейного. В C++ он реализован функцией std::binary_search, которая возвращает true или false в зависимости от существования элемента.

Популярный формат Roaring Bitmap использует массивы 16-битных целых чисел размером от 1 до 4096 элементов. Иногда нам приходится проверить, существует ли значение в этом массиве. Для этого мы используем бинарный поиск.

Я захотел создать более быстрый подход. У меня были две мысли:

  1. Практически все процессоры сегодня имеют инструкции для параллельной обработки данных (также называемая SIMD), которые могут проверять несколько значений за раз. И 64-битные ARM, и x64 процессоры (Intel/AMD) всегда поддерживают сравнение восьми 16-битных чисел с искомым значением используя всего одну инструкцию. Это подсказывает, что не стоит углубляться в бинарном поиске до блоков размером меньше восьми элементов. Кроме того, имеет смысл сравнивать шестнадцать элементов и больше.

  2. Бинарный поиск проверяет одно значение за раз. Однако, современные процессоры могут загружать и проверять более одного значения одновременно. Они обладают прекрасным параллелизмом на уровне памяти. Это говорит о том, что вместо бинарного поиска, стоит попробовать четверичный поиск: вместо того чтобы делить массив пополам, мы можем разделить их на четыре части. Конечный результат может потребовать чуть больше инструкций, но количество инструкций перестанет являться ограничивающим фактором.

Так я и создал алгоритм, который называю SIMD Quad. Это эффективный алгоритм поиска в отсортированных массивах с 16 битными беззнаковыми целыми числами, сочетающий четверичный интерполяционный поиск с SIMD (Single Instruction, Multiple Data). Алгоритм делит массив на блоки фиксированного размера по 16 элементов (возможно, за исключением последнего блока) и использует последний элемент каждого блока как интерполяционный ключ, чтобы быстро сузить область поиска до одного блока, а затем применяет SIMD-инструкции для одновременной проверки всех 16 элементов в этом блоке.

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

  1. Начальная проверка: если в массиве менее 16 элементов, выполняется простой линейный поиск

  2. Разбиение на блоки: массив делится на блоки по 16 последовательных элементов. Для массива размером cardinality существует num_blocks = cardinality / 16 полных блоков.

  3. Четверичный интерполяционный поиск: используем последний элемент каждого блока (на позициях 16-1, 32-1 и других) как ключи для интерполяции. Поиск выполняет четверичную (по основанию 4) интерполяцию, чтобы найти блок, в котором, вероятно, находится целевое значение. Это включает в себя сравнение цели с точками, делящими текущий диапазон поиска на четверти.

  4. Выбор блока: после сужения диапазона выбирается подходящий индекс блока lo на основе результатов интерполяции.

  5. SIMD-проверка: если найден верный блок, 16 элементов загружаются в SIMD-регистры (с использованием NEON на ARM или SSE2 на x64), после чего выполняются параллельные сравнения на равенство с целевым значением. Если найдено найдено хотя бы одно совпадание, возвращается true.

  6. Проверка остатка: для элементов, не вошедших в полные блоки (остаток) выполняется линейный поиск.

Каковы результаты этого? Я написал бенчмарк. Бенчмарк работает следующим образом: для каждого массива размером от 2 до 4096 элементов генерируется 100,000 сортированных массивов с 16-битными беззнаковыми целыми числами. Для каждого размера выполняется 10 миллионов запросов на принадлежность в «холодном» режиме (каждый запрос ищет в другом массиве, имитируя промахи кэша) и 10 миллионов запросов в «горячем» режиме (запросы сгруппированы по массивам, каждый массив обыскивается 100 раз подряд, имитируя попадания в кэш). Бенчмарк измеряет среднее время на один запрос для трёх алгоритмов: линейного поиска (std::find), бинарного поиска (std::binary_search) и нового алгоритма SIMD Quad.

Я использую две системы: Apple M4 с Apple LLVM и процессор Intel Emerald Rapids с GCC.

Во-первых, давайте сравним линейный и бинарный поиск.

Intel/GCC

Intel/GCC

Apple/LLVM

Apple/LLVM

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

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

Мы установили, что бинарный поиск является чистым победителем по линейному поиску. Давайте теперь сравним с алгоритмом SIMD Quad.

Intel/GCC

Intel/GCC

Apple/LLVM

Apple/LLVM

Результаты заметно различаются между Intel и Apple. На Intel SIMD Quad более чем вдвое быстрее бинарного поиска на «горячем» кэше. На «холодном» кэше преимущества меньше. На платформе Apple ситуация обратная: именно на «холодном» кэше SIMD Quad оказывается более чем вдвое быстрее, тогда как на «горячем» кэше выигрыш более скромный.

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

SIMD-компонент алгоритма довольно прост: мы используем специализированные инструкции, которые сокращают объем работы. ПОэтому легко понять, почму это может ускорить процесс - меньше инструкций, меньше ветвлений.

Но как насчет «четверичной» (quad) части? Тогда я опробовал бинарную версию того же алгоритма. В нем присутствует та же SIMD-оптимизация, но я отказался от четверичного интерполяционного поиска и заменяю его стандартным бинарным поиском.

Intel/GCC

Intel/GCC

Apple/LLVM

Apple/LLVM

Говоря простыми словами, подход с четверичным поиском (quad) почти и не дает эффекта на Apple, однако на Intel он является неплохой оптимизацией для больших массивов в «холодном» режиме. Четверичный поиск лучше задействует параллелизм на уровне памяти на моём Intel-сервере.

Мой исходный код доступен.


Заключение: мои результаты говорят о том, что, хотя классический бинарный алгоритм из учебника — вполне достойный, его можно улучшить, причем ощутимо. Стандартные алгоритмы зачастую не проектировались под компьютеры с таким объемом параллелизма. Алгоритм SIMD Quad пытается задействовать и параллелизм на уровне памяти, и параллелизм на уровне данных. Более того, я подозреваю, что можно добиться даже большего, чем даёт мой алгоритм. Будьте креативнее!

❯ Исходный код

bool simd_quad(const uint16_t *carr, int32_t cardinality,
uint16_t pos) {
constexpr int32_t gap = 16;
if (cardinality < gap) {
for (int32_t j = 0; j < cardinality; j++) {
if (carr[j] == pos) return true;
}
return false;
}
int32_t num_blocks = cardinality / gap;
int32_t base = 0;
int32_t n = num_blocks;
while (n > 3) {
int32_t quarter = n >> 2;

int32_t k1 = carr[(base + quarter + 1) * gap - 1];
int32_t k2 = carr[(base + 2 * quarter + 1) * gap - 1];
int32_t k3 = carr[(base + 3 * quarter + 1) * gap - 1];

int32_t c1 = (k1 < pos);
int32_t c2 = (k2 < pos);
int32_t c3 = (k3 < pos);

base += (c1 + c2 + c3) * quarter;
n -= 3 * quarter;
}
while (n > 1) {
int32_t half = n >> 1;
base = (carr[(base + half + 1) * gap - 1] < pos)
? base + half : base;
n -= half;
}
int32_t lo = (carr[(base + 1) * gap - 1] < pos)
? base + 1 : base;

if (lo < num_blocks) {
const uint16_t *blk = carr + lo * gap;
#ifdef __ARM_NEON
uint16x8_t needle = vdupq_n_u16(pos);
uint16x8_t v0 = vld1q_u16(blk);
uint16x8_t v1 = vld1q_u16(blk + 8);
uint16x8_t hit = vorrq_u16(vceqq_u16(v0, needle),
vceqq_u16(v1, needle));
return vmaxvq_u16(hit) != 0;
#else
__m128i needle = _mm_set1_epi16((short)pos);
__m128i v0 = _mm_loadu_si128((const __m128i *)blk);
__m128i v1 = _mm_loadu_si128((const __m128i *)(blk + 8));
__m128i hit = _mm_or_si128(_mm_cmpeq_epi16(v0, needle),
_mm_cmpeq_epi16(v1, needle));
return _mm_movemask_epi8(hit) != 0;
#endif
}

for (int32_t j = num_blocks * gap; j < cardinality; j++) {
uint16_t v = carr[j];
if (v >= pos) return (v == pos);
}
return false;
}


Автор оригинальной статьи: Daniel Lemire

Автор перевода: DrArgentum

Написано при поддержке Timeweb Cloud

Больше интересных статей и новостей в нашем блоге на Хабре и телеграм-канале.


📚 Вам может быть интересно:

Реклама. ООО «ТАЙМВЭБ.КЛАУД», ИНН: 7810945525

Показать полностью 7
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества