Skia — это библиотека 2D-графики с открытым исходным кодом, которая предоставляет функции обработки графики, такие как контуры, текст, изображения и рендеринг. Первоначально он был разработан компанией Skia Inc., которая позже была приобретена Google, и используется в нескольких продуктах Google, включая браузер Chrome и операционную систему Android. Студенты, занимающиеся разработкой систем Android, должны быть знакомы со Skia. Skia небольшая и эффективная система, предоставляет богатый набор API-интерфейсов, поддерживает несколько архитектур ЦП и рендеринг с ускорением на графическом процессоре, а также поддерживает Windows, Linux, Mac OS, Android и другие операционные системы. Он кроссплатформенный. Идеально подходит для разработки графических приложений, широко используется в мобильных приложениях, играх и профессиональных инструментах графического дизайна.
Раньше Skia использовалась в системе Android. Недавно из-за требований проекта возникла необходимость использовать Skia в Windows для обработки графики, поэтому я скомпилировал графическую библиотеку Skia под Windows согласно документации.
В официальной документации Skia есть такое предложение:
Skia uses generated code that is only optimized when Skia is built with clang. Other compilers get generic unoptimized code.
Я начал не соглашаться, когда увидел такое предложение. Подумайте, насколько большой может быть разница в оптимизации компилятора? Кроме того, метод компиляции, впервые представленный чиновником, также использует Visual Studio 2017 или Visual Studio 2019. При разработке C++ под Windows программисты в первую очередь должны думать о Visual C++ от Microsoft (с ним когда-то конкурировал C++ Builder от Borland). Хотя в проекте используется Qt, под Windows по-прежнему используется компилятор MSVC. Поэтому, недолго думая, я решил использовать компилятор Visual C++ для компиляции Skia.
Следуйте инструкциям в документе, чтобы загрузить исходный код Skia, выберите ветку Chrome/m122, а затем загрузите сторонние библиотеки, инструменты и т. д., которые здесь не будут обсуждаться. Последний шаг — скомпилировать Skia. Как упоминалось ранее, Skia поддерживает несколько архитектур ЦП и несколько методов рендеринга с ускорением графического процессора, поэтому он поддерживает несколько параметров компиляции. Skia использует систему сборки gn, которая предоставляет большое количество параметров для поддержки различных операционных систем, компиляторов и различных индивидуальных настроек. Например, размер библиотеки Skia.lib, которую я скомпилировал вначале, составлял более 500 МБ. Наконец, после настройки некоторых параметров, размер скомпилированной библиотеки Skia.lib составил всего более 20 МБ. Вот параметры, которые я наконец использовал для компиляции Skia с помощью компилятора MSVC:
bin\gn gen out\Release_msvc --args="extra_cflags=["/MT"] win_sdk="C:\Program Files (x86)\Windows Kits\10" win_sdk_version="10.0.20348.0" win_vc="c:\Program Files\Microsoft Visual Studio\2022\Community\VC" is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_enable_skparagraph=true skia_enable_skshaper=true skia_enable_skunicode=true
в:
win_sdk: если пакет SDK для Windows не установлен в расположении по умолчанию, необходимо указать этот параметр. win_sdk_version: если не указано, будет использоваться самая последняя версия. win_vc: если Visual Studio не установлена в расположении по умолчанию. вам необходимо указать этот параметр is_official_build: Обычно выбирайте false. Если вы компилируете только саму библиотеку Skia, вы можете выбрать true, но такие библиотеки, как jpeg и png, необходимо подготовить заранее. is_comComponent_build: false компилируется в статическую библиотеку. правда, скомпилировано в динамическую библиотеку
Используйте скомпилированный Skia и программное обеспечение с открытым исходным кодом https://github.com/xland/ScreenCapture для его тестирования. Обнаружено серьезные проблемы с производительностью и очевидная задержка в движении мыши. Однако двоичный файл выпущен. с этим программным обеспечением все гладко.
Первое подозрение состоит в том, что Skia не включает ускорение GPU, а добавление Skia_use_gl=true включает ускорение OpenGL, но улучшений нет. Позже я посмотрел исходный код этого проекта и обнаружил, что ускорение графического процессора не включено.
Затем я попробовал настроить параметры компиляции Skia, но безрезультатно.
Не было никакой возможности, поэтому я спросил автора с намерением попробовать. Я оставил сообщение в разделе обсуждения проекта на github и спросил автора, как скомпилировать Skia. Неожиданно автор быстро ответил:
После ответа я скачал компилятор clang и использовал следующие параметры компиляции:
bin\gn gen out\release_clang --args="clang_win="D:\sdk\clang+llvm-18.1.6-x86_64-pc-windows-msvc" clang_win_version="18" cc="clang" cxx="clang++" extra_cflags=["/MT"] is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_enable_skparagraph=true skia_enable_skshaper=true skia_enable_skunicode=true"
Затем скомпилируйте исходный код ScreenCapture. Конечно же, программа стала намного более плавной. Еще раз спасибо xland, автору проекта с открытым исходным кодом ScreenCapture.
Компьютерное оборудование быстро развивается. Например, процессор Intel Core перешел в 14-е поколение, а стандартная память современных компьютеров обычно начинается с 16 ГБ. Несмотря на это, хотя скорость работы современных компьютеров в сотни раз выше, чем десять лет назад, пользовательский опыт, похоже, существенно не улучшился. Этот феномен можно объяснить ранним законом Энди-Бера, который раскрывает противоречие между обновлениями аппаратного обеспечения и требованиями к программному обеспечению: улучшения производительности аппаратного обеспечения часто быстро поглощаются новыми требованиями к программному обеспечению.
Закон Энди и Билла представляет собой краткое изложение взаимосвязи между обновлениями программного и аппаратного обеспечения в ИТ-индустрии. Оригинальные слова: «Энди дает, Билл забирает. (То, что Энди дает, Билл забирает.)» Энди относится к бывшему генеральному директору Intel Энди Гроуву, а Билл относится к бывшему генеральному директору Microsoft Биллу Гейтсу. Это означает, что производительность, улучшенная аппаратным обеспечением, быстро расходуется программным обеспечением.
Это справедливо не только для операционной системы Windows, но и для прикладного программного обеспечения. Хотя новое программное обеспечение более мощное, чем предыдущая версия, добавленная функциональность определенно не пропорциональна его размеру. Сегодня любое программное обеспечение требует сотен мегабайт или даже нескольких гигабайт.
Когда современные программисты разрабатывают программное обеспечение, они не пишут его с нуля на C/C++ и редко задумываются о производительности. Вместо этого они используют множество фреймворков и объединяют множество промежуточных уровней, что, конечно, приводит к тому, что программное обеспечение становится все больше и больше. Конечно, с точки зрения ремонтопригодности и скорости разработки в этой модели разработки нет ничего плохого. Современное программное обеспечение становится все более сложным и должно удовлетворять все больше и больше потребностей. Это нереально, если все оно будет написано на C/C++. Таким образом, текущая общая модель такова, что бизнес-уровень написан с использованием языков быстрой разработки, таких как Java, Python и JS, а основные функции и высокопроизводительные компоненты по-прежнему пишутся на C/C++. В области ИИ, хотя язык Python и занимает заслуженное первое место, ядро фреймворка ИИ в основном использует C/C++.
Не стоит переоценивать оптимизацию программного обеспечения. В конце концов, в области разработки программного обеспечения есть девиз:
Преждевременная оптимизация — худшее из зол.
Предложение «Преждевременная оптимизация — корень всех зол» изначально было предложено учёным-компьютерщиком Дональдом Кнутом. Полное утверждение звучит так: «Преждевременная оптимизация — корень всех зол». В этом предложении подчеркивается, что в процессе разработки программного обеспечения преждевременная оптимизация может привести к увеличению сложности кода, снижению его читаемости и удобства сопровождения, а зачастую слепая оптимизация может привести к потере большого количества денег, прежде чем будут поняты реальные узкие места системы.
Что касается оптимизации программного обеспечения, ИИ дает следующие предложения:
Я правда не ожидал, что компилятор так сильно влияет на производительность. А вы на работе проводите оптимизацию производительности? Какие меры оптимизации существуют? Добро пожаловать, чтобы оставить сообщение для обсуждения.