Конференция "Прочее" » Внутренние устройво просмотрщиков 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, бессмысленное и беспощадное.
  • aka © (06.03.17 23:18) [20]

    > Pavia ©   (06.03.17 21:14) [15]
    > Я сделал такой тест. 700 Мгц загрузка одного ядра поднимается
    > с 10 до 30%


    А размер окна какой? Размер окна сильно влияет на результат
  • aka © (06.03.17 23:22) [21]

    > Есть и такие. Кривоватые и ограниченные, но ответ на вопрос
    > данной ветки там найти можно.

    Не крутовато будет? А просто описать основополагающие принципы темы вопроса никто наверное не может?
  • Pavia © (07.03.17 07:22) [22]
    Размер на весь экран1280х1024 минус панель пуск.
    А какие Вам принципы нужны?
  • Kilkennycat © (07.03.17 08:58) [23]

    > минус панель пуск.

    не всегда. в одном случае из трех.
  • fics © (07.03.17 11:20) [24]
    Наверное мне нужно немного переформулировать вопрос. Все в общем нормально работает, а все эти тормоза из-за DOUBLEBUFFERED, но без него мерцает (
    а проц почти не грузится. Можно избавиться от мерцания подешевле чем через DOUBLEBUFFERED?
  • Pavia © (07.03.17 12:13) [25]

    > Все в общем нормально работает, а все эти тормоза из-за
    > DOUBLEBUFFERED, но без него мерцает (а проц почти не грузится.
    >  Можно избавиться от мерцания подешевле чем через DOUBLEBUFFERED?

    А версия Delphi у вас какая?
  • Pavia © (07.03.17 12:33) [26]
    D7  используется псевдо двойная буферизация - она не тормозит. В XE используется двойная буферизация, можно сменить её тип на совместимой с D7 делается одной строчкой.

    Можно написать форму на WinAPI и "убрать" лишнее стирание фона. Не помню точно перехватывается оно или отменяется.

    Либо уходить на OpenGL, DirectX, Vulkan они работают быстрее.  Особенно когда вычисления написаны так что-бы они велись на GPU и GRAM. GRAM - по быстрее будет да и GPU, производительнее чем CPU.
    Использование OpenGL, DirectX, Vulkan - не означает автоматом, что все расчёты у вас будут на GPU, нужно правильно писать код.
  • fics © (07.03.17 13:01) [27]

    > Pavia ©   (07.03.17 12:33) [26]


    > нужно правильно писать код.

    Это сложный вопрос )))

    > А версия Delphi у вас какая?

    D7
  • Pavia © (07.03.17 19:18) [28]
    Тогда берёшь SamplingProfiler-1.8.1 смотришь что тормозит и оптимизируешь те методы и функции. Добавляешь кэширование.
  • Rouse_ © (07.03.17 22:00) [29]
    Я бы не советовал автору ветки с наскоку браться за это дело. Есть у меня в практике такой проект - полноценный HTML браузер поддерживающий рендеринг страниц обьемом в 60-80 мегабайт только верстки (даже хром с таким не справится, а у нас и до 200 метров доходит иногда) ну и плюс картинки - там объем бешеный.
    Писалось это дело почти семь месяцев двумя не совсем глупыми программистами - умаялись, если не сказать больше, даже в какой-то момент вообще хотели кинуть эту беду, но смогли реализовать.
    Если смотреть сейчас - я бы больше никогда за такую задачу не взялся
  • DayGaykin © (07.03.17 22:25) [30]

    > Rouse_ ©   (07.03.17 22:00) [29]

    Полноценный своими руками? С DynamicHTML, CSS (включая :hover) и JS?
  • Rouse_ © (07.03.17 22:45) [31]

    > DayGaykin ©   (07.03.17 22:25) [30]
    >
    > > Rouse_ ©   (07.03.17 22:00) [29]
    >
    > Полноценный своими руками? С DynamicHTML, CSS (включая :
    > hover) и JS?

    Давай сейчас принародно признаемся кто нам с Женей для этого контрола масштабирование делал, да Дим? ;)
    Я думаю я ответил на твой вопрос :)
  • DVM © (09.03.17 15:08) [32]

    > Rouse_ ©   (07.03.17 22:00) [29]


    >  Есть у меня в практике такой проект - полноценный HTML
    > браузер поддерживающий рендеринг страниц обьемом в 60-80
    > мегабайт только верстки

    Насчет полноценности я бы засомневался, но да бог с ней.
    Откуда такие огромные страницы берутся?
  • Rouse_ © (09.03.17 15:31) [33]
    Документация сметная, чтоб отобразить приходится на страницы разбивать. Некоторые документы размером в две с половиной тысячи страниц выходит, ну и по обьему соответственно не маленькие.
    Вот так выглядит: http://www.grandsmeta.ru/images/st-7.jpg
 
Конференция "Прочее" » Внутренние устройво просмотрщиков PDF,DJVU, браузеров итд.
Есть новые Нет новых   [134431   +10][b:0][p:0.001]