Конференция "Прочее" » Внутренние устройво просмотрщиков PDF,DJVU, браузеров итд.
 
  • fics © (06.03.17 16:46) [0]
    Что в них берется за основу отрисовки окна? Если, к примеру, это был бы битмап, а информация просто бы подгружалась из памяти в зависимости от положения скрола, то это дело бы дело жутко тормозило. Ну я вас умоляю только без подколов ) Я, как начинающий, еще во многих вопросах плаваю
  • Dimka Maslov © (06.03.17 17:22) [1]

    > Что в них берется за основу отрисовки окна?


    Положение скроллбара
  • megavoid © (06.03.17 17:30) [2]

    > Что в них берется за основу отрисовки окна?

    Не поверите, окно windows :)


    > а информация просто бы подгружалась из памяти в зависимости
    > от положения скрола

    Так и есть, только не из битмапа, конечно, а из RenderTree


    > то это дело бы дело жутко тормозило

    К счастью, сейчас уже не 1997-й год, но рендеринг всё ещё остаётся ресурсоёмкой операцией
    мой процессор в "спокойном" состоянии занят на 1% при частоте 1.6 ГГц
    если поскроллить вверх-вниз страницу дельфимастера в хроме, то загрузка становится 6% при частоте 2.4 ГГц

    более подробно есть в этих ваших интернетах:
    https://github.com/adobe/webkit/tree/master/Source/WebCore/rendering
  • Pavia © (06.03.17 18:15) [3]
    Экран у вас 2000х1000×4 байта. Скорость ОЗУ 20 ГБайт/с.
    Сколько кадров в секунду может выдать ваша ЭВМ?  А коково время реакции вашего мозга?


    > Так и есть, только не из битмапа, конечно, а из RenderTree

    Нюю. Как раз таки вывод идёт из битмапа, а рендеринг идёт в битмап. Так как рендеринг медленее раз в 100 чем просто скопировать картинку. Rendering, если переводить дословно, - это построение изоброжения.
    А за основу и правда берётся RenderTree, что бы съэкономить на памяти.
    Вот в браузере дела обстаят иначе из-за анимации картинка постоянно меняется и там её нет смысла её хранить, отрендерили объекты и тут же вывели.
  • Kilkennycat © (06.03.17 18:22) [4]

    > Если, к примеру, это был бы битмап, а информация просто
    > бы подгружалась из памяти в зависимости от положения скрола,
    >  то это дело бы дело жутко тормозило.

    у меня, можно сказать, битмап. отрисовывается и скроллируется 4750 записей (больше нет в бд), каждая высотой около 16 пикселов, шириной во весь экран. не тормозит.
    потому что на самом деле, отрисовывается только то, что вмещается в окно, плюс одна строка выше окна и одна строка ниже окна (чтобы создавался эффект убегания строк за границы).
    На самом деле, основная сложность - подсчет размеров скроллбара при неоднородном содержимом.
  • Kilkennycat © (06.03.17 18:24) [5]
    мне вот интересно, как реализован механизм выделения текста.
  • aka © (06.03.17 18:42) [6]
    Довольно интерный вопрос, как лично мне кажется, сходу и не нашел толковых статей реализации сего дела.


    > если поскроллить вверх-вниз страницу дельфимастера в хроме,
    >  то загрузка становится 6% при частоте 2.4 ГГц


    Взял paintbox и scrollbar, в stringgrid загрузил кусок текста, по скролу сделал вывод в paintbox текста через textout. - при быстром скроле загрузка 60-90%, хоть с промежуточным битмапом хоть без него
  • Игорь Шевченко © (06.03.17 19:18) [7]

    > Я, как начинающий, еще во многих вопросах плаваю


    Скачать исходники браузера и поискать там ответы на вопросы не предлагать ?
  • Pavia © (06.03.17 19:41) [8]

    > Скачать исходники браузера и поискать там ответы на вопросы
    > не предлагать ?

    А у вас есть браузер который целиком написан на Delphi?
  • Kilkennycat © (06.03.17 19:53) [9]

    >  браузер который целиком написан на Delphi?

    если бы он был написан на Аде (или подобном сильно отличающимся языке), еще можно было бы сказать, что не катит. В остальных случаях нет разницы, ибо речь идет об алгоритме.
  • Pavia © (06.03.17 20:02) [10]
    А с выделением у вас какие проблемы?
  • Pavia © (06.03.17 20:05) [11]
    Процесс выделения довольно хорошо описан в книге:
    (Библиотека программиста) Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес-Приемы объектно-ориентированного проектирования. Паттерны проектирования-ДМК Пресс (2010)
  • Kilkennycat © (06.03.17 20:09) [12]

    > Pavia ©   (06.03.17 20:02) [10]

    тотальные :) как выделить нарисованный текст? для частного простого случая проблемы нет, например, если все символы одинакового размера и расстояние между ними тоже фиксировано. Но если текст разный, если выведен GDI+, то единственный вариант, который мне видится, связан с офигенным пересчетом размеров-координат каждого символа.
  • Kilkennycat © (06.03.17 20:09) [13]

    > Pavia ©   (06.03.17 20:05) [11]

    спасибо, не попадалось. прочитаю.
  • Pavia © (06.03.17 20:29) [14]

    > то единственный вариант, который мне видится, связан с офигенным
    > пересчетом размеров-координат каждого символа.

    На то он и процессор что-бы считать. Да перебором. Средняя книга 1 мб.
    Процессор всю её переберёт за 0٫01-0٫1 секунд. В браузерах из-за обёрток этот процесс несколько медленнее 1-10 секунд.
    Но им обычно за скоростью гнаться и не надо, так как работают с документами в 10-100 раз меньше.

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

    Соответственно при выделение вначале ищется крайние элементы, а потом уже обходится всё дерево.
  • Pavia © (06.03.17 21:14) [15]

    > aka ©   (06.03.17 18:42) [6]
    > Довольно интерный вопрос, как лично мне кажется, сходу и
    > не нашел толковых статей реализации сего дела.> если поскроллить
    > вверх-вниз страницу дельфимастера в хроме,>  то загрузка
    > становится 6% при частоте 2.4 ГГцВзял paintbox и scrollbar,
    >  в stringgrid загрузил кусок текста, по скролу сделал вывод
    > в paintbox текста через textout. - при быстром скроле загрузка
    > 60-90%, хоть с промежуточным битмапом хоть без него


    Я сделал такой тест. 700 Мгц загрузка одного ядра поднимается с 10 до 30%

    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
     Rect: TRect; State: TOwnerDrawState);
    begin
    ListBox1.Canvas.TextOut(Rect.Left, Rect.Top,ListBox1.Items[Index]);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var i,j:Integer;
    s:String;
    begin
    ListBox1.Style:=lbOwnerDrawFixed;
    for i:=0 to 1000 do
    begin
     s:='';
     for j:=0 to 200 do
      s:=s+char(random(64)+Ord('A'));
     ListBox1.Items.Add(IntToStr(i)+':'+s);
    end;
    end;


    Мерить загрузку диспетчером задач не хорошо. Так как он реагирует только на очередь сообщений. Поэтому это нормально что ваш код показатель 90%
    А TListBox использует очередь сообщений и каждая отрисованная строчка эта  заход и выход из очереди сообщений. ОС имеет возможность с планировать нагрузку и сделать паузу между их отрисовками.
    И основы отрисовки и оптимизации можно почерпнуть из исходников того же TListBox он не рендерит все строчки, а только те что отображаются в данный момент на экране.
  • Pavia © (06.03.17 21:16) [16]
    Забыл вставить, что-бы белое снизу не моячило надо включить двойную буферизацию.


    > ListBox1.DoubleBuffered:=True;
  • Kilkennycat © (06.03.17 21:50) [17]

    > Pavia ©   (06.03.17 20:29) [14]

    я вообще надеялся вначале, что есть какой-то винапишный функционал. а нет...
  • DVM © (06.03.17 22:05) [18]

    > А у вас есть браузер который целиком написан на Delphi?

    Есть и такие. Кривоватые и ограниченные, но ответ на вопрос данной ветки там найти можно.
  • Игорь Шевченко © (06.03.17 23:11) [19]
    Pavia ©   (06.03.17 21:14) [15]


    > Я сделал такой тест.


    Вот это истинное лицо delphimaster.ru, бессмысленное и беспощадное.
 
Конференция "Прочее" » Внутренние устройво просмотрщиков PDF,DJVU, браузеров итд.
Есть новые Нет новых   [134431   +10][b:0][p:0.001]