--- title: Optymalizacja elementu canvas slug: Web/API/Canvas_API/Tutorial/Optimizing_canvas tags: - Canvas - Grafika - HTML - HTML5 - Poradnik - Tutorial - zaawansowany translation_of: Web/API/Canvas_API/Tutorial/Optimizing_canvas original_slug: Web/API/Canvas_API/Tutorial/Optymalizacja_canvas ---
{{HTMLElement("canvas")}} to jeden z najczęściej używanych standardów do renderowania grafiki 2D w przeglądarce. Zazwyczaj stosuje się go do tworzenia gier i skomplikowanych wizualizacji, które nierzadko starają się wycinąć z „płótna" maksimum jego możliwości. Niestety, równie często prowadzi to do spadków wydajności. W tym artykule przygotowaliśmy dla was kilka wskazówek jak zoptymalizować element canvas, aby poprawić działanie waszych stron i aplikacji.
Poniżej znajdziecie kilka rozwiązań, które poprawią wydajność elementu canvas:
Jeśli w każdej klatce rysujesz wiele podobnych obiektów, stwórz niewyświetlany, roboczy canvas, narysuj na nim swój element raz (lub za każdym razem gdy ulega zmianom), a następnie wykorzystaj render w głównym canvasie.
obiekt.canvasRoboczy = document.createElement('canvas'); obiekt.canvasRoboczy.width = obiekt.width; obiekt.canvasRoboczy.height = obiekt.height; obiekt.canvasRoboczy = obiekt.canvasRoboczy.getContext('2d'); obiekt.render(obiekt.offscreenContext);
Renderowanie między pikselami zachodzi, gdy rysujesz obiekt używając niepełnych wartości.
ctx.drawImage(myImage, 0.3, 0.5);
Ta praktyka zmusza przeglądarkę do wykonania dodatkowych obliczeń, by wytworzyć efekt anty-aliasingu. Żeby temu zapobiec, zaokrąglij koordynaty, na przykład przy użyciu {{jsxref("Math.floor()")}}.
drawImage
Posłuż się canvasem poza ekranem, renderując swój obrazek w kilku różnych rozmiarach podczas ładowania, zamiast renderować go w każdej klatce.
Tak jak niektóre elementy nieustannie są w ruchu, inne (jak np. UI) nigdy nie zmieniają położenia. Dobrym sposobem na optymalizację w tej sytuacji jest zastosowanie warstw przy użyciu kilku canvasów roboczych.
Przykładowo, możesz stworzyć warstwę dla interfejsu rysowaną nad innymi, która aktualizuje się tylko w momentach, gdy jest używana. Oprócz tego, możesz przenaczyć jedną warstwę na pierwszy plan, gdzie umieścisz wszystkie elementy, które odnawiane są często oraz jedną warstwę na tło, na której obiekty aktualizowane są bardzo rzadko.
<div id="scena"> <canvas id="warstwaUi" width="480" height="320"></canvas> <canvas id="warstwaGry" width="480" height="320"></canvas> <canvas id="warstwaTla" width="480" height="320"></canvas> </div> <style> #scena { width: 480px; height: 320px; position: relative; border: 2px solid black } canvas { position: absolute; } #warstwaUI { z-index: 3 } #warstwaGry { z-index: 2 } #warstwaTla { z-index: 1 } </style>
Jeśli twoja gra, jak większość, posiada statyczne tło, stwórz element {{HTMLElement("div")}} z własnością CSS {{cssxref("background")}} , który umieścisz pod canvasem. Dzięki temu unikniesz rysowania dużego obrazu w każdej klatce z osobna.
Transformacje CSS są szybsze dzięki wykorzystaniu karty graficznej. Powiększanie canvasu działa szybciej niż jego pomniejszanie. Dla Firefox OS ustaw 480 x 320 px.
var scaleX = window.innerWidth / canvas.width; var scaleY = window.innerHeight / canvas.height; var scaleToFit = Math.min(scaleX, scaleY); var scaleToCover = Math.max(scaleX, scaleY); stage.style.transformOrigin = '0 0'; //scale from top left stage.style.transform = 'scale(' + scaleToFit + ')';
Jeśli twoja gra korzysta z canvasu i nie ma potrzeby, by był on przezroczysty, ustaw wartość alpha
na false
podczas tworzenia kontekstu: HTMLCanvasElement.getContext()
. To powinno poprawić wydajność.
var ctx = canvas.getContext('2d', { alpha: false });
{{PreviousNext("Web/API/Canvas_API/Tutorial/Hit_regions_and_accessibility", "Web/API/Canvas_API/Tutorial/Finale")}}