Friday, June 25, 2010

Сравнение скорости прорисовки карт(gmap, openlayers).

Маленькое сравнение библиотек для работы с картами (в скобках более слабый компьютер):
  1. gmap v3 - 7,186(13) секунд;
  2. gmap v2 - 20,541(34) секунд;
  3. openlayers - 6,181(7) секунд.
Условия:
  • Прорисовывается список стран используя изначально разобранный kml, для уравновешивания условий прорисовки (Gmap - для прорисовки kml используется разбор на уровне сервера с возвратом обратно только готового изображения);
  • Запускается по нажатию на start, и до момента нажатия stop. Почему не автоматом? Карта может прорисовываться асинхронно, а так точно можно отследить, хоть и не с абсолютной точностью, момент когда по мнению пользователя все прорисовано;
  • Подсчет времени начинается после разбора, результаты должны быть более-менее реалистичными;
  • Вариант прорисовки через canvas для openlayers не участвовал в сравнении, так как сильно проигрывал стандартному варианту;
  • Использовался ff 3.6.3(linux).
Если кто-то найдет ошибки в коде прорисовки или способы ускорения буду рад обсудить.

Saturday, June 5, 2010

Hybrid graphics and .34

Поставил себе .34 ядро в Ubuntu, в нем поддержка Hybrid graphics(switcheroo), оказалась отключена (файл для управления не создавался). Пересобирать ядро, как то желания не появилось, решил пока подождать выхода .34.1 и посмотреть на результаты в Lunar. В этом дистрибутиве появляются ядра в основном только после выхода первого багфикса, что в принципе и правильно.

В общем результаты: самый честный счетчик попугаев glxgears подрос до 3278 frames in 5.0 seconds(OpenGL renderer string: Mesa DRI R600 (RS780 9612) 20090101 TCL DRI2, 1.5 Mesa 7.7.1), в втором кубе вода стала прозрачной, но деревья стали выглядеть несколько странно в виде рубленных текстур.

Saturday, May 29, 2010

Формирование pdf из js

Обнаружилась интересная библиотека jspdf - позволяющая создавать простейшие pdf из js. Она основана на коде(скорее принципах и как пример) fpdf. Позволяет менять размер шрифта и размещать текст на странице - pdf возвращается как datauri, отлично работает в linux, но в windows есть несколько проблемок: ie не понимает datauri ни в каких формах, кроме как встроенное в страницу изображение, firefox при установленных обработчиках pdf(например: acrobat reader) происходит переход на этот url и показывается черный экран вместо контента страницы, иначе предложение загрузить. Это решаемо достаточно просто контент отправляется обратно на сервер как параметр POST, в ответ возвращается уже как контент с типом pdf - и все нормально работает.

P.S.: Я немного улучшил эту библиотеку добавив смену цвета шрифтов, поддерживается градации серого и полная RGB палитра.

Monday, May 17, 2010

gtkhtml

Прогресс добавления поддержки css:

libxml2


Может изменять кодировку поэтому дерево всегда приходит в utf8. То есть она частично снимает проблему конвертации - нужна только в ответном запросе.

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

После получения полного контента нужно отмечать что пришел последняя часть информации - если не указать то могут быть не полностью обработан полученные данные - разбор полностью выполняется только для полностью корректных частей. Если данные были не корректно отформатированы - то libxml всегда пытается  вернуть корректное дерево.

Сама библиотека:


Отрисовка дерева строиться на собственном виде дерева элементов - поэтому
четкого преобразования полученного DOM дерева  в дерево элементов один в один получить нельзя. Сейчас с моими изменениями пытаемся реализовать почти преобразование один в один - поэтому многие вещи отображаются не корректно. Например картинки - если они находятся на более чем одном уровне вложенности их не показывает, так как описания потока отображения(clue) - поддерживает только определенный вид вложенности - и определенные комбинации не могут быть отработаны так как код реализации выравнивания и раз размещения реализованы не для всех потоков(точнее по части функционала в каждом) .

