Thread rendering что это
Перейти к содержимому

Thread rendering что это

  • автор:

Производительность в iOS или как разгрузить main thread. Часть 1

Есть разные приёмы и хитрости, которые помогают оптимизировать работу iOS-приложений, когда одна задача должна выполняться за 16,67 миллисекунд. Рассказываем, как разгрузить main thread и какие инструменты лучше подходят для отслеживания стека вызовов в нём.

«Ребята, давайте представим, что вы сможете сократить время запуска на 10 секунд. Умножив это на 5 миллионов пользователей, ежедневно у нас будет 50 миллионов секунд. За год это составит порядка десяти человеческих жизней. Поэтому, если вы сделаете первичную загрузку на 10 секунд быстрее, вы спасёте несколько десятков жизней. Это действительно стоит того, не правда ли?»

Стив Джобс о производительности (времени запуска компьютера Apple II).

Статья основана на докладе iOS-разрабочика из Fyusion Люка Пархема, с которым он выступил на Международной конференции мобильных разработчиков MBLT DEV в прошлом году.

MBLT DEV 2018 состоится в Москве 28 сентября. Билеты дешевле всего сейчас. По доброй традиции, пока Программный комитет отбирает доклады, вы можете купить early bird билеты на конфу. Воспользуйтесь этой возможностью сейчас. С 29 июня билеты будут стоит дороже.

Потеря кадров

На main thread выполняется код, который отвечает за ивенты типа касания и работу с UI. Он же рендерит экран. В большинстве современных смартфонов рендеринг происходит с частотой 60 кадров в секунду. Это значит, что задачи должны выполняться за 16,67 миллисекунд (1000 миллисекунд/ 60 кадров). Поэтому ускорение работы в Main Thread — важно.

Если какая-то операция занимает больше 16,67 миллисекунд, автоматически происходит потеря кадров, и пользователи приложения заметят это при воспроизведении анимаций. На некоторых устройствах рендеринг происходит ещё быстрее, например, на iPad Pro 2017 частота обновления экрана составляет 120 Гц, поэтому на выполнение операций за один кадр есть всего 8 миллисекунд.

CADisplayLink — специальный таймер, который запускается во время вертикальной синхронизации (Vsync). Вертикальная синхронизация гарантирует, что на рендеринг кадра отводится не более 16,67 миллисекунд. В качестве проверки в AppDelegate можно зарегистрировать CADisplayLink в main run loop, и тогда у вас появится дополнительная функция, которая будет выполнять вычисления. Можно отследить длительность работы приложения и узнать, сколько времени прошло с момента последнего запуска этой функции.

.

Запуск происходит, когда появляется необходимость в рендере. Если выполнялось множество различных операций, которые перегружали main thread, то эта функция запускается с задержкой в 100 миллисекунд. Это значит, что выполнялось слишком много работы, и в этот момент произошла потеря кадров.

Перед вами приложение Catstagram. Во время загрузки картинок приложение начинает тормозить. Мы видим, что частота кадров снизилась в определённый момент, и время загрузки длилось порядка 200 миллисекунд. Похоже, что-то занимает слишком много времени.

Пользователи не будут в восторге от подобного, особенно если приложение запускается на более старых устройствах, например iPhone 5 или устаревших моделях iPod и т.д.

Time Profiler

Полезный инструмент для отслеживания таких проблем — Time Profiler. Другие инструменты также полезны, но в конечном итоге в компании Fyusion в 90% случаев мы используем Time Profiler. Обычно проблемы в приложении связаны со ScrollView, участками с текстом и изображениями.

Изображения важны. Мы декодируем JPEG-формат с помощью UIImage . Они делают это медленно, и мы не можем отследить их производительность напрямую. Это происходит не сразу после установки изображения в UIImageView , но можно увидеть этот момент через трассировку в Time Profiler.

Форматирование текста – ещё один важный момент. Оно имеет значение, когда в приложении большое количество «сложного» текста, например на японском или китайском языках. Может потребоваться много времени, чтобы вычислить правильные размеры для строчек с текстом.

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

Образец трассировки

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

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

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

Дерево вызовов

Предположим, у нас есть очень простое приложение. В нём находится основная функция, которая вызывает несколько других функций. Суть работы Time Profiler заключается в том, что он делает снимки текущего состояния трассировки стека с периодичностью в одну миллисекунду (по умолчанию). Спустя еще одну миллисекунду он делает снимок трассировки. На ней вызывается основная функция, которая вызывает функцию “ foo ”, которая вызвала функцию “ bar ”. Первичная трассировка стека изображена на скриншоте ниже. Эти данные собираются воедино. Напротив каждой функции указывается число: 1, 1, 1.

Это значит, что каждая из этих функций вызывалась один раз. Затем, через одну миллисекунду мы получаем ещё один снимок стека. В этот раз он выглядит точно также, поэтому все цифры увеличиваются на 1, и мы получаем 2, 2, 2.

Во время третьей миллисекунды наш стек вызовов выглядит немного иначе. Основная функция вызывает “ bar ” напрямую. Поэтому к главной функции и функции “ bar ” добавляется ещё по единице, и их значение становится 3. Далее происходит разделение. Иногда главная функция напрямую вызывает “ foo ”, иногда “ bar ” вызывается напрямую. Такое происходило один раз. Одна функция вызывалась через другую.

Далее, одна функция вызывала другую, которая вызывала третью функцию. Мы видим, что функция “ baz ” вызывалась дважды. Но эта функция настолько незначительная, что она вызывается быстрее одной миллисекунды.

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

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

Если в macOS нажать alt-click, то это развернет секцию и вложенные секции, а не только выбранную. Они будут упорядочены по величине выполняемой работы. В 90% случаев на первом месте будет CFRunLoopRun , а после — функции обратного вызова.

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

Взглянув на эти вызовы подробнее, вы, скорее всего, не поймёте, что они делают. Это могут быть renders, image provider, IO.

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

Есть измерители, которые в процентном соотношении показывают, какой объём работы выполняет конкретная функция или операция. Если мы посмотрим на данный пример, то увидим здесь значение — 34%. Это процесс Apple jpeg_decode_image_all . После изучения становится понятно, что декодинг JPEG-изображений происходит в main thread, и в большинстве случаев это является причиной потери кадров.

В общем случае, декодирование jpeg-изображений стоит делать в фоне. Большинство сторонних библиотек (AsyncDisplayKit, SDWebImage и т.д.) могут делать это по умолчанию. Если вы не хотите использовать фреймворки, то можно сделать декодирование вручную. Для этого вы можете написать расширение над UIImage , в котором создадите контекст и вручную отрисуете изображение.

При выполнении этой операции можно вызвать функцию decodeImage не из main thread. Она всегда будет возвращать декодированное изображение. Не существует способа проверить, прошло ли декодинг конкретное UIImage-изображение, поэтому всегда придётся пропускать их через этот метод. Но если вы кешируете данные правильным образом, в системе не возникнет ненужных процессов.

С технической точки зрения это менее эффективно. Применение класса UIImageView представляется оптимизированным и эффективным. Но он также выполняет аппаратное декодирование, поэтому здесь тоже есть свои минусы. При таком методе ваши изображения будут декодироваться медленнее. Но есть и хорошая новость — можно декодировать изображение вышеописанным способом не на main thread, а затем вернуться на main thread и настроить интерфейс.

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

Предупреждения о нехватке памяти

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

Такая проблема произошла в приложении Fyuse. Если бы я провёл декодинг всех своих JPEG-изображений на стороннем потоке, то в ряде случаев, например, на более старых моделях телефонов, эта система моментально бы сломала приложение. Это случилось бы из-за того, что сторонние потоки задач не реагируют на предупреждение о нехватке памяти от системы, вроде «Эй, удалите ненужные данные!». Происходит следующая ситуация: сначала вы размещаете все эти изображения на сторонних потоках, а затем приложение постоянно даёт сбой. Если сторонние потоки посылают сигналы main thread о происходящем в системе, то такая проблема не возникнет.

Работа без сбоев

По сути, main thread — это очередь, состоящая из процессов. Когда происходит работа со сторонними потоками, в Objective-C можно прописать команду performSelectorOnMainThread:withObject:waitUntilDone: . Благодаря ей, задачи встанут в конец очереди на main thread. Поэтому, если main thread занят обработкой уведомлений о нехватке памяти, вызов этой команды позволит дождаться момента, когда все уведомления будут обработаны, и только затем начать выполнение сложного процесса загрузки и размещения данных. В Swift это выглядит несколько проще. DispatchQueue.main.sync освобождает место на main thread.

Вот ещё один пример. Мы освободили память и проводим декодинг изображений на сторонних потоках. Визуально пролистывание ленты стало гораздо лучше. У нас всё ещё происходит потеря кадров из-за того, что мы тестируем iPod 5g. Это одна из самых худших моделей для тестирования из тех, которые до сих пор поддерживают версии iOS 10 и 11.

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

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

Используйте Core Graphics, если вам нужно обрабатывать изображения на стороннем потоке. Не скрывайте отображение системных библиотек. Помните о предупреждениях о нехватке памяти.

Приглашаем на MBLT DEV 2018

Приходи 28 сентября на 5-ю Международную конференцию мобильных разработчиков MBLT DEV 2018 в Москве. Первые спикеры уже на сайте, а последние early bird ещё в продаже. Цена на билеты вырастет 29 июня. Купи билеты сейчас по самой низкой цене.

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

Rendering in separate thread

Натворил я следующий грех 🙂
написал на с++ dll-ку,
подключил ее к проекту на delphi,
в проекте создал второй процесс и из него вызывал функцию в dll по отрисовке ( OpenGL ).
Инициализация происходит в главном потоке, в dll передается hwnd чего-нибудь, на чем хочется рисовать. Уже внутрях dll-ки определяется и запоминается HDC.
Результат — черный экран. 🙁
Второй поток решил создать, когда сделал отрисовку по таймеру ( 1 мс ) и увидел, что это mustdie. Может можно и без второго потока обойтись? На delphi попробовал писать позавчера :), так что многого не знаю.
Вот такой получился сумбурный вопросец.
P.S. Всех с Новым годом.

#1
11:51, 2 янв 2005

Уточнение — инициализация чего происходит в главном потоке? Т.е. создается контекст и выбирается формат пикселей в главном потоке или нет?

Кстати, почему отрисовка по таймеру — mustdie? Ну, если мы говорим про игру, то да — но тебе же такой изврат не для игры потребовался?
У меня точно так же (C++ dll + Delphi app) работает редактор. Есть два окна — первое — утилитное — это форма Delphi, второе — render window — создается dll-кой.

#2
12:40, 2 янв 2005

А, ну да, инициализация OpenGL конечно + инициализация движка. Причем в dll-ке.
А по таймеру я не хочу рисовать потому, что настраивать анимацию будет очеь неудобно.
Да и структура у редактора такая: есть редакторный движок, который процессит все объекты, отрисовывает их и т.п. ( почти игровой, но имеет несколько отличий от игрового ), и есть редактор ( на Delphi ), который может вмешиваться в параметры объектов в движке, но не более того.
А рендер у меня идет на TPanel.
Моя проблема в том, что я не сам создаю обработчик главного цикла в Delphi, а то я бы просто запихнул туда один вызов процедуры движка и все.
Или если бы у формы был эвент типа OnIdle(), то туда. В общем таймер неприемлим, да и интервал у него слишком большой.

Threads rendering: перевод, синонимы, произношение, примеры предложений, антонимы, транскрипция

  • Теория
    • Грамматика
    • Лексика
    • Аудио уроки
    • Диалоги
    • Разговорники
    • Статьи
  • Онлайн
    • Тесты
    • Переводчик
    • Орфография
    • Радио
    • Игры
    • Телевидение
  • Специалистам
    • Английский для медиков
    • Английский для моряков
    • Английский для математиков
    • Английский для официантов
    • Английский для полиции
    • Английский для IT-специалистов
  • О проекте
    • Реклама на сайте
    • Обратная связь
    • — Partners
    • OpenTran
  • Словари
    • Испанский
    • Голландский
    • Итальянский
    • Португальский
    • Немецкий
    • Французский
    • Хинди
  • Содержание
    • Перевод
    • Синонимы
    • Антонимы
    • Произношение
    • Определение
    • Примеры
    • Транскрипция

Copyright © 2009-2023. All Rights Reserved.

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

Thread rendering что это

With regard to the Arabic language, however, his question about the rendering of place names in Hebrew and their Arabic transliteration had not been answered.

daccess-ods.un.org

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

daccess-ods.un.org
This extremely rounded ball form permits punctiform displacement with coarse, wide loops,
[. ] without piercing the material threads.
schmetz.com
Особо закругленная
форма острия обеспечивает точечное раздвижение обрабатываемого полотна, имеющего грубые,
[. ] широкие петли, без разрыва нитей.
schmetz.com
It impacted five districts within Yogyakarta Province and six districts
within neighbouring Central Java Province, and directly
[. ] affected 2.7 million people, rendering 1.5 million of them homeless.
unesdoc.unesco.org
Оно имело последствия для пяти районов провинции Йокьякарта и шести районов
соседней провинции Центральная Ява и затронуло
[. ] непосредственно 2,7 миллиона человек, из которых 1,5 миллиона [. ]
лишилось крова.
unesdoc.unesco.org
At least with regard to comments about public figures,
consideration should be given to avoiding penalizing
[. ] or otherwise rendering unlawful untrue [. ]
statements that have been published in error but without malice.
daccess-ods.un.org

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

высказывания, которые стали достоянием общественности по ошибке и без
[. ] злого умысла или их перевода в разряд [. ]
незаконных.
daccess-ods.un.org
After further reviews and considerations of
possible titles the Task,
[. ] therefore, recommends that the three threads could be best captured by the following [. ]
title “Water Dependencies:
Systems under Stress and Societal Responses”.
unesdoc.unesco.org
После дальнейшего изучения и обсуждения возможных
названий Целевая группа
[. ] рекомендует, чтобы все эти три темы, проходящие красной нитью через весь Концептуальный [. ]
документ, были лучше

всего объединены следующим заголовком: «Зависимость водных ресурсов: перегруженные системы и ответные меры общества».

unesdoc.unesco.org

In the second case overlapping of execution and optimization threads also results in elimination of optimization time from the total execution time of original binary codes.

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

In accordance with article 2.3.9 of the Act on legal assistance in
criminal matters, seizure of property is
[. ] among the means of rendering legal assistance, [. ]
while article 248.1.1 of the Code of

Criminal Procedure states that property may be seized, inter alia, with a view to its confiscation in the cases envisaged in criminal legislation.

daccess-ods.un.org
В соответствии со статьей
2.3.9 Закона Азербайджанской Республики
[. ] «О правовой помощи по уголовным делам», [. ]
правовая помощь оказывается в том числе

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

daccess-ods.un.org

In addition, in accordance with article 14 of the act in question, persons conducting social work with children and young people are to implement a range of preventive measures, in particular, by providing various social services and by rendering assistance in social, medical, psychological, educational, legal and other areas, and also by providing information and other forms of material assistance, through consultancy services to children and young people, through the conduct of social preventive work among young people and children and through other measures to prevent harm and to ensure the continuation of this work.

childrights.in.ua

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

childrights.in.ua

The wealth of documentary heritage that could be nominated is sometimes perceived as a handicap, rendering the task of national or regional committees difficult.

unesdoc.unesco.org

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

