OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 15 Декабрь, 2018 09:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 05 Февраль, 2015 11:02 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Иван Кузьмицкий:
Вы занимаетесь гаданием на кофейной гуще. Вот честно даже не интересно на таком уровне обсуждать проблему. Сжато свое мнение я выше высказал.


Отключите поиск линеек и тормоза исчезнут. При чем тут скорость отрисовки windows?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 05 Февраль, 2015 11:54 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
ilovb писал(а):
Иван Кузьмицкий:
Вы занимаетесь гаданием на кофейной гуще. Вот честно даже не интересно на таком уровне обсуждать проблему. Сжато свое мнение я выше высказал.


Отключите поиск линеек и тормоза исчезнут. При чем тут скорость отрисовки windows?
Основная нагрузка на рендер текста лежит на генерации изображений символов. Самая тяжёлая работа. Если символы генерятся быстро, то проблем вообще не возникнет. Но в эталоне ББ рендер текста возложен на Windows. И это реальная проблема.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 05 Февраль, 2015 12:17 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Что профайлер показывает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 05 Февраль, 2015 12:37 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
А что он должен показать? Алгоритмы вывода учитывают тучу вещей, но в итоге всё упирается в хостовый вывод строчки. В SDL-хосте я это попробовал собственными руками.

Корни причины только в одном - "кроссплатформенный" рендер каркаса использует платформенные вкрапления, правильная работа которых не гарантируется каркасом. Всё остальное вторично.

Не надо подстраивать поведение каркаса под особенности платформы, вот что я хочу сказать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 05 Февраль, 2015 12:40 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Цитата:
А что он должен показать?

Правду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 18:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Тормоза не в отрисовке строки, а в предворительной подготовке к выводу. Я проверил, что даже если отключить отрисовку строк, то тормоза все равно есть в прокрутке.

Борис, вы все время ссылаетесь на что-то, что написали выше. Вы имеете в виду буферизацию? Или про поиск линеек?
Вот нашел в другой теме про линейки обсуждали раньше:
viewtopic.php?f=47&t=3360&p=85067&hilit=%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BA%D0%B8#p85067


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 19:20 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Профилировщик показыват, что проблема со скоростью вычисления ширины строки, на это тратиться львиная доля всего времни при прокрутке.

Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 19:32 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Вот мой главный претендент на тормоза для русских текстов. Тут мы видим, что ширина первых 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;
   


Последний раз редактировалось Иван Денисов Суббота, 07 Февраль, 2015 20:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 19:47 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Иван Денисов писал(а):
Борис, вы все время ссылаетесь на что-то, что написали выше. Вы имеете в виду буферизацию? Или про поиск линеек?
Вот нашел в другой теме про линейки обсуждали раньше:
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:06, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 20:01 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Иван Денисов писал(а):
Профилировщик показыват, что проблема со скоростью вычисления ширины строки, на это тратиться львиная доля всего времни при прокрутке.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Суббота, 07 Февраль, 2015 20:20 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Вот пример обмана профилировщиком ББ:
Код:
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, но профилировщик ББ этого не знает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Воскресенье, 08 Февраль, 2015 23:04 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Сделал прототип исправленной TextViews. Также в Views я поправил механизм скрола, чтобы он вначале рисовал кадр, а затем уже сдвигал.

Стало немного непривычно, но зато текст не размазывается.

Кэширование первых 64000 ширин для каждого шрифта, ничего хорошего пока не принесла. ББ при запуске берет 27 Мб. Надо думать, как эффективно эти ширины кэшировать.


Вложения:
Text.txt [73.38 КБ]
Скачиваний: 149
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Воскресенье, 08 Февраль, 2015 23:14 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1438
Мерцания практически нет. И непривычно, да :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Понедельник, 09 Февраль, 2015 00:55 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Иван Денисов писал(а):
Кэширование первых 64000 ширин для каждого шрифта, ничего хорошего пока не принесла. ББ при запуске берет 27 Мб. Надо думать, как эффективно эти ширины кэшировать.
Это принципиальная ошибка. Не нужно измерять ширину каждой буквы. Нужно измерять ширину слов. Только в этом случае символы, которые должны комбинироваться с соседними (диакритика и т.п.), будут скомбинированы и измерены правильно.

https://en.wikipedia.org/wiki/Combining_character

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Понедельник, 09 Февраль, 2015 04:47 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Спасибо Александр за совет, попробую сделать, чтобы ширина слов измерялась.

В ББ хитрый финт сейчас сделан — измеряется ширина пары "бx", где "б" — любая буква, а потом вычитается "х". Но согласен, что это какое-то шаманство.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Понедельник, 09 Февраль, 2015 08:30 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Вот такая конструкция вполне работает. Работает не медленнее, чем оригинальная. Надо будет еще покопаться, чтобы оценить.
Код:
   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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Воскресенье, 17 Май, 2015 20:07 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Нашел небольшой косяк в предлагаемом TextViews, срабатывает аварийная остановка при копировании текстового отображения StdCmds.OpenCopyOf(...). Исправленную версию прилагаю.

Резюмируя эту тему. Наибольший эффект для обернутых текстов так или иначе получается от буферизации скролла. Кратко и популярно смысл такой. В стандартном ББ есть досадная особенность, по 3 раза обновлять отображение при прокрутке. Связано это с тем, что обновление происходит на каждое событие скрола мыши. А за один скрол их в современных мышах генерируется аж три штуки. А если резко дернуть, то выходит более 12 раз! И каждый из этих раз ББ планомерно перерисовывает отображения. Если для текстов с кодом это происходит очень быстро и даже дает эффект анимации, то для текстов сложносоставных с изображениями и другими тяжелыми вещами такое поведение совершенно неприемлемо и приводит к заметному торможению при прокрутке, мерцанию картинок и т.п.
Решение в том, чтобы копить события прокрутки и применять разом, как только поток этих событий прокрутки прерывается. Это и реализовано в прилагаемом альтернативном TextViews. Для моей задачи (текст с картинками Abf и графиками DiaPlot) эффект грандиозен :)


Вложения:
Views.odc [56.16 КБ]
Скачиваний: 113
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Среда, 30 Сентябрь, 2015 06:37 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2235
Господа, кому интересна качественная прокрутка текста в ББ, прошу протестировать данный модуль.
Переписал заново вычисление позиции при прокрутке.


Вложения:
Views.odc [57.86 КБ]
Скачиваний: 122
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Среда, 30 Сентябрь, 2015 10:55 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1094
Откуда: СССР v2.0 rc 1
Утащил. Посмотрим)
----
Немного погодя. Подтверждаю. Прокрутка стала драматичнее в разы быстрее. Посмотрю модуль, может что-то своё смогу предложить)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прокрутка Крысой
СообщениеДобавлено: Четверг, 01 Октябрь, 2015 22:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Иван Денисов писал(а):
Господа, кому интересна качественная прокрутка текста в ББ, прошу протестировать данный модуль.
Переписал заново вычисление позиции при прокрутке.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB