2009-04-18 5 views
1

Javascript CANVAS ist erstaunlich: Es erlaubt uns, etwas wie Linien, Polygone auf dem Browser-Bildschirm zu zeichnen.Wie funktioniert Javascript CANVAS?

Ich frage mich, wie funktioniert Javascript CANVAS. Zum Beispiel, um eine Linie zu zeichnen, verwendet es eine Reihe ausgerichteter winziger Bilder, um die Linie oder einen anderen Ansatz zu simulieren?

Vielen Dank im Voraus.

+2

Sie könnten den WebKit-Quellcode lesen: http://webkit.org/building/checkout.html – gahooa

+4

Sind Sie ein Microsoft-Mitarbeiter? lol. –

Antwort

1

Sicher, das ist die Implementierung der spezifischen JavaScript Engine Browser in Frage?

+0

Ich denke, es ist tatsächlich nativ im Browser, keine JS-Engine. Zum Beispiel glaube ich nicht, dass V8 Canvas unterstützt, es ist Chrome, das das Rendering funktioniert. – slacy

+2

Duh, ich meinte Browser. Irgendetwas lief zwischen Gehirn und Tastatur dort schlecht falsch ... – Rob

9

Jeder vernünftige Implementierer würde nur eine Bitmap (intern im Browser gespeichert) verwenden und mit nativen OS-Zeichenbefehlen zeichnen.

Warum ist das wichtig? Es ist überhaupt nicht verwandt mit HTML + CSS, wenn Sie sich fragen.

Weitere Einzelheiten zum Detail willen:

Wenn der HTML-Parser des Browsers (mit einer bestimmten Breite & Höhe) ein Canvas-Element sieht es muss ein On-Screen pixmap zuzuweisen, diesen Bereich zu decken. Dies geschieht entweder manuell (d. H. Malloc()) oder es ruft eine native Zeichnungs-API des Betriebssystems auf, um eine Oberfläche zum Zeichnen zu erstellen. Die native OS-API kann Windows, Gtk, Kde, Qt oder jede andere Zeichnungsbibliothek sein, die der Implementierer des Browsers ausgewählt hat. Außerdem hängt es stark vom Betriebssystem ab. Internet Explorer ruft wahrscheinlich in einer Windows-systemeigenen Bibliothek (d. H. DirectX oder WinFooBarMethod()) auf.

Sobald die Zeichenoberfläche erstellt ist, wird sie für die internen Eingeweide des JavaScript-Interpreters zugänglich gemacht, wahrscheinlich über einen Zeiger oder ein Handle auf die konstruierte Zeichenoberfläche. Wenn dann der JS-Interpreter einen Aufruf einer der Canvas-Methoden sieht, wird daraus ein Aufruf an den entsprechenden nativen OS-Befehl.

Also, die Windows 3.1-Stil Metapher:

"new canvas(width, height)" = "WinCreatePixmap(width, height)" 
"canvas.setPixel(x,y,color)" = "WinSetPixel(x,y,color)" 

und mit einem manuell verwaltet pixmap:

"new canvas(width, height)" = "malloc(width * height * sizeof(Pixel))" 
"canvas.setPixel(x,y,color)" = "canvas[x][y] = color;" 

Auch hier sollte es nicht an die JavaScript-Entwickler aus, wie diese Methoden umgesetzt werden . Die einzigen Personen, die sich darum kümmern müssen, sind diejenigen, die HTML5-kompatible Webbrowser mit Canvas-Unterstützung schreiben.

+0

Auf einem zweiten Gedanken scheint es unmöglich, dass Javascript browsers OS native Zeichnungsmethoden nennt. –

+10

JavaScript kann OS-Zeichenbefehle nicht aufrufen. Der * Browser * interpretiert das JavaScript/CSS/HTML und * it * ruft die systemeigenen Zeichnungsbefehle des Betriebssystems auf, um das Notwendige zu zeichnen. –

+0

Dies macht mehr Sinn. Aber welche Methode wird tatsächlich aufgerufen, wenn ich Canvas drawline() aufruft? Mit anderen Worten, wie ein einzelnes schwarzes Pixel tatsächlich auf dem Browser durch Javascript Aufruf gerendert wird? –

0

Wenn Sie interessiert sind, wie Strichzeichnung funktioniert, überprüfen Sie Bresenham's Line Drawing Algorithm.

+0

Vielen Dank, aber ich interessiere mich nicht für den Algorithmus, um eine Linie oder etwas zu zeichnen. Fragen Sie sich nur, wie ein einzelnes Pixel tatsächlich im Browser gerendert wird. –

+0

@ sc85: Der Browser macht die Arbeit. Es hat den Kontext einer Bitmap. Er kann entweder die Linie zeichnen oder einen OS-Aufruf zum Zeichnen der Linie aufrufen. Es ist egal. Das Zeichnen einer Antialias-Linie ist trivial. – Nosredna

1

Sie zu viel denken, es ist ganz einfach:

Eine Leinwand wie ein Bild, das auf den Browser gezogen werden kann.

+0

Ich denke du denkst an SVG. – tj111

+0

Ich denke, gs hat die richtige Idee. Wenn wir sicherstellen können, dass "image" in diesem Fall kein img-Element ist, sondern ein (entschuldige die rekursive Definition) leerer "Canvas", der manuell aus einer Reihe von JavaScript-Methoden geplottet werden kann. – jeremyosborne

0

Ich denke, die Umsetzung ist wichtig. Warum spielt es eine Rolle? Schau dir den Blitz an. Wenn Sie die Zeichnungs-API verwenden, um komplexe Fraktalgrafik zu erstellen, erstellt es tatsächlich Vektorgrafiken und macht jede Linie und Kurve ein Kind des Objekts, auf dem gezeichnet wird, so dass es die Vektorgrafik jedes Rahmens neu erstellt. CRASH! oder chug ... tuck ......... chug .............. Also für komplexe Fraktale oder Kunst, die Gleichungen aufzeichnet, muss ich eine Bitmap oder die Render-Engine verwenden CACKS. Es macht einen Unterschied, da ich jetzt versuche, einige meiner Flash-Multimedia auf Javascript zu übertragen und Unterschiede zwischen den Browsern zu finden.

3

Wenn Sie C++ kennen, können Sie zur Quelle gehen.

Zum Beispiel wird in Firefox das Objekt "Grafikkontext" durch die Klasse nsCanvasRenderingContext2D implementiert. Aber diese Klasse ändert die Pixel nicht direkt. Stattdessen bittet sie ein separates Objekt namens Theben, dies zu tun. Theben delegiert diese Arbeit wiederum an eine Grafikbibliothek mit der Bezeichnung Cairo, die normalerweise eine Bibliothek fragt, die von Ihrem Betriebssystem zur Verfügung gestellt wird, um die eigentliche Pixelarbeit auszuführen. Ich kann mir vorstellen, dass es überall eine ähnliche Geschichte gibt.

Ganz unten hat die Leinwand eine zweidimensionale Pixelmatrix. Jedes Pixel ist eine 32-Bit-Ganzzahl. Ein Pixel wird gesetzt, indem einem Element des Arrays ein Wert zugewiesen wird. Irgendwo gibt es ein bisschen Code, der bestimmt, welche Pixel zu malen sind und weist den entsprechenden Array-Elementen die entsprechenden Werte zu. Die Pixel werden zwar theoretisch von Ihrer Grafikkarte gezeichnet, aber ich habe gehört, dass Grafikkarten im Allgemeinen nicht mit 2D-Grafiken vertraut werden können, da die Hardware aggressiv auf 3D-Spiele abgestimmt ist und zu sehr auf Genauigkeit getrimmt werden kann für Geschwindigkeit.

+0

Dies ist eine Möglichkeit, dass EG IE wie es DirectX verwendet, um zu zeichnen, was es aus dem CSS/HTML (gesteuert) sowieso das Canvas-Tag kann einfach ein Offset der Zeichnung Berechnung und dann die Java-Skript-Aufrufe nur sagen Die Browser DirectX rendern, was mit dem Offset-Canvas gezeichnet werden soll, das sollte für die meisten Browser gleich sein, da sie natives Rendering verwenden müssen, um irgendetwas und darüber anzuzeigen, beweist nur, dass Firefox Canvas im Vergleich zu anderen so langsam ist dann kann Firefox DLL in der Mitte des OpenGL-Renderers hinzufügen, um es bei der Arbeit mit OpenGL-Karten zu unterstützen –