Замена реализации отрисовки на данном этапе мне кажется не правильным путем - так еще больше оторвет мою ветвь от от основной - и вероятность принятия изменений в основную ветвь еще больше упадет и будет сложнее тестировать, так как появятся новые специфичные ошибки и старые тесты даже при аналогичном отображении будут иметь другую структуры элементов и старые тесты скорее всего проваляться.
Сейчас основной различие - применены все мои изменения для исправления мелких ошибок функциональности(выделены как патчи в bugzilla): исправления относительных путей, поддержка datauri и мелкие исправление в makefile. И не выделенные в качестве изменений: зависимости от гнома при компиляции(gnome-common,gconf), удален парсер html и рекурсивная обработка дерева.

В общем пока планирую - вернуться к не рекурсивному обходу дерева(стандартным старым функциям) и попытаться запостить патч в стандартную ветвь.

Стоит прочитать.....

Недавно дочитал книгу о физике Ричарде Ф.Фейнмане.'Вы, конечно, шутите, мистер Фейнман!' - очень веселая и интересная книга, рекомендовал бы в любом случая прочитать. Физика(и вообще наука) в книге упоминается очень вскользь и очень простыми для понимания фразами, можно читать книгу как собрание интересных историй из жизни.

Saturday, April 24, 2010

Hybrid graphics...Очень кратко

Включение достаточно простое:
  • патчим текущее ядро
  • включаем kms в ядре и поддержку radeon(желательно все как модули)
  • устанавливаем последние версии mesa и xf86-video-ati
  • копируем прошивки R600_rlc.bin и R700_rlc.bin в /lib/firmware/radeon/

Перегружаемся и монтируем mount -t debugfs none /sys/kernel/debug в результате появляется переключатель /sys/kernel/debug/vgaswitcheroo/switch - из которого можно прочитать текущее состояние видеокарт. Если записать в него записать( echo some_thing > switch):
  • DDIS - включение дискретной карты;
  • DIGD - включение интегрированной карты;
  • OFF - выключить лишнюю карту - позволяет серьезно продлить время работы от батарейки(при включении включены обе карты).

Благодарность Dave Airlie за решение этой маленькой несуразицы с поддержкой. :-) и авторам заметки asusm51ta-with-linux. Надеюсь это патч скоро попадет в основную ветвь ядра....

И маленькие логи напоследок:
glxinfo 3650
....
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: Mesa DRI R600 (RV635 9591) 20090101  TCL DRI2
OpenGL version string: 2.0 Mesa 7.8.1
OpenGL shading language version string: 1.10
....
glxgears 3650
......
9416 frames in 5.0 seconds = 1883.109 FPS
......
glxinfo 3200
......
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: Mesa DRI R600 (RS780 9612) 20090101  TCL DRI2
OpenGL version string: 2.0 Mesa 7.8.1
OpenGL shading language version string: 1.10
.......
glxgears 3200
.......
6627 frames in 5.0 seconds = 1325.309 FPS

Friday, March 12, 2010

Программный scroll на JQuery

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

Предполагаемый выход создание div ограничивающего общий обзор видимости(div_for_scroll), в нем большой div(scrolled_content_full) (его размер линейно зависит от реального количества элементов). Он нужен для получения нужного нам scroll. И уже в нем div(scrolled_content) сдвигаемый по вертикали в котором отображается список видимых в данный момент элементов.

Вот и вся идея.

HTML код:
<div id="div_for_scroll" style="height: 132px; overflow-y: scroll;">
<div id="scrolled_content_full" style="height: 1000px;">
<div id="scrolled_content" style="padding-top: 123px;">
This div contein scrolled content
</div>
</div>
</div>

Js код:
        var ElementsArray = {};
       
        //каждый элемент массива объект вида: {html:html, name:HumName, id:i}, имя нужно для сортировки.
       
        function refreshScroll() {

            var FontSize = 16;
            var newSize = parseInt((ElementsArray.length + 1.5) * FontSize);
            if (newSize<132)
                newSize = 132;
            jQuery("#scrolled_content_full").css("height", newSize + "px");
            var currpos = parseInt(jQuery("#div_for_scroll").scrollTop() / FontSize);
            var newHtml =  "";
            for (var i= currpos;i< (currpos + 10); i ++) {
                if (i < ElementsArray.length)
                    newHtml    += ElementsArray[i].html;
            }
           
            jQuery("#scrolled_content").html(newHtml);
            jQuery("#scrolled_content").css("padding-top",jQuery("#div_for_scroll").scrollTop());
        }

        jQuery("#div_for_scroll").scroll(refreshScroll);