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 Мб. Надо думать, как эффективно эти ширины кэшировать.

Вложения:
Text.txt [73.38 КБ]
Скачиваний: 802

Автор:  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) эффект грандиозен :)

Вложения:
Views.odc [56.16 КБ]
Скачиваний: 739

Автор:  Иван Денисов [ Среда, 30 Сентябрь, 2015 06:37 ]
Заголовок сообщения:  Re: Прокрутка Крысой

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

Вложения:
Views.odc [57.86 КБ]
Скачиваний: 773

Автор:  prospero78 [ Среда, 30 Сентябрь, 2015 10:55 ]
Заголовок сообщения:  Re: Прокрутка Крысой

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

АДД. Надо смотреть как сделан a.v.SetOrigin(org, dy). Может быть там есть возможность впихнуть сдвиг не построчно-пиксельный, а скажем построчный (пиксель х 8).
Тогда вообще прощай тормоза) Если, я правильно понимаю, как работает текстовая вьюшка в БлекБоксе.

Автор:  Роман М. [ Четверг, 01 Октябрь, 2015 22:44 ]
Заголовок сообщения:  Re: Прокрутка Крысой

Иван Денисов писал(а):
Господа, кому интересна качественная прокрутка текста в ББ, прошу протестировать данный модуль.
Переписал заново вычисление позиции при прокрутке.

Иван, на каком документе ощутимее всего заметны тормоза при прокрутке? У меня на мониторе почему-то не видно разницы.

Страница 3 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/