Heim >Web-Frontend >js-Tutorial >So erreichen Sie eine leistungsstarke mobile Entwicklung

So erreichen Sie eine leistungsstarke mobile Entwicklung

php中世界最好的语言
php中世界最好的语言Original
2017-11-18 10:53:141652Durchsuche

Wie wir alle wissen, sollten mobile Endgeräte nicht nur schnell laden, sondern auch Inhalte ohne Benutzererfahrung bieten. Sie sollten auch reibungslos funktionieren, wie zum Beispiel schnelle Interaktionen und seidenweiche Animationen...

Wie können die oben genannten Effekte in der tatsächlichen Entwicklung erzielt werden?

1. Bestätigen Sie die Analysestandards der Rendering-Leistung

2. Bereiten Sie ein Lineal vor, um die Rendering-Leistungsstandards zu messen

Optimieren Sie die zeitaufwändigsten Bereiche

Wir können ungefähr die folgenden Optimierungsziele erreichen

So erreichen Sie eine leistungsstarke mobile Entwicklung


Das erste ist die erste Bildschirmpräsentationszeit Es gibt viele, viele komprimierte Codes, die Verwendung von WebP-Bildern, die Verwendung von Sprites, das Laden bei Bedarf, „Direct Out“, CDN ...

Der zweite Punkt ist die 16-ms-Optimierung Optimierung.


1. Browser-Rendering Prinzipielle Einführung

Die Aktualisierungsfrequenz der meisten Geräte beträgt 60 Mal/Sekunde (1000/60 = 16,6 ms) Mit anderen Worten: Das Rendern jedes Frames durch den Browser muss innerhalb von 16 ms abgeschlossen sein. Über diese Zeit hinaus bleibt das Rendern der Seite hängen, was sich auf das Benutzererlebnis auswirkt.

Das ist im Bild oben zu sehen

So erreichen Sie eine leistungsstarke mobile Entwicklung

Wenn das Attribut weiter links im Bild oben geändert wird, wirkt sich das aus wird größer und die Effizienz geringer sein.

Der Prozess des Browser-Renderings ist wie folgt:

Holen Sie sich das DOM und teilen Sie es in mehrere Ebenen auf (RenderLayer)

Rasterisieren Sie jede Ebene und zeichnen Sie sie unabhängig In der Bitmap,

Laden Sie diese Bitmaps als Texturen auf die GPU hoch

, um mehrere Ebenen zu kombinieren und das endgültige Bildschirmbild (ultimative Ebene) zu generieren.

Wie Sie auf dem obigen Bild sehen können, wird die Effizienz erheblich verbessert, wenn Sie nur den Verbund ändern (Zusammenführung von Rendering-Ebenen).

Im Folgenden finden Sie eine grobe Liste, welche Stile welches Modul des Rendering-Prozesses ändern.

So erreichen Sie eine leistungsstarke mobile Entwicklung

Wie Sie auf dem Bild oben sehen können, verändern Transformation und Deckkraft nur die Zusammensetzung (Zusammenführung der Rendering-Ebene). Weil die GPU-Beschleunigung aktiviert ist.

GPU-Beschleunigung aktivieren

Wörtliche Erklärung: Texturen können zu sehr geringen Kosten auf verschiedene Orte abgebildet werden, und sie können auch auf eine sehr einfache Weise in ein rechteckiges Raster umgewandelt werden.

[Die wörtliche Interpretation ist sehr kompliziert, aber es ist immer noch die gleiche alte Wahrheit. Verwenden Sie keine Worte, wenn Sie sie mit Bildern klar erklären können. 】

Tipps: Wählen Sie zuerst einen Frame der Zeitleiste aus und wählen Sie dann die Registerkarte „Ebenenbeschriftung“ unten aus. Sie können das Modul nach links und rechts ziehen, um es in 3D anzuzeigen.

Wir können sehen, dass die Seite zusammengesetzt ist der folgenden Ebenen:

So erreichen Sie eine leistungsstarke mobile Entwicklung

Obwohl das, was wir am Ende im Browser sehen, nur eine Fotokopie ist, d. h. es gibt am Ende nur eine Ebene. Ähnlich dem Konzept der „Ebenen“ in der PhotoShop-Software, schließlich alle verfügbaren Ansichtsebenen zusammenführen und ein Bild auf dem Bildschirm ausgeben

Aber tatsächlich wird eine Seite angezeigt Einige Regeln sind in entsprechende Ebenen unterteilt. Sobald sie unabhängig sind, haben sie keinen Einfluss auf das Layout anderer DOMs, da sie nach der Änderung nur auf der Seite „eingefügt“ werden.

Derzeit führen folgende Faktoren dazu, dass Chrome Ebenen erstellt:

3D- oder Perspektivtransformation (Perspektivtransformation) CSS-Eigenschaften

Verwenden Sie das 39000f942b2545a5315c57fa3276f220-Element, um das Video zu beschleunigen Dekodierung

5ba626b379994d53f7acf72a64f9b697-Elemente mit 3D-Kontext (WebGL) oder beschleunigtem 2D-Kontext

Hybrid-Plugins (wie Flash)

Erstellen Sie CSS-Animationen auf Ihrer eigenen Deckkraft oder verwenden Sie eine Animations-Webkit-transformiertes Element

hat beschleunigtes CSS Filter Element

Element hat einen untergeordneten Knoten, der eine zusammengesetzte Ebene enthält (mit anderen Worten, ein Element hat ein untergeordnetes Element). Das untergeordnete Element befindet sich in einer eigenen Ebene)

