Sto avendo seri problemi di prestazioni visive & con lo script seguente. Il problema più grande è che l'animazione dell'oggetto sta diventando davvero a scatti, quasi paralizzante in IE9, ma sempre più fastidiosa in Firefox.Prestazioni JS/jQuery scadenti, in particolare in IE9 e Firefox
È stato abbastanza veloce fino a poco tempo fa, ma sono preoccupato per la complessità che sta rallentando le cose. Stranamente il Sunspider benchmark viene eseguito più velocemente nella mia istanza di IE9, che in Firefox.
Lo script (che è un frammento di una collezione più ampia ***):
- assegni un registro di memorizzazione delle sessioni HTML5 della progressione utenti attraverso il gioco.
- A seconda del livello, anima un oggetto tra due punti utilizzando crSpline.
- garantisce la finestra del browser segue l'oggetto attraverso una grande tela, tramite scrollLeft ecc
- Infine, si carica una finestra di popup tramite colorbox.
- Quando questa casella è chiusa, il registro progressione utente viene incrementato di conseguenza e l'oggetto si sposta nuovamente.
Ci sono abili evidenti miglioramenti di velocità che potrei apportare al mio codice? C'è un bel po 'di ripetizione, come posso ridurlo? Ci sono cicli infiniti in esecuzione che mi mancano? C'è un software che posso usare per profilare i punti lenti del JS?
*** (non posso fornire altri file JS o HTML, ma ho identificato questo script come il problema)
UPDATE: Dopo un bel po 'di più test, sembra che la funzione animate passo - che segue l'oggetto nella finestra tramite scrollLeft - stia causando l'animazione a scatti. Rimozione migliora notevolmente le cose.
Tuttavia, questa non è una soluzione valida a lungo termine. Una soluzione rapida consiste nel richiamare la funzione follow al completamento, ma questa è un'esperienza molto meno fluida per l'utente finale, specialmente quando l'oggetto si sposta su distanze maggiori.
Quindi, come modifico la funzione di passo per eseguire un 'molto più' lento/più efficiente? Immagino che il movimento sia causato da esso utilizzando tutte le risorse disponibili per seguire l'oggetto ogni millisecondo.
(function ($) {
sessionStorage.gameMainStage = 0
moveShip = function() {
switch (sessionStorage.gameMainStage)
{
case '1':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[715, 425], [582, 524], [556, 646], [722, 688], [963, 629], [1143, 467]]) },{
duration: 10000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-1.html", width:"737px", height:"474px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '2':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[1143, 467], [1343, 667], [1443, 367], [1243, 167], [1499, 285]]) },
{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-2", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '3':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[1499, 285], [1922, 423]]) },
{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-3.html", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '4':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[1922, 423], [2216, 578]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"game-1.html", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '5':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[2216, 578], [2769, 904]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-4.html", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '6':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[2769, 904], [3263, 903]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-5.html", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '7':
$.colorbox({href:"game-2.html", width:"500px", height:"600px", iframe: true, overlayClose: false, escKey: false, close: ""});
break;
case '8':
$.colorbox({href:"dialog-6.html", width:"737px", height:"567px", iframe: true, overlayClose: false, escKey: false, close: ""});
break;
case '9':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[3263, 903], [4141, 820]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-7.html", width:"737px", height:"547px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '10':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[4141, 820], [4568, 949], [4447, 1175]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-8.html", width:"737px", height:"434px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
case '11':
$.colorbox({href:"dialog-9.html", width:"737px", height:"567px", iframe: true, overlayClose: false, escKey: false, close: ""});
break;
case '12':
$("#object").animate(
{ crSpline: $.crSpline.buildSequence([[4447, 1175], [4701, 1124], [4816, 822]]) },{
duration: 5000,
step: function() {
var mover = $('#object'),
posX = mover.position().left;
posY = mover.position().top;
$(window)
.scrollLeft(posX - $(window).width()/2)
.scrollTop(posY - $(window).height()/2);
},
complete: function() {
$.colorbox({href:"dialog-10.html", width:"900px", height:"687px", iframe: true, overlayClose: false, escKey: false, close: ""});
}
}
);
break;
}
};
})(jQuery);
Solo una nota a margine dalla tua pagina di benchmark: 'Questo benchmark testa solo il linguaggio JavaScript principale, non il DOM o altre API del browser '- la tua colorbox e le animazioni sono quasi esclusivamente DOM. –