Canvas (Deutsch)

Available since LÖVE 0.8.0
Ehemals Framebuffer.

Ein Offscreen-Buffer welcher für das sogenannte "Off-screen Rendering" verwendet wird.

Ein Offscreen-Buffer ist ein Speicher, in dem Bildschirminhalt aufgebaut werden kann ohne diesen sofort dem Nutzer zu zeigen. Der gleichbedeutende Begriff "Canvas" (dt.: Leinwand) ist treffend gewählt. Vorstellen kann man sich das Ganze als Arbeitsfläche auf der man abseits des eigentlichen Bildschirminhalts den nächsten Inhalt vorbereiten kann. Ist diese Leinwand schließlich fertig bemalt, schickt man sie komplett an den Bildschirm.

Der Vorteil ist, dass man komplexe statische Szenen wie zum Beispiel Hintergründe, welche sich aus vielen einzelnen Bildern zusammensetzen zunächst in den Offscreen-Buffer schreiben und diesen dann schließlich komplett als eigene Einheit zeichnen kann. Das bedeutet, dass man anstatt vieler kleiner Zeichenoperationen nur noch eine einzige durchführen muss, was insbesondere die Performance deutlich positiv beeinflusst.

Ein Nachteil von Canvases ist, dass sie anfällig für das sogenannte power of 2 syndrome sind. Dies betrifft jedoch vor allem ältere Grafikkarten. Die meisten moderneren Grafikkarten, welche Offscreen-Buffer unterstützen, sollten auch non-PO2 Texturen unterstützen. Um sicher zu gehen, kann man dies aber auch mit love.graphics.isSupported("npot") überprüfen und den Nutzer gegebenenfalls mit einer Fehlermeldung informieren.

O.png Einige alte Grafikkarten unterstützen Canvases nicht. Ob eine Grafikkarte Canvases unterstützt, kann mit love.graphics.isSupported("canvas") überprüft werden.  


Konstruktoren

love.graphics.newCanvas (Deutsch) Erstellt einen neuen Offscreen-Buffer. Added since 0.8.0

Funktionen

Canvas:clear (Deutsch) Entfernt den gesamten bisherigen Inhalt eines Canvas. Added since 0.8.0
Canvas:getDimensions (Deutsch) Gibt die Breite und Höhe des Canvas zurück. Added since 0.9.0
Canvas:getFSAA (Deutsch) Gibt die Anzahl der Antialiasing Samples zurück, welche beim Zeichnen auf das Canvas genutzt werden. Added since 0.9.1
Canvas:getFilter (Deutsch) Gibt den Filtermodus des Canvas zurück. Added since 0.8.0
Canvas:getHeight (Deutsch) Gibt die Höhe des Canvas zurück.
Canvas:getPixel (Deutsch) Gibt den Pixel an einer bestimmten Position auf dem Canvas zurück. Added since 0.9.0
Canvas:getWidth (Deutsch) Gibt die Breite des Canvas zurück.
Canvas:getWrap (Deutsch) Gibt die Zeilenumbrucheigenschaften eines Canvas zurück. Added since 0.8.0
Canvas:renderTo (Deutsch) Zeichnet mit Hilfe einer Funktion in einen Offscreen-Buffer. Added since 0.8.0
Canvas:setFilter (Deutsch) Bestimmt den Filtermodus für ein Canvas. Added since 0.8.0
Object:type (Deutsch) Gibt den Typ des Objekts als String zurück.
Object:typeOf (Deutsch) Überprüft ob ein Objekt einem bestimmten Datentypen angehört.

Supertypen

Beispiele

Performancevorteile eines Offscreen-Buffers

Im folgenden Beispiel zeichnen wir zunächst 10000 LÖVE logos auf eine Leinwand. Anschließend zeichnen wir die Leinwand selbst in love.draw(). Dies zeigt, dass auch komplexe Szenen keine (spürbare) Auswirkungen auf die Performance haben, wenn man einen Offscreen-Buffer verwendet.

local canvas;
function love.load()
   -- Wir erstellen eine neue Leinwand.
    canvas = love.graphics.newCanvas(800, 600);
    local logo = love.graphics.newImage('logo.png');

    -- Wir füllen die Leinwand mit LÖVE logos.
    canvas:renderTo(function()
        for _ = 1, 10000 do
            love.graphics.draw(logo, love.math.random(0, 800), love.math.random(0, 600), math.rad(love.math.random(0, 360)));
        end
    end)
end

function love.draw()
    -- Wir zeichnen die Leinwand selbst.
    love.graphics.draw(canvas);

    -- Einfache Anzeige der aktuellen Framerate.
    love.graphics.setColor(0, 0, 0);
    love.graphics.print(string.format("FPS: %.3f fps", love.timer.getFPS()), 10, love.window.getHeight() - 40);
    love.graphics.setColor(255, 255, 255);
end

Siehe auch


Andere Sprachen