Das Element hat ein Geschwisterelement mit einem niedrigeren Z-Index und enthält eine zusammengesetzte Ebene (mit anderen Worten, das Element wird über der zusammengesetzten Ebene gerendert)

Wenn in Webkit-basierten Browsern die oben genannte Situation eintritt, wird eine unabhängige Ebene erstellt.

Achten Sie darauf, nicht zu viele Renderebenen zu erstellen, was eine neue Speicherzuweisung und eine komplexere Ebenenverwaltung bedeutet. Missbrauchen Sie die GPU-Beschleunigung nicht, achten Sie darauf, ob zusammengesetzte Layouts 16 ms überschreiten

So erreichen Sie eine leistungsstarke mobile Entwicklung

Nach so vielen Prinzipien des Browser-Renderings ist es sinnlos, ohne Lineal zu messen. Wählen wir also ein Lineal zum Messen aus: Zeitleiste der Google-Entwicklungstools.


2. Allgemeine Funktionen des Google-Entwicklungstools Timeline


1. Die Aufnahme endet. Der rote Bereich ist der Frame. Wenn er höher ist, können Sie die Frequenz jedes Frames sehen.

So erreichen Sie eine leistungsstarke mobile Entwicklung


2 Unter der Zeitleiste können Sie den Zeitverbrauch jedes Moduls sehen und die Zeit finden. verbrauchen Über der Funktion optimieren Sie die Funktion.

So erreichen Sie eine leistungsstarke mobile Entwicklung


3. Befolgen Sie die Schritte unten, um die unabhängige Ebene auszuwählen und den neu gezeichneten Bereich hervorzuheben praktisch Finden Sie die unnötigen Neuzeichnungsbereiche und optimieren Sie sie

So erreichen Sie eine leistungsstarke mobile Entwicklung

Nach der Auswahl erscheinen die folgenden 2 Farbränder auf der aktuellen Seite

gelber Rand: Elemente mit animierten 3D-Transformationen werden in einer neuen zusammengesetzten Ebene (zusammengesetzte Ebene) platziert, um

blaues Gitter zu rendern: Diese Blöcke können als Einheiten auf einer niedrigeren Ebene als die Ebene betrachtet werden. Chrome nimmt diese Blöcke als Einheiten Der Inhalt eines Blocks wird jeweils auf die GPU hochgeladen.

Tools sind ebenfalls verfügbar und die Prinzipien des Browser-Renderings sind ebenfalls bekannt. Der nächste Schritt besteht darin, basierend auf tatsächlichen Projekten zu optimieren.


3 tatsächliche Projekte 16,6 ms Optimierung

In Kombination mit dem obigen Rendering-Flussdiagramm können wir einige der folgenden Schritte gezielt analysieren und optimieren

Optimieren Sie die Ausführungseffizienz von JavaScript

Reduzieren Sie den Umfang und die Komplexität der Stilberechnung

Vermeiden Sie große und komplexe Layouts

Vereinfachen Sie die Komplexität des Zeichnens und reduzieren Sie die Zeichenfläche

Priorisieren Sie die Verwendung von Rendering-Ebenen zum Zusammenführen von Attributen. Anzahl der Steuerungsebenen

Entprellungsverarbeitungsfunktion für Benutzereingabeereignisse (mobile Geräte)


1 Schreibtrennung, Stapeloperationen

Wenn das JavaScript-Skript ausgeführt wird, stammen die Elementstilattributwerte, die es abrufen kann, alle aus dem vorherigen Frame und sind alle alte Werte.

Wenn Sie also Änderungen am Elementknoten vornehmen, bevor Sie die Attribute im aktuellen Frame erhalten, führt dies dazu, dass der Browser zuerst die Attributänderungen anwendet, dann den Layoutprozess ausführt und schließlich die JavaScript-Logik ausführt.

// 先写后读,触发强制布局
function logBoxHeight() {
    // 更新box样式
    box.classList.add('super-big');
 
    // 为了返回box的offersetHeight值
    // 浏览器必须先应用属性修改,接着执行布局过程
    console.log(box.offsetHeight);
}

Nach der Optimierung:

// 先读后写,避免强制布局
function logBoxHeight() {
    // 获取box.offsetHeight
    console.log(box.offsetHeight);
 
    // 更新box样式
    box.classList.add('super-big');
}


2. Ergebnisse der Schließung des Caches (Funktionen, die häufige Aufrufe und Berechnungen erfordern)

getMaxWidth: (function () {
            var cache = {};
            function getwidth() {
                if (maxWidth in cache) {
                    return cache[maxWidth];
                }
                var target = this.node,
                 width = this.width,
                  screen = document.body.clientWidth,
                   num = target.length,
                  maxWidth = num * width + 10 * num + 20 - screen;
                cache[maxWidth] = maxWidth;
                 return maxWidth;
             }
             return getwidth;
})(),

Nach dem Wechsel zu dieser Methode funktioniert es einfach~ Es reduziert mehr als 10 ms


3. Entprellen Sie die Funktion zur Verarbeitung von Benutzereingabeereignissen

Wenn das berührte Element an eine Eingabefunktion Ereignisverarbeitung gebunden ist, wie z. B. touchstart/touchmove/touchend, muss der Thread zum Zusammenführen der Rendering-Ebene warten, bis diese gebundenen Verarbeitungsfunktionen abgeschlossen sind, bevor er ausgeführt wird. Der Seitenlaufvorgang des Benutzers ist blockiert und das angezeigte Verhalten besteht darin, dass der Bildlauf verzögert ist oder hängen bleibt.

Kurz gesagt, Sie müssen sicherstellen, dass jede an das Benutzereingabeereignis gebundene Verarbeitungsfunktion schnell ausgeführt werden kann, um dem Rendering-Layer-Merger-Thread Zeit zu geben, seine Arbeit abzuschließen.

Eingabeereignisverarbeitungsfunktionen, wie z. B. Scroll-/Touch-Ereignisverarbeitung, werden vor requestAnimationFrame aufgerufen und ausgeführt. Wenn Sie daher die Stilattribute im obigen Eingabeereignishandler ändern, werden diese Vorgänge vorübergehend vom Browser gespeichert.

Wenn Sie dann beim Aufrufen von requestAnimationFrame die Stilattribute am Anfang lesen, wird die erzwungene Synchronisierung des Layoutvorgangs des Browsers ausgelöst (dh das Layout wird in der Javascript-Phase ausgeführt). Dies führt zu mehreren und niedrigen Layouts Effizienz.

Die Optimierung ist wie folgt:

window.requestAnimationFrame(function () {
    context.animateTo(nowPos);  //需要更新位置的交给RAF
});


4. Reduzieren Sie unnötiges Neuzeichnen

Fortsetzung von oben nach dem Einschalten der Farbe Wenn die Anzeige blinkt, können Sie sehen, welche Bereiche der Browser neu zeichnet. Ich habe festgestellt, dass auch einige unnötige Neuzeichnungsbereiche neu gezeichnet wurden ~ Aktivieren Sie die GPU-Optimierung für diese (oben erwähnt)

Schauen Sie sich direkt den Timeline-Effekt an, alles ist grün~ Ich habe endlich meine Sorgen losgelassen

So erreichen Sie eine leistungsstarke mobile Entwicklung

So erreichen Sie eine leistungsstarke mobile Entwicklung

Es gibt viele Tipps für die mobile Entwicklung. Heute werde ich Ihnen diesen leistungsstarken Entwicklungstipp geben Achten Sie weiterhin auf unsere Website PHP.cn

Verwandte Lektüre:

Die Entwicklung mobiler Endgeräte verwaltet die horizontalen und vertikalen Bildschirme mobiler Geräte

Grundlegende Kenntnisse für die Entwicklung mobiler Endgeräte (nachgedruckt)_html/css_WEB-ITnose

Einige Tipps für die mobile Entwicklung_html/css_WEB-ITnose

Das obige ist der detaillierte Inhalt vonSo erreichen Sie eine leistungsstarke mobile Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn