Почему код GUI является так в вычислительном отношении дорогим?

Я предполагаю, что Дженкинс работает от имени другого пользователя или на другом компьютере. Эти идентификаторы представляют собой UDID (универсальные идентификаторы устройств), которые представляют собой UUID (универсально уникальные идентификаторы). Они уникальны для каждого пользователя в любой системе.

simctl и xcodebuild принимают имена устройств, поэтому смело используйте вместо них «iPhone X». Вы также можете создавать новые симуляторы с произвольным именем, если вам нужно избежать коллизий или выбрать конкретную версию ОС, в которой вы не можете поделиться UDID.

13
задан 2 revs 2 February 2009 в 08:12
поделиться

5 ответов

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

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

Добавленный:

В комментариях я нашел это:

Я также очень интересуюсь этим. Не может случиться так, что gui представляется с помощью только CPU, потому что, если у Вас нет надлежащих драйверов для Вашей gfx-карты, настольный графический рендеринг невероятно замедляется. Если у Вас есть gfx-драйверы однако настольное-gfx движение довольно быстро, но никогда с такой скоростью, как directx/opengl приложение.

Вот соглашение насколько я понимаю: каждая видеокарта там сегодня поддерживает универсальный интерфейс для рисования. Я не уверен, называют ли это "VESA", "SVGA", или если это - просто старые названия от прошлого. Так или иначе этот интерфейс включает выполнение всего через прерывания. Для каждого пикселя существует вызов по прерыванию. Или что-то как этот. Надлежащий драйвер VGA однако может использовать в своих интересах DMA и другие улучшения, которые делают целый процесс ПУТЕМ менее интенсивный ЦП.

Добавленный 2: А-ч, и для OpenGL/DirectX - это - другая функция сегодняшних видеокарт. Они оптимизированы для 3D операций в эксклюзивном режиме. Вот почему скорость. Нормальный GUI просто использует основные 2D процедуры рисунка. Таким образом, это добирается для отправки содержания целого экрана каждый раз, когда это хочет обновление. 3D приложения однако отправляют набор структур и треугольных определений VRAM (видеопамять) и затем просто снова используют их для рисования. Они просто говорят, что что-то как "берет треугольный набор № 38 с набором структуры № 25 и тянет их". Все эти вещи кэшируются в VRAM, таким образом, это - снова путь быстрее.

Я не уверен, но я подозревал бы, что современные 3D ускоренные графический интерфейсы пользователя (Аэро Vista, compiz на Linux, и т.д.) также могли бы использовать в своих интересах это. Они могли отправить общие битовые массивы в VGA впереди и затем просто снова использовать их непосредственно от VRAM. Любые оттянутые из приложения поверхности однако должны были бы все еще быть отправлены непосредственно каждый раз за обновлениями.

Добавленный 3: Больше идей.:) Современный GUI для Windows, Linux, и т.д. ориентирован на виджет (это ориентировано на управление для динамиков Windows). Проблема с этим состоит в том, что каждый виджет имеет свой собственный код для прорисовки и связанную поверхность рисунка (более или менее). Когда окно должно быть перерисовано, оно называет код для прорисовки для всех своих дочерних виджетов, кто в свою очередь называет код для прорисовки для их дочерних виджетов и т.д. Каждый виджет перерисовывает свою целую поверхность, даже при том, что часть его затенена другими виджетами. С вышеупомянутыми методами отсечения часть этой оттянутой информации сразу отбрасывается для сокращения мерцания и других артефактов. Но тем не менее это - много ручного кода для прорисовки, который включает растровое блитирование, протяжение, скос, проведение линий, текста, заливки, и т.д. И все это переводится в серию вызовов putpixel, в которые проникают, отсекая фильтры/маски и другой материал. А-ч, да, и альфа-смешивание также стали популярными сегодня для хороших эффектов, что означает еще больше работы. Так... да, Вы могли сказать, что это из-за большой абстракции и косвенности. Но... Вы могли действительно сделать это немного лучше?Я так не думаю. Только 3D методы могли бы помочь, потому что они используют в своих интересах GPU для альфа-вычислений и отсечения.

9
ответ дан 2 December 2019 в 00:04
поделиться

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

Среди библиотек, пишущий библиотеку инструментария GUI заметно трудная проблема. Это вызвано тем, что программы, которые пользуются библиотеками GUI, передвигаются на очень большое разнообразие доменов с совсем другими потребностями. Г-н, Почему и Martin DeMollo обсудил требования, помещенные библиотек GUI только что.

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

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

5
ответ дан 2 December 2019 в 00:04
поделиться

Я действительно до некоторой степени завишу от языка. Вы, возможно, заметили, что Java и приложения RealBasic немного медленнее, чем их на базе С (C++, C#, Objective C) дубликаты.

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

Существует также несколько циклов для дополнительных исходных данных и функций.

0
ответ дан 2 December 2019 в 00:04
поделиться

Я думаю, что можно найти некоторые интересные мысли об этой теме в "Дизайне Оконной системы: Если у меня был он для переделывания снова в 2002" James Gosling (парень Java, также известный его работой над pre-X11 системами управления окнами). Доступный онлайн здесь [PDF].

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

0
ответ дан 2 December 2019 в 00:04
поделиться

Uhm, это довольно много.

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

Все объяснять, разгружая вычисления к GPU не обязательно решит любые проблемы. GPU точно так же, как ЦП кроме он - менее общая цель, и больше данные нашел что-либо подобное процессору. Это может сделать графические вычисления исключительно хорошо. Безотносительно графического API/ОС и комбинации драйвера, которую Вы имеете, действительно не имеет значения так очень... хорошо хорошо, с Vista как пример, они изменили настольный механизм состава. Этот механизм намного лучше удобряет компостом только то, что изменилось, и так как горлышко бутылки номер один для приложений для GUI перерисовывает, аккуратная стратегия оптимизации. Эта идея виртуализировать Ваши вычислительные потребности и только обновляет самое маленькое изменение каждый раз.

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

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

Что-то, что делает Windows Presentation Foundation (WPF), который я думаю, далеко превосходит большую часть другого API GUI, то, что он разделяет обновления расположения и представляющие обновления в две отдельных передачи. И в то время как WPF является управляемым кодом, механизм визуализации не. То, что происходит с рендерингом, - то, что управляемый механизм визуализации WPF создает очередь команды (это - то, что DirectX и OpenGL делают), которого затем вручают собственному механизму визуализации. Что немного более изящно, вот то, что WPF затем попытается сохранить любое вычисление, которое не изменило визуальное состояние. Прием, если Вы можете, где Вы избегаете дорогостоящего рендеринга, призывает к вещам, который не должен быть представлен (виртуализировав).

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

Теперь WPF не является высшим, это - твердое усилие от Microsoft, но это не Святой Грааль еще... код, который работает, конвейер мог все еще быть улучшен, и объем потребляемой памяти любого управляемого приложения является еще больше, чем я хотел бы. Но я надеюсь, что это - вид ответа, который Вы ищете.

WPF может сделать некоторые вещи, асинхронно довольно достойные, который является огромным соглашением, если Вы хотите сделать действительно быстро реагирующий low-latency/low-cpu UI. Асинхронные операции больше, чем разгружают работу над другим потоком.

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

2
ответ дан 2 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: