AMcoder - javascript, python, java, html, php, sql

html տարրերի դիրքերը դանդաղ տեղափոխեք iOS-ում

Ես մեծ կատարողական խնդիր ունեմ iOS html5 վեբ հավելվածում, երբ ես փոփոխում եմ բազմաթիվ html տարրերի դիրքը CSS-ում: Ես կցանկանայի նաև ձեռքով տեղափոխել իմ տարրերը: Ես չեմ ուզում օգտագործել CSS փոխակերպումը, քանի որ հնարավոր չէ դադարեցնել անիմացիան (մենք պատրաստում ենք բարձր արձագանքող խաղ):

Իմ օրինակը լավ է աշխատում աշխատասեղանի բրաուզերի վրա (chrome, firefox և այլն), Android-ում: Բայց այն շատ դանդաղ է աշխատում iPad 2-ի և iPhone 4S-ի վրա (երկուսն էլ աշխատում են iOS 5.1): Phonegap հավելվածում html5 կոդի գործարկումն ավելի լավ է, քան ուղղակի բրաուզերում, բայց դեռ դանդաղ է:

Ի՞նչ եք առաջարկում բարելավելու համար:
խմբագրվող օրինակ
ամբողջ էկրանով օրինակ


  • Դուք երբևէ հասկացե՞լ եք սա: Դա jquery չէ, ինչ-որ բան է կատարվում iOS-ի և շարժվող տարրերի հետ... 03.11.2013
  • @Kevin Nope. Ես թողեցի նախագիծը և դարձրի ավելի քիչ ռեսուրս սպառող մի բան... Իմ եզրակացությունն այն էր, որ html5-ը պատրաստ չէ բարձր կատարողական խաղերի: 04.11.2013

Պատասխանները:


1

Նախ, եթե ցանկանում եք մի բան, որը դանդաղ չէ, խուսափեք jQuery-ի բոլոր հնարավոր զանգերից:

Ահա, թե ինչպես ես կվերագրեի (իսկապես արագ) ձեր կոդը.

// shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

var canvas = document.getElementById('canvas-test');
    canvas.height = 500;
    canvas.width = 500;
    var context = canvas.getContext('2d');

    // in this example, the fillstyle is always the same. no need to change it at every loop
    context.fillStyle = "#FF0000";


var balls = [];
var ballcanvas = [];
var ballctx = [];

// create 30 balls in canvases
var eDivBody = document.getElementById('divbody');
for (var i = 0; i < 30; i++){
    balls[i] = {
        x : 250,
        y : 100 + i * 2,
        dx : 3, // direction
    };

    // create the canvas
    var eBall = document.createElement('canvas');
    eBall.id = 'ballcanvas' + i;
    eBall.width = 75;
    eBall.height = 75;
    eDivBody.appendChild(eBall);

    // some css
    // no need for jQuery
    eBall.style.position = "absolute";
    eBall.style.left = balls[i].x + "px";
    eBall.style.top = balls[i].y + "px";
    eBall.style.backgroundColor = "#000000";

    // associate the element to the ball, no need to go threw the DOM after
balls[i].element = eBall;
}


var ball_test = {
    x : 250,
    y : 300,
    dx : 3 // direction
};


function loop(ball_test, balls, canvas, context, ballcanvas, ballctx){
    //change of direction on the sides
    if (ball_test.x > 400 || ball_test.x < 100)
        ball_test.dx *= -1;
    // movement
    ball_test.x += ball_test.dx;

    // the same for balls in canvases
    // never use array.legth in a loop condition. put it in a variable then compare. 
    for (var i = 0, j = balls.length; i < j; i++){
        // balls are following the test ball, no need to re-check the bounds
        // we take the test ball direction
        balls[i].dx =  ball_test.dx;

        //movement   
        balls[i].x += balls[i].dx;
        // change left style - No need for jQuery
        balls[i].element.style.left = balls[i].x + "px";
    }

    // display ball_test
    displayBallTest(ball_test, canvas, context);

    // Prefer the use of requestAnimationFrame
    requestAnimFrame(function(){
        loop(ball_test, balls, canvas, context, ballcanvas, ballctx);
    });
};

// no need to recalculate Math.PI * 2 for every loop.
// do it just the first time then use the value
var pi2 = Math.PI * 2;

function displayBallTest(ball, canvas, context){
    // clear canvas    
    // you don't need to clear all the canvas, just the zone where you now the ball is.
    // must need some calculation to be the most efficient possible
    context.clearRect(ball.x - 50 , ball.y  - 50, 100, 100);

    context.beginPath();
    context.arc(ball.x, ball.y, 40, 0, pi2 );
    context.fill();
};

// start main loop
loop(ball_test, balls, canvas, context, ballcanvas, ballctx);

Ես մեկնաբանեցի կոդը, բայց ահա թե ինչ արեցի.

  • լիովին խուսափել jQuery-ից: Կարիք չկա, բացառությամբ միգուցե պատրաստի, եթե որոշեք ձեր սցենարը չդնել բովանդակության վերջում
  • օգտագործելով requestAnimationFrame-ը, երբ հնարավոր է
  • խուսափելով արժեքների վերահաշվարկից կամ վերակայումից, երբ դրանք գլոբալ են (Math.PI*2, context.fillStyle…)
  • խուսափելով .length if for loop-ի օգտագործումից

Բայց ես կարծում եմ, որ ձեր խնդիրը գալիս է նրանից, որ դուք ցանկանում եք տեղափոխել 30 կտավի տարրեր՝ դրանց բովանդակությունը հիմնական կտավի մեջ նկարելու փոխարեն: Հայտնի է, որ iOS-ն արագ է, երբ դուք օգտագործում եք կտավ գծագրություն: Ինձ համար ձեր կատարողական խնդիրները կլուծվեն, եթե դուք ընտրեք նկարել հիմնական կտավի վրա DOM տարրերը տեղափոխելու փոխարեն:

25.07.2012
  • Մենք օգտագործում ենք 30 կտավ, քանի որ Android-ում շատ դանդաղ է լինում հիմնական կտավի վրա բազմաթիվ տարրեր նկարելը ( stackoverflow.com/questions/11557651/ ): Մենք կցանկանայինք նույն կոդի բազան մի քանի սարքերի համար: 25.07.2012

  • 2

    Մի ակնհայտ բան, որ դուք կարող եք անել, ձեր ընտրիչի քեշն է, այն ամեն անգամ գործարկելու փոխարեն.

       // some css            
        $('#ballcanvas' + i).css("position", "absolute");
        $('#ballcanvas' + i).css("left", balls[i].x + "px");
        $('#ballcanvas' + i).css("top", balls[i].y + "px");
        $('#ballcanvas' + i).css("background-color", "#000000");
    

    Պետք է նման բան լինի.

    var thisBall = $('#ballcanvas' + i)
    thisBall.css("position", "absolute");
    ... rest of your code ....
    

    Մի կողմ. Ինչու՞ անհանգստանալ օգտագործել document.getElementById-ը, երբ արդեն ունեք Jquery $:

    25.07.2012
  • Նրան ընտրողը պետք չէ։ $('#ballcanvas' + i) ստեղծվել է հենց առաջ: Նա պետք է գործի ballcanvas[i]-ի վրա: ԲԱՅՑ դա խնդիր չէ, քանի որ այս ֆունկցիան պարզապես սկզբնավորում է անիմացիան: խնդիրը գալիս է հետո: Առաջին հերթին .length-ի օգտագործումը հանգույցի վիճակում: Դեմ քվեարկեք, քանի որ ասում եք նրան օգտագործել jQuery, երբ նա արագություն է խնդրում: jQuery-ից խուսափելը լավ պատասխան կլիներ: 25.07.2012
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..