Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   оптимизация drag and drop (https://javascript.ru/forum/events/31024-optimizaciya-drag-drop.html)

cyber 23.08.2012 18:03

оптимизация drag and drop
 
мучаюсь все с тем же проектом и осталось 2 проблемы, и одна из них drag and drop проблема в том что при max зуме начинает притормаживать перемещение в хроме, пытался сделать такую обертку
function MoveWrapper() {

var timeout = true;	
	
return function (e) {
	
 if(!timeout || !move) return;
 
  timeout = false;
  
 setTimeout(function () {
	 
 MouseMove(e) 	 
  timeout = true;	 
	 
	 },20);
	 
}	  
	  }

но особо не помогло.
вторым вариантом оптимизации было разрезать картинку на блоки, что в общем сработало но оказалось собрать ее в одну картинку с размером меньше оригинала достаточно тяжело..
есть ли какие то предложение , советы по оптимизации?
тестовая страница http://cyberua.16mb.com/files/zoom.html

Deff 23.08.2012 18:09

cyber,
Для оптимизации стоит не менее 100 брать (12 это реально минимальный отрабатываемый интервал

строка 16	     },120);

cyber 23.08.2012 18:11

хм, попробую но раньше стояло 70 и все равно были фризы

cyber 23.08.2012 18:13

когда ставиш 100 возникает ощущение что установлена анимация
-webkit-transition: all 1s ease;

ну ты понимаеш о чем я=)

cyber 23.08.2012 18:15

оптимально 40, но большого эфекта не дает

cyber 23.08.2012 19:07

неужели не у кого нет идей по оптимизации?
ну или подскажите как сделать :
есть картинка к примеру 1920 x 1200 , она разрезается на блоки (не все блоки равные)
кусок кода

<div id="IMG-map">
<div class="wrapper_parts">
<img src="delete/0.png">
</div>
<div class="wrapper_parts">
<img src="delete/1.png">
</div>
<div class="wrapper_parts">
<img src="delete/2.png">
</div>
</div>

но вот в чем проблема в блоке у нее должен быть размер 1600 х 1000 и по этому она вылазит за пределы блока, есть идеи как ее можно сжать на css?

Serg_pnz 23.08.2012 19:24

А не кажется ли вам, что на все масштабы надо делать свои картинки?
По сабжу посмотрел на хроме на максимальном масштабе, всё вроде нормально работает, а вот в лисе от края картинки остаются полосы.

cyber 23.08.2012 19:27

Цитата:

Сообщение от Serg_pnz (Сообщение 200049)
А не кажется ли вам, что на все масштабы надо делать свои картинки?
По сабжу посмотрел на хроме на максимальном масштабе, всё вроде нормально работает, а вот в лисе от края картинки остаются полосы.

я то думал об этом но смысел, при масштабе к примеру
1280х900 картинка в таком же разрешение
при 1400 х1000 картинка в таком же разрешение
при 1920х1200 картинка в таком же разрешение и хоп тут опять тормоза

какая разница тогда уже проще увеличивать одну картинку

Deff 23.08.2012 19:56

cyber,
Тут нужна такая фича - при зажатой мыши - подсовываем и перемещаем достаточно неважную по качеству картинку - как мышь отпускаем - втыкаем картинку с нормальным разрешением - байтовый размер "Плохой" картинки в 700КB - уберет все тормоза

Т.е задача облегчить картинку с приемлимым видом до 700 -760КB для перемещений (оптимально тут фильт "Aппликaция" c 20-32 градациями - т.е)

( *в принципе - хороший Фотошопист может ужать дополнительно и основную, существующую картинку, без потери качества - до 1400КB - но для таких размеров картинки под ФШ оптимизацию нужен комп с памятью в 4 гига минимум

cyber 23.08.2012 20:04

Цитата:

Сообщение от Deff (Сообщение 200061)
cyber,
Тут нужна такая фича - при зажатой мыши - подсовываем и перемещаем достаточно неважную по качеству картинку - как мышь отпускаем - втыкаем картинку с нормальным разрешением - байтовый размер "Плохой" картинки в 700КB - уберет все тормоза

Т.е задача облегчить картинку с приемлимым видом до 700 -760КB для перемещений (оптимально тут фильт "Aппликaция" c 20-32 градациями - т.е)

( *в принципе - хороший Фотошопист может ужать и существующую без потери качества - до 1400КB - но для таких размеров картинки под ФШ оптимизацию нужен комп с памятью в 4 гига минимум

я не совсем понял, т.е нужно взять текущую картинку сжать ее и двигать а потом перемещать нормальную? если да то не вариант, картинок слишком много что бы повторять такие операции, больше 100

Deff 23.08.2012 20:09

cyber,
Нет -
У тьву две картинки - плохая и хорошая
Текущая 1.9мега,
Воть нун сделать поплоше - такого же размера ,но с меньшей четкостью
дабы её начальный объем был 700 -780КБ
(есть сервисы в инете) или закомый фотошопер (у мну памяти не зватат - пытался помочь)

Когда перемещаешь - перемещаешь плохую - брауз тратит менее энергии на рендинг такой картинки - двигать 2 мега или 700кил, как остановился ( более чем на о.3-.4сек подсовываешь качественную

cyber 23.08.2012 20:13

я не пойму просто как будет двигатся карта под картинкой, я так понял нужно сделать что бы они синхронно двигались?

Deff 23.08.2012 20:20

cyber,
нет ты хорошую карту изымыешь (меняешь ссылку) на плохую

cyber 23.08.2012 20:20

самое странное что если картинку не увеличивать а сразу поставить в макс размер то при перемещение тормозов нет :blink:

Deff 23.08.2012 20:23

на странице сразу подгружены три картинки
Одна в самой карте(изначально "хорошая"
(И Две скрыты z-index:200) это хорошая и "плохая"
- это фишка чтобы картинки не переподгружать

Deff 23.08.2012 20:24

Цитата:

Сообщение от cyber
самое странное что если картинку не увеличивать а сразу поставить в макс размер то при перемещение тормозов нет

Ну дык вставь сперва уменьшенную дождись подгрузки большой и замени

melky 23.08.2012 22:38

Отображать (рендерить) надо через window.requestAnimationFrame
Вместо style.left и style.top надо использовать style.transform = translate(x,y);

cyber 24.08.2012 00:17

Цитата:

Сообщение от melky (Сообщение 200120)
Отображать (рендерить) надо через window.requestAnimationFrame
Вместо style.left и style.top надо использовать style.transform = translate(x,y);

да да да=)
я 2 дня не мог понять почему гугл и другие подобные скрипты юзают translate=)
кстати а подругому можно получит текущие значение translate
var translate = wrapper[0].style.WebkitTransform.match(/(-[0-9]|[0-9])+/ig);

cyber 24.08.2012 00:47

Цитата:

Сообщение от melky (Сообщение 200120)
Отображать (рендерить) надо через window.requestAnimationFrame

не могу найти инфу как это делается=(

cyber 24.08.2012 01:36

угу, зачем нужен window.requestAnimationFrame , я понял написав по быстро простенькую анимацию
http://learn.javascript.ru/play/tlW2j
<!DOCTYPE HTML>
<html>
  <head> 
  
    <style>
      *{margin:0;}
      
      .square {
        width:50px;
        height:50px;
        position:absolute;
        background-color:black;
      
      }
    
    </style>
    
   <script>
     
    if ( !window.requestAnimationFrame ) {

  window.requestAnimationFrame = ( function() {
    return window.webkitRequestAnimationFrame ||
    window.mozRequestAnimationFrame ||
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {

      window.setTimeout( callback, 1000 / 60 );

    };

  })();
} 
    </script> 
  </head>
  <body>
    <div class='square'></div>
    <div style='top:70px;'  class='square'></div>
    
    <script>
  
    var elem = document.getElementsByClassName('square');
     
     
   function app (elem,fnc) {
      
      var i = 0;
      var back = false; 
     
     (function animate () {
      elem.style.left= i+'px';
       
       if (i >= 500 || back) {
         
         back = true;
         
         i--;
       }
     
       if (!back || i == 0)  {
      
       back = false;
       i++;
       } 
      
       fnc(animate);
     }());
      
      }

app (elem[0], window.requestAnimationFrame);
app(elem[1],function ( callback,  element ) {

      window.setTimeout( callback, 1000 / 60 );

    })     
    </script>

  </body>
</html>

вопрос в другом как это поможет в моем случае?

melky 24.08.2012 10:56

Цитата:

Сообщение от cyber
вопрос в другом как это поможет в моем случае?

положение элемента будет меняться прямо перед отрисовкой. большая плавность будет. и ещё не надо заботиться о промежутке времени между вызовами отрисовки при движении мыши.

cyber 24.08.2012 16:56

т.е вместо моей обертки использовать window.requestAnimationFrame ?

melky 24.08.2012 17:53

Цитата:

Сообщение от cyber (Сообщение 200298)
т.е вместо моей обертки использовать window.requestAnimationFrame ?

я имел в виду другое.

но, да, вместо обёртки использовать оригинал, где возможно.

cyber 24.08.2012 19:24

сделал так
function MoveWrapper() {

var timeout = true;	
	
return function (e) {
	
 if(!timeout || !move) return;
 
  timeout = false;
  
 window.webkitRequestAnimationFrame(function () {//пока только для хрома
	 
  MouseMove(e) 	 
  timeout = true;	 
	 
	 });
	 
}	  
	}

а ты как имел ввиду?

melky 24.08.2012 19:29

Цитата:

Сообщение от cyber
а ты как имел ввиду?

похоже, мы о разных вещах говорили :)

а как ты рендеришь изменения?

cyber 24.08.2012 19:59

Цитата:

Сообщение от melky (Сообщение 200322)
похоже, мы о разных вещах говорили :)

а как ты рендеришь изменения?

не совсем понимаю значение фразы "рендерить изменение " в данном контексте.
Я под Рендерингом понимаю : отрисовку изоображение.
Т.е как я отображаю изменения визуально? если да то я просто перемещаю.
Сор что туплю, но реально не совсем понимаю =(

melky 24.08.2012 22:49

Цитата:

Сообщение от cyber
если да то я просто перемещаю.

можно хоть анимацией перемещать.

лучше всего, мне кажется, через translate.

но никак не через style.left.

cyber 24.08.2012 23:04

да я уже переделал давненько=)
wrapper.css({
	WebkitTransform :'translate('+left+'px,'+top+'px)'//пока для хрома так как пишу в нем=)
	});

кстати не кто не подскажит с какой версии хром поддерживает translate?

cyber 25.08.2012 16:36

нашел=)
https://developer.mozilla.org/en-US/...-moz-transform
чет не подумал там глянуть=)

melky 25.08.2012 17:06

Цитата:

Сообщение от cyber (Сообщение 200443)
нашел=)
https://developer.mozilla.org/en-US/...-moz-transform
чет не подумал там глянуть=)

на будущее, лучше всего смотреть на caniuse.com

cyber 25.08.2012 17:19

Цитата:

Сообщение от melky (Сообщение 200445)
на будущее, лучше всего смотреть на caniuse.com

смотрю тут обычно http://www.browsersupport.net/
просто решил проверить в других источниках на всякий пожарный:)

cyber 25.08.2012 17:36

еще один вопрос почему этот код работает не только в хроме правильно а и во всех остальных браузерах :blink:
wrapper[0].style.WebkitTransform.match(/(-[0-9]|[0-9])+/ig);

и есть ли способы по проще получить значение Transform?

cyber 25.08.2012 17:53

и как проверить поддержку события TransitionEnd брауезром задается через addEventListener

cyber 25.08.2012 20:28

Цитата:

Сообщение от cyber (Сообщение 200450)
и как проверить поддержку события TransitionEnd брауезром задается через addEventListener

Цитата:

Сообщение от cyber (Сообщение 200449)
еще один вопрос почему этот код работает не только в хроме правильно а и во всех остальных браузерах :blink:
wrapper[0].style.WebkitTransform.match(/(-[0-9]|[0-9])+/ig);

и есть ли способы по проще получить значение Transform?

не могу весь день найти ответы на эти вопросы=(

cyber 25.08.2012 22:11

меня игнорируют:-E

Deff 25.08.2012 22:27

cyber,
:blink: Дык melky - нет - я не в курсе, посколь не пользовалси
http://learn.javascript.ru/css-anima...-transitionend
http://qps.ru/ZyOhW
http://qps.ru/ZyOhW

cyber 25.08.2012 22:33

Цитата:

Сообщение от Deff (Сообщение 200513)
cyber,
:blink: Дык melky - нет - я не в курсе, посколь не пользовалси
http://learn.javascript.ru/css-anima...-transitionend
http://qps.ru/ZyOhW
http://qps.ru/ZyOhW

сор,просто ни кто не знает какого фига оно работает
http://learn.javascript.ru/play/9M2sNb

Deff 25.08.2012 23:08

cyber,
:-E Есть фенька http://htmlbook.ru/css/background-size
Её прикол в том - что при передвижении фоновой картинки методом background-position , - изо не перерендиваецо -а пиксельно смещаецо - скорость возрастает многократно

cyber 25.08.2012 23:09

все ответ получен, кому интересно вот в чем прикол был
Цитата:

Сообщение от Вадим Макеев
Артём, тогда всё ещё проще:

<div></div>

var div = document.querySelector('div');
div.style.BLAH = 'translate(200px, 100px)';
div.innerHTML = div.style.BLAH;

В этом примере BLAH (как и WebkitTransform) — становится некоторым CSS-свойством, которое можно и записать, и прочитать. Но срабатывает только то из них, что поддерживается браузером.


cyber 26.08.2012 20:07

и снова гемор проблемы с оптимизацией, только уже с зумом
проблема в том что если сразу после зума начать двигать элемент пару секунд жестокие тормоза, а потом все ок
пробывал сделать плавный зум, но не помогло
function smoothZoom() {
var zoom = scale - options.scaleStep;
var step = options.scaleStep / 15;

(function animate () {	

zoom += step;

if (zoom > scale){
	CallBackZoom.call(zooming, wrapper);
	return;
	}
	
zooming.css({
  WebkitTransform :'scale('+zoom+')',
  MozTransform : 'scale('+zoom+')',
  OTransform : 'scale('+zoom+')',
  msTransform : 'scale('+zoom+')'
  });
  
 window.requestAnimationFrame(animate) ;
}());

}


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