Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Посмотрите на веб окна (https://javascript.ru/forum/project/7250-posmotrite-na-veb-okna.html)

Kolyaj 03.02.2010 14:43

Цитата:

Сообщение от limonad
Вы сами это советовали. Уменьшить количество элементов.

Ох ты ж господи. Ещё раз повторяю, был вопрос "Много элементов?", был ответ "Да, можно меньше". Я ничего не советовал. С учетом id-шников, inline-стилей и ссылок с псевдо-адресом javascript:, количество элементов не главная ваша проблема. Оно может и проблемой-то быть перестанет.

limonad 03.02.2010 17:22

На иконках убрал id, inline-стили и ссылки с псевдо-адресом javascript. Вот что получилось:
<div style="z-index: 210; left: 10px; top: 50px; background-image: url(http://rss2banner.com/desktop/img/kwrite.png);" class="IconCSS" title="Блог">
 <a>Блог</a>
</div>

что-то все также и дальше тормозит.

события так назначаются:
obj.onmouseover = function() { this.onmousedown = IsDown;} может из-за этого? addEventListener/attachEvent - лучше будет?

Kolyaj 03.02.2010 17:30

Цитата:

Сообщение от limonad
что-то все также и дальше тормозит.

У меня иконки не тормозят.

Цитата:

Сообщение от limonad
addEventListener/attachEvent - лучше будет?

Будет лучше, но не из-за скорости.

А вы я так понимаю вылечили "баг" IE? Плохое решение.

ZoNT 03.02.2010 17:32

Эвалы можно всё-таки убрать, прогнать весь код профилировщиком, оптимизировать все медленные функции.
Окна при перетаскивании жутко тормозят на моём двухъядерном проце...
Вероятнее всего, что из-за прозрачной картинки при перетаскивании.
Я уверен, что окна на дивах будут работать быстрее (у меня есть пример, который работает без тормозов, но показать его я не могу из коммерческих соображений).

limonad 03.02.2010 18:16

Цитата:

Сообщение от Kolyaj
А вы я так понимаю вылечили "баг" IE? Плохое решение.

чем плохое?

limonad 03.02.2010 18:17

ZoNT,
верю. сначала с иконками надо разобраться.

Kolyaj 03.02.2010 18:21

Цитата:

Сообщение от limonad
чем плохое?

Стоит мне при перетаскивании иконки чуть выскочить за пределы экрана, как иконка "выскальзывает". Она не должна отпускаться, пока я кнопку мыши не отпущу.

B~Vladi 03.02.2010 18:22

Скорость рендеринга зависит от:
1. аппаратной части (процессор, видеокарта)
2. загруженности процессора и оперативной памяти
3. браузера (движок, дополнительные плагины и расширения)
4. сложности DOM-дерева и алгоритма JS-кода.

Оптимизировать мы можем только четвёртый пункт, что само по себе мало для существенной оптимизации. Учитывая, что событие mousemove во всех браузерах происходит очень часто (настолько, насколько позволяют первые 3 пункта), это не может не напрягать процессор (т.к. все расчеты лежат именно на нем, а не на видеокарте) и является узким местом в любом интерфейсе. Поэтому необходимо найти те решения, которые оптимизируют DOM, а так же программный код. Этим я и предлагаю тебе заняться самому, а не ныть здесь.

Kolyaj 03.02.2010 18:30

Цитата:

Сообщение от B~Vladi
Скорость рендеринга зависит от:

Как раз только что перечитывал http://clubs.ya.ru/yacf/replies.xml?item_no=338 :)

limonad 03.02.2010 19:31

Цитата:

Сообщение от Kolyaj
Стоит мне при перетаскивании иконки чуть выскочить за пределы экрана, как иконка "выскальзывает". Она не должна отпускаться, пока я кнопку мыши не отпущу.

Это реализовано специально. Вышел за окно - значит отпустил кнопку. А то выкинешь ее и забудешь где-то там в небытии. Это не обязательно, и именно это не есть собственно решением для бага IE о котором упоминали. Решение бага в том, чтобы проверять при drag состояние клавиши. Если она отжата, то выполняем вашу логику отпускания кнопки. Хорошее оно или нет судить вам.

limonad 03.02.2010 19:36

B~Vladi,
Никто не ноет. Просто интересуюсь. И уже есть какой-то результат. Уверен все будет ОК.

B~Vladi 03.02.2010 19:58

Цитата:

Сообщение от limonad
И уже есть какой-то результат. Уверен все будет ОК.

Воооот.

limonad 08.02.2010 12:15

Цитата:

Сообщение от ZoNT
уверен, что окна на дивах будут работать быстрее

Сделал окна на дивах.

ZoNT 10.02.2010 12:03

http://mugtug.com/sketchpad/ в этом редакторе окошечки с прозрачностью, таскаются, не тормозят... Никаких эффектов "гонки за мышью"...

vflash 10.02.2010 12:54

ZoNT, на этой странице элементов всего ничего (530) и текста почти нет, скругление картинкой. также изменение размера только по s-w . да и ничуть они не быстрее.

limonad 10.02.2010 13:18

Замерил через DynaTrace рендеринг.
Результаты при перетаскивани:

0.04ms - пустой фрейм или без фрейма в окне
0.03ms - непрозрачное окно
0.02ms - без фона на странице

0.10ms - с фоном на странице, с прозрачностью и с фреймом.

какие выводы можно сделать?

P.S. Кстати если окна малых размеров, то меньше область рендеринга.

Kolyaj 10.02.2010 13:29

Цитата:

Сообщение от limonad
какие выводы можно сделать?

Не использовать iframe.

limonad 10.02.2010 13:38

Цитата:

Сообщение от Kolyaj
Не использовать iframe.

Гениально! Они, к сожалению, нужны. Есть вопрос. Для получения размера области кроме offsetWidth offsetHeight clientWidth clientHeight методов есть еще какие-то? Какие из них работают быстрее?

ZoNT 10.02.2010 13:38

Цитата:

Сообщение от vflash
ZoNT, на этой странице элементов всего ничего (530) и текста почти нет, скругление картинкой. также изменение размера только по s-w . да и ничуть они не быстрее.

На моём слабеньком компе они раз в 100 быстрее чем эти вебокна. Лень заморачиваться с созданием видео, а так бы показал какое слайдшоу устраивают вебокна при перетаскивании (в любом браузере, в том числе и в Хроме)...

Kolyaj 10.02.2010 13:49

Цитата:

Сообщение от limonad
Они, к сожалению, нужны.

Зачем?

limonad 10.02.2010 13:53

Kolyaj,
ну а как еще можно показать содержимое другой страницы внутри окна?

Kolyaj 10.02.2010 14:06

А зачем их хранить как полноценные страницы, если они ими не являются?

B~Vladi 10.02.2010 18:14

limonad, замени фреймы AJAX-ом.

Заметил одну интересную вещь:
если при драге ничего больше не делается, кроме установки left и top (ну и аналогичных вещей) - браузер пытается оптимизировать рендеринг путем уменьшения fps. Как итог - тормоза.
Таблетка - принудительный reflow. Необходимо обратиться к любому из свойств (любого элемента):
innerWidth, innerHeight (как вариант).

Необходимо только протестить, какие параметры элемента влияют на скорость вычисления размера (и влияют ли вообще).

limonad 10.02.2010 18:58

Попробовал reflow, рендеринг вырос до 0.12. Нашел кое-что по теме рендеринга: http://webo.in/articles/all/2009/31-...flow-relayout/ . Правда и там не всему можно верить. Например, там написано, что так делать плохо:
el.style.left = left + "px";
el.style.top  = top  + "px";

лучше мол так:
el.style.cssText += "; left: " + left + "px; top: " + top + "px;";

я попробовал, второй вариант значительно медленнее работает.

limonad 10.02.2010 19:05

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

B~Vladi 10.02.2010 19:52

Цитата:

Сообщение от limonad
Попробовал reflow, рендеринг вырос до 0.12

За-то тормозов нет.
Цитата:

Сообщение от limonad
Ведь могут быть страницы с неродного домена или например ссылки на страницах (как они будут тогда работать).

Сайт в сайте? Может не стоит так далеко уходить?
Цитата:

Сообщение от limonad
лучше мол так:

Аха, я тоже читал. Может попробовать менять margin?

B~Vladi 10.02.2010 19:57

Да, забыл. В ИЕ8 рендеринг медленнее, чем в прошлых версиях (в 6 самый быстрый). Можно перевести его в режим ИЕ7 - помогает.

limonad 10.02.2010 20:10

Что вы думаете о такой идее? При старте драга из divа содержащего фрейм запомнить в какой-то пременной его innerHTML и тут-же в div записать innerHTML=''. А при окончании драга вернуть в div то, что запомнили. (но тут наверное может потеряться содержимое фрейма если там был сделан переход по ссылкам, да и скрол потерятся если был.). Может есть еще какой-то вариант весь этот узел с фреймом убрать куда-то на время переноса так, чтобы он не пересчитывался и не рендерился? Подскажите.

B~Vladi 10.02.2010 20:18

Цитата:

Сообщение от limonad
Что вы думаете о такой идее?

Не прокатит: потеряются все обработчики событий. Содержимое можно просто скрывать или перенести в другое место: эффект тот-же.

limonad 10.02.2010 20:23

B~Vladi, содержимое скрывается итак. Я хотел бы избавится от фрейма вообще на время драга. Все таки без фреймов быстрее работает. А обработчики мне для фрейма не нужны, их у него нет. Как бы удалить этот фрейм на время из DOMa.

B~Vladi 10.02.2010 20:25

Цитата:

Сообщение от limonad
Как бы удалить этот фрейм на время из DOMa.

Я же сказал - перенести:
oldElement.appendChild(frame);

А oldElement - скрывай.

Мараторий 10.02.2010 21:06

Лучше тогда
var df = document.createDocumentFragment();
df.appendChild(frame);


// и обратно
div.appendChild(df);

B~Vladi 10.02.2010 21:26

Цитата:

Сообщение от Мараторий
Лучше тогда

О идеально:)

limonad 10.02.2010 22:17

Попробовал оба варианта. Неподходит, потому что скрол в фрейме не запоминается и если я до этого внутри фрейма переходил по ссылкам или на странице внутри фрейма исполнялся js, то при возврате фрейма в родной див окна, там показано начальное содержимое, а не то что там изменялось до переноса (вообще происходит загрузка документа по новой). При этом скорость рендеринга чуть чуть выросла конечно стала 0.08мс, но толку от этого.

Мараторий 10.02.2010 22:28

а если делать display: none?

limonad 10.02.2010 22:38

Цитата:

Сообщение от Мараторий (Сообщение 44408)
а если делать display: none?

Так и было сделано и есть. Просто думал, что если выдернуть фрейм из окна то станет лучше.

B~Vladi 10.02.2010 23:03

Цитата:

Сообщение от limonad
Неподходит, потому что скрол в фрейме не запоминается

Дк запомни.
Цитата:

Сообщение от limonad
если я до этого внутри фрейма переходил по ссылкам или на странице внутри фрейма исполнялся js, то при возврате фрейма в родной див окна, там показано начальное содержимое, а не то что там изменялось до переноса (вообще происходит загрузка документа по новой)

Так быть не должно. Ошибка у тебя где-то.

limonad 10.02.2010 23:26

Врядле там ошибка в двух действиях. Фрейм заново грузит документ при appendChild из DocumentFragment или из div . Не имет значения из чего. А не надо случаем сам DocumentFragment добавить в какой нить контейнер?

Мараторий 11.02.2010 00:38

Цитата:

Сообщение от limonad (Сообщение 44409)
Так и было сделано и есть. Просто думал, что если выдернуть фрейм из окна то станет лучше.

Сейчас используется не display: none, а visibility: hidden

limonad 11.02.2010 09:44

Мараторий, на localhost был display. поставил display на сервер.


Часовой пояс GMT +3, время: 02:22.