unesdoc.unesco.org
The rock is melted to a temperature
of 1400°С. The material is then
[. ] stretched into basaltic threads from which, after [. ]
modification with nanoparticles, basalt-plastic
construction materials and articles are made.
en.rusnano.com
Посредством плавления при температуре 1400°С
[. ] базальтовую крошку вытягивают в базальтовые нити, из [. ]
которых после модификации наночастицами
плетутся базальтопластиковые строительные материалы и изделия.
rusnano.com
The thicker lace thread is painted in two different

[. ] colours (cream and hazelnut brown) and made of fine cotton threads that intertwine to form a special fabric called «Almavera lace.

Более плотная нить тесьмы
окрашивается в два разных цвета (кремовый и

[. ] цвет лесного ореха) и изготавливается из тонких хлопковых нитей, переплетающихся в особое волокно, которое называется «нить Альмавера».

The threads of each man’s fate [. ]
extend well beyond the boundaries of the visible world.
unesdoc.unesco.org
Нити судьбы каждого человека [. ]
протягиваются далеко за пределы обозримого мира.
unesdoc.unesco.org

If the rings [1] [5] do not loosen from each other, unscrew as many screws as there are forcing threads and screw these equally into the forcing threads until the tapered bushing is pushed out of the tapered ring.

sew-eurodrive.com

Если кольца [1] и [5] сами не разъединяются, то необходимо вывернуть по одному винту для каждого отжимного отверстия, и, равномерно закручивая их в отверстия, выдавить коническую втулку из конического кольца.

download.sew-eurodrive.com
Above the mentioned temperature, we have success using tension pull rods with specimen
[. ] holders with female threads that match the specimen ends.
Если температура при испытании выше
указанной, успешно применяются тянущие
[. ] стержни с наконечниками с внутренней резьбой, которые [. ]
закрепляют к концам образца.

We commend Special Representative of the Secretary-General Zarif and UNMIK for their ongoing efforts to improve the situation in northern Kosovo and for the services the Mission is rendering in areas such as document certification, mutual legal assistance, determining the fate of missing persons, the protection of architectural and religious sites, promoting UNESCO’s activities, and facilitating Kosovo’s interaction with INTERPOL, other international bodies and non-recognizing States.

daccess-ods.un.org

Мы благодарим Специального представителя Генерального секретаря г-на Зарифа и МООНК за их постоянные усилия по улучшению ситуации на севере Косово и за те услуги, которые Миссия оказывает в таких областях, как сертификация документов, взаимная юридическая помощь, установление судьбы пропавших без вести лиц, защита архитектурных и религиозных объектов, поддержка деятельности ЮНЕСКО и содействие взаимодействию Косово с Интерполом, другими международными учреждениями и государствами, не признающими независимость Косово.

daccess-ods.un.org

Egypt registered 1,800 asylum-seekers at the Saloum border in addition to 4,600 new asylum-seekers in Cairo, rendering Egypt UNHCR’s fourth largest RSD operation in 2011.

daccess-ods.un.org

В дополнение к 4 600 вновь зарегистрированным просителям убежища в Каире Египет также зарегистрировал 1 800 просителей убежища на пограничном пункте Эс-Салум, и, таким образом, операция УВКБ в Египте стала четвертой [. ]

по размеру операцией по ОСБ в 2011 году.
daccess-ods.un.org

In enacting the Prohibition of Mercenary Activities and Regulation of Certain Activities in Country of Armed Conflict Act (No. 27 of 2006), South Africa sought to close those loopholes by requiring permission for the rendering of military assistance or security services to countries that have been declared “regulated” by the President on the recommendation of the National Conventional Arms Control Committee.

daccess-ods.un.org

Приняв Закон о запрете наемничества и регулировании некоторых видов деятельности в стране вооруженного конфликта (№ 27 от 2006 года), Южная Африка предприняла попытку устранить эти пробелы за счет установления требования, касающегося получения разрешения на оказание военной помощи или охранных услуг странам, которые по рекомендации Национального комитета по контролю над обычными вооружениями объявлены президентом «подпадающими под регулирование».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *