OberonCore https://forum.oberoncore.ru/ |
|
Прокрутка Крысой https://forum.oberoncore.ru/viewtopic.php?f=2&t=3391 |
Страница 3 из 4 |
Автор: | ilovb [ Четверг, 05 Февраль, 2015 11:02 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Иван Кузьмицкий: Вы занимаетесь гаданием на кофейной гуще. Вот честно даже не интересно на таком уровне обсуждать проблему. Сжато свое мнение я выше высказал. Отключите поиск линеек и тормоза исчезнут. При чем тут скорость отрисовки windows? |
Автор: | Иван Кузьмицкий [ Четверг, 05 Февраль, 2015 11:54 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
ilovb писал(а): Иван Кузьмицкий: Основная нагрузка на рендер текста лежит на генерации изображений символов. Самая тяжёлая работа. Если символы генерятся быстро, то проблем вообще не возникнет. Но в эталоне ББ рендер текста возложен на Windows. И это реальная проблема.
Вы занимаетесь гаданием на кофейной гуще. Вот честно даже не интересно на таком уровне обсуждать проблему. Сжато свое мнение я выше высказал. Отключите поиск линеек и тормоза исчезнут. При чем тут скорость отрисовки windows? |
Автор: | ilovb [ Четверг, 05 Февраль, 2015 12:17 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Что профайлер показывает? |
Автор: | Иван Кузьмицкий [ Четверг, 05 Февраль, 2015 12:37 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
А что он должен показать? Алгоритмы вывода учитывают тучу вещей, но в итоге всё упирается в хостовый вывод строчки. В SDL-хосте я это попробовал собственными руками. Корни причины только в одном - "кроссплатформенный" рендер каркаса использует платформенные вкрапления, правильная работа которых не гарантируется каркасом. Всё остальное вторично. Не надо подстраивать поведение каркаса под особенности платформы, вот что я хочу сказать. |
Автор: | ilovb [ Четверг, 05 Февраль, 2015 12:40 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Цитата: А что он должен показать? Правду. |
Автор: | Иван Денисов [ Суббота, 07 Февраль, 2015 18:53 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Тормоза не в отрисовке строки, а в предворительной подготовке к выводу. Я проверил, что даже если отключить отрисовку строк, то тормоза все равно есть в прокрутке. Борис, вы все время ссылаетесь на что-то, что написали выше. Вы имеете в виду буферизацию? Или про поиск линеек? Вот нашел в другой теме про линейки обсуждали раньше: viewtopic.php?f=47&t=3360&p=85067&hilit=%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BA%D0%B8#p85067 |
Автор: | Иван Денисов [ Суббота, 07 Февраль, 2015 19:20 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Профилировщик показыват, что проблема со скоростью вычисления ширины строки, на это тратиться львиная доля всего времни при прокрутке. Код: TextSetters 36
GatherString 11 Reader.Read 7 StdReader.Read 7 Enclose 4 StdSetter.GetLine 4 WordPart 1 TrueW 1 HostFonts 19 Font.StringWidth 15 Font.fTab 1 DevFont.wTab 1 Font.GetBounds 1 |
Автор: | Иван Денисов [ Суббота, 07 Февраль, 2015 19:32 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Вот мой главный претендент на тормоза для русских текстов. Тут мы видим, что ширина первых 255 символов юникода кэширована, а для остальных нет! Код: (* width methods for unicode *)
PROCEDURE (f: Font) wTab* (dc: WinApi.HANDLE; ch: CHAR): INTEGER, NEW; VAR res, w: INTEGER; abc: ARRAY 1 OF WinApi.ABC; wt: ARRAY 1 OF INTEGER; BEGIN IF ch < 100X THEN RETURN f.wtab[ORD(ch)] END; res := WinApi.GetCharABCWidthsW(dc, ORD(ch), ORD(ch), abc[0]); IF res # 0 THEN w := abc[0].abcA + abc[0].abcB + abc[0].abcC; w := w * f.a DIV grid + w * f.b ELSE res := WinApi.GetCharWidth32W(dc, ORD(ch), ORD(ch), wt[0]); IF res # 0 THEN w := wt[0] * f.a DIV grid + wt[0] * f.b ELSE res := WinApi.GetCharWidthW(dc, ORD(ch), ORD(ch), wt[0]); IF res # 0 THEN w := wt[0] * f.a DIV grid + wt[0] * f.b ELSE w := f.wtab[1] END END END; RETURN w END wTab; PROCEDURE (f: Font) fTab* (dc: WinApi.HANDLE; ch: CHAR): INTEGER, NEW; VAR res, w: INTEGER; abc: ARRAY 1 OF WinApi.ABC; BEGIN IF ch < 100X THEN RETURN f.ftab[ORD(ch)] END; res := WinApi.GetCharABCWidthsW(dc, ORD(ch), ORD(ch), abc[0]); IF (res # 0) & (abc[0].abcA < 0) THEN w := -abc[0].abcA; w := w * f.a DIV grid + w * f.b ELSE w := 0 END; RETURN w END fTab; PROCEDURE (f: Font) tTab* (dc: WinApi.HANDLE; ch: CHAR): INTEGER, NEW; VAR res, w: INTEGER; abc: ARRAY 1 OF WinApi.ABC; BEGIN IF ch < 100X THEN RETURN f.ttab[ORD(ch)] END; res := WinApi.GetCharABCWidthsW(dc, ORD(ch), ORD(ch), abc[0]); IF (res # 0) & (abc[0].abcC < 0) THEN w := -abc[0].abcC; w := w * f.a DIV grid + w * f.b ELSE w := 0 END; RETURN w END tTab; PROCEDURE (df: DevFont) wTab* (dc: WinApi.HANDLE; ch: CHAR): INTEGER, NEW; VAR res, w: INTEGER; wt: ARRAY 1 OF INTEGER; BEGIN IF ch < 100X THEN RETURN df.wtab[ORD(ch)] END; res := WinApi.GetCharWidth32W(dc, ORD(ch), ORD(ch), wt[0]); IF res = 0 THEN res := WinApi.GetCharWidthW(dc, ORD(ch), ORD(ch), wt[0]) END; IF res # 0 THEN w := wt[0] ELSE w := df.wtab[1] END; RETURN w END wTab; |
Автор: | ilovb [ Суббота, 07 Февраль, 2015 19:47 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Иван Денисов писал(а): Борис, вы все время ссылаетесь на что-то, что написали выше. Вы имеете в виду буферизацию? Или про поиск линеек? Вот нашел в другой теме про линейки обсуждали раньше: viewtopic.php?f=47&t=3360&p=85067&hilit=%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BA%D0%B8#p85067 И то и другое. Все вместе и является причиной тормозов. Больше всего влияют линейки, далее алгоритм вывода, который не оптимально обрабатывает скролл колесом мыши. Вот вы еще нашли расчет ширины букв... Кстати, мои проблемы были в основном с обильно форматированными документами. Именно на них сильно проявлялись проблемы с линейками и выводом при скролле. |
Автор: | ilovb [ Суббота, 07 Февраль, 2015 20:01 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Иван Денисов писал(а): Профилировщик показыват, что проблема со скоростью вычисления ширины строки, на это тратиться львиная доля всего времни при прокрутке. С ББшным профилировщиком нужно очень внимательно обращаться. Очень легко можно обмануться и неправильно интерпретировать то, что он показывает, т.к. он не отслеживает цепочки вызовов. Т.е. сама процедура, на которую тратится наибольшее время далеко не всегда является проблемной. |
Автор: | ilovb [ Суббота, 07 Февраль, 2015 20:20 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Вот пример обмана профилировщиком ББ: Код: MODULE TestFoo1; PROCEDURE Do*; VAR i, a, b: INTEGER; BEGIN FOR i := 1 TO 1000 DO a := b DIV i; END; END Do; END TestFoo1. Код: MODULE TestFoo2; IMPORT TestFoo1; PROCEDURE Do*; VAR i: INTEGER; BEGIN FOR i := 1 TO 100000000 DO TestFoo1.Do; END; END Do; END TestFoo2.Do Код: Module % per module Procedure % per procedure TestFoo1 99 Do 99 samples: 51315 100% in profiled modules 30664 59% other 20651 41% Т.е. в данном случае проблема в TestFoo2.Do, но профилировщик ББ этого не знает. |
Автор: | Иван Денисов [ Воскресенье, 08 Февраль, 2015 23:04 ] | ||
Заголовок сообщения: | Re: Прокрутка Крысой | ||
Сделал прототип исправленной TextViews. Также в Views я поправил механизм скрола, чтобы он вначале рисовал кадр, а затем уже сдвигал. Стало немного непривычно, но зато текст не размазывается. Кэширование первых 64000 ширин для каждого шрифта, ничего хорошего пока не принесла. ББ при запуске берет 27 Мб. Надо думать, как эффективно эти ширины кэшировать.
|
Автор: | ilovb [ Воскресенье, 08 Февраль, 2015 23:14 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Мерцания практически нет. И непривычно, да |
Автор: | Александр Ильин [ Понедельник, 09 Февраль, 2015 00:55 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Иван Денисов писал(а): Кэширование первых 64000 ширин для каждого шрифта, ничего хорошего пока не принесла. ББ при запуске берет 27 Мб. Надо думать, как эффективно эти ширины кэшировать. Это принципиальная ошибка. Не нужно измерять ширину каждой буквы. Нужно измерять ширину слов. Только в этом случае символы, которые должны комбинироваться с соседними (диакритика и т.п.), будут скомбинированы и измерены правильно.https://en.wikipedia.org/wiki/Combining_character Если хотите, можете кэшировать ширины слов, добавив соответствующие структуры данных в текст. Но и без этого ничего тормозить у вас не будет, достаточно только отойти от побуквенного измерения текста. |
Автор: | Иван Денисов [ Понедельник, 09 Февраль, 2015 04:47 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Спасибо Александр за совет, попробую сделать, чтобы ширина слов измерялась. В ББ хитрый финт сейчас сделан — измеряется ширина пары "бx", где "б" — любая буква, а потом вычитается "х". Но согласен, что это какое-то шаманство. |
Автор: | Иван Денисов [ Понедельник, 09 Февраль, 2015 08:30 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Вот такая конструкция вполне работает. Работает не медленнее, чем оригинальная. Надо будет еще покопаться, чтобы оценить. Код: PROCEDURE (f: Font) StringWidth* (IN s: ARRAY OF CHAR): INTEGER;
VAR res: INTEGER; dc, old: WinApi.HANDLE; size: WinApi.SIZE; BEGIN dc := WinApi.GetDC(0); old := WinApi.SelectObject(dc, f.id); res := WinApi.GetTextExtentPoint32W(dc, s, LEN(s$), size); res := WinApi.SelectObject(dc, old); res := WinApi.ReleaseDC(0, dc); RETURN size.cx * 9525; END StringWidth; |
Автор: | Иван Денисов [ Воскресенье, 17 Май, 2015 20:07 ] | ||
Заголовок сообщения: | Re: Прокрутка Крысой | ||
Нашел небольшой косяк в предлагаемом TextViews, срабатывает аварийная остановка при копировании текстового отображения StdCmds.OpenCopyOf(...). Исправленную версию прилагаю. Резюмируя эту тему. Наибольший эффект для обернутых текстов так или иначе получается от буферизации скролла. Кратко и популярно смысл такой. В стандартном ББ есть досадная особенность, по 3 раза обновлять отображение при прокрутке. Связано это с тем, что обновление происходит на каждое событие скрола мыши. А за один скрол их в современных мышах генерируется аж три штуки. А если резко дернуть, то выходит более 12 раз! И каждый из этих раз ББ планомерно перерисовывает отображения. Если для текстов с кодом это происходит очень быстро и даже дает эффект анимации, то для текстов сложносоставных с изображениями и другими тяжелыми вещами такое поведение совершенно неприемлемо и приводит к заметному торможению при прокрутке, мерцанию картинок и т.п. Решение в том, чтобы копить события прокрутки и применять разом, как только поток этих событий прокрутки прерывается. Это и реализовано в прилагаемом альтернативном TextViews. Для моей задачи (текст с картинками Abf и графиками DiaPlot) эффект грандиозен
|
Автор: | Иван Денисов [ Среда, 30 Сентябрь, 2015 06:37 ] | ||
Заголовок сообщения: | Re: Прокрутка Крысой | ||
Господа, кому интересна качественная прокрутка текста в ББ, прошу протестировать данный модуль. Переписал заново вычисление позиции при прокрутке.
|
Автор: | prospero78 [ Среда, 30 Сентябрь, 2015 10:55 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Утащил. Посмотрим) ---- Немного погодя. Подтверждаю. Прокрутка стала драматичнее в разы быстрее. Посмотрю модуль, может что-то своё смогу предложить) АДД. Надо смотреть как сделан a.v.SetOrigin(org, dy). Может быть там есть возможность впихнуть сдвиг не построчно-пиксельный, а скажем построчный (пиксель х . Тогда вообще прощай тормоза) Если, я правильно понимаю, как работает текстовая вьюшка в БлекБоксе. |
Автор: | Роман М. [ Четверг, 01 Октябрь, 2015 22:44 ] |
Заголовок сообщения: | Re: Прокрутка Крысой |
Иван Денисов писал(а): Господа, кому интересна качественная прокрутка текста в ББ, прошу протестировать данный модуль. Переписал заново вычисление позиции при прокрутке. Иван, на каком документе ощутимее всего заметны тормоза при прокрутке? У меня на мониторе почему-то не видно разницы. |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |