C'è qualche motivo per utilizzare WebGL invece di 2D Canvas per giochi / app 2D?


112

C'è qualche motivo, oltre alle prestazioni, per utilizzare WebGL invece di 2D-Canvas per giochi / app 2D ?

In altre parole, quali funzionalità 2D sono offerte da WebGL che non è possibile ottenere facilmente con 2D-Canvas?


5
A proposito: sebbene non sia possibile utilizzare l'API di contesto 2d e 3d sulla stessa tela, è comunque possibile combinarli utilizzando più tele. WebGL può utilizzare tele 2d come trame e tele 2d possono utilizzare tele WebGL come sorgenti per drawImage.
Philipp

Risposte:


83

Guardando questa domanda da un altro lato:
come fa uno sviluppatore a scegliere una tecnologia rispetto a un'altra?

  • si integra meglio nel loro sistema già costruito
  • è più facile da usare
  • è più veloce
  • ha più capacità o meglio si adatta alle loro esigenze
  • costo
  • più indipendente dalla piattaforma

Quindi discuterò le differenze tra le API canvas e webGL riguardo a queste qualità.


Sia canvas che webGL sono API JavaScript. Sono più o meno gli stessi per quanto riguarda l'integrazione (associazione). Sono entrambi supportati da una serie di librerie che potrebbero velocizzare la codifica. Librerie diverse offrono modi diversi per organizzare il codice, quindi la scelta della libreria determina come sono strutturate le API di disegno, ma è ancora più o meno la stessa cosa (come il resto del codice si lega ad esso). Se usi la libreria, la facilità di scrittura del codice dipende dalla libreria stessa.

Se scrivi codice da zero, l'API canvas è molto più facile da imparare e capire. Richiede una conoscenza matematica minima e lo sviluppo è veloce e diretto.

Lavorare con l'API WebGL richiede solide competenze matematiche e una piena comprensione della pipeline di rendering. Le persone con queste competenze sono più difficili da trovare, la produzione è più lenta (a causa delle dimensioni e della complessità di tale base di codice) e quindi costa di più.

WebGL è più veloce e ha più capacità. Nessun dubbio a riguardo. È un'API 3D nativa che ti dà pieno accesso alla pipeline di rendering, il codice e gli effetti vengono eseguiti più velocemente e sono più "modificabili". Con webGL non ci sono limiti.

Sia canvas che webGL sono chicche html5. Di solito i dispositivi che supportano uno supporteranno l'altro.

Quindi, per riassumere:

  • fusione del codice API del disegno e il resto (integrazione): simile
  • facilità d'uso:
    • (con libreria) canvas = webGL
    • (da zero) webGL << canvas
  • velocità: webGL> canvas
  • capacità: webGL> canvas
  • costo: webGL è molto più costoso
  • piattaforma: molto simile

Spero che questo ti aiuti.

PS Aperto alla discussione.


@Abstract, Dove sono i buoni tutorial per il web GL e quante ore ci vorranno?
Pacerier

1
@Pacerier basta cercarlo su google, i primi colpi sono probabilmente abbastanza buoni. Tuttavia, ci vorranno settimane e mesi per diventare bravi in ​​webgl e nella programmazione grafica in generale, e anni per essere davvero bravi. Non è solo una qualche "libreria" casuale per cui devi imparare l'API e basta.
Algoritmo astratto

@AbstractAlgorithm, voglio dire se sei già un maestro con la tela di programmazione, quante ore ci vorranno per passare al web GL?
Pacerier

@Pacerier che dipende dallo sviluppatore e come ha già detto Abstract le abilità matematiche dello sviluppatore coinvolto. Non c'è davvero una quantificazione che può essere fatta.
scrappedcola

32

Il vantaggio più grande è la programmabilità della pipeline e le prestazioni. Ad esempio, supponiamo che tu stia disegnando 2 scatole una sopra l'altra e una è nascosta, alcune implementazioni GL hanno la possibilità di scartare la scatola nascosta.

Per quanto riguarda i confronti, poiché non esiste un modo rapido per creare una tabella qui, ho appena caricato un'immagine della tabella di confronto qui sotto. Aggiunto Three.js solo per completezza.

tavolo


Ri "alcune implementazioni GL hanno la possibilità di scartare la scatola nascosta" ma non potresti rilevare quella parte sovrascritta in JS e quindi non ridisegnare ciò che non è necessario?
Pacerier

16

Parlando per esperienza sulle mie applicazioni , gli shader grafici sono stati l'unico motivo per cui ho richiesto il supporto per WebGL. La facilità d'uso ha poca importanza per me poiché entrambi i framework possono essere astratti con three.js. Supponendo che non abbia bisogno di shader, consento l'uso di entrambi i framework per massimizzare il supporto del browser / macchina.


16

Quali funzionalità 2D offre WebGL rispetto a quelle 2D non disponibili? Il più grande IMHO sono gli shader di frammenti programmabili sull'hardware grafico. Ad esempio, in WebGL, è possibile implementare Game of Life di Conway in uno shader sul proprio hardware 3D:

http://glslsandbox.com/e#207.3

Questo tipo di visualizzazione 2D funzionerebbe solo sulla CPU, non sulla GPU, con una tela 2D. Tutti i calcoli sarebbero implementati in JavaScript e non sarebbero paralleli come la GPU anche con l'aiuto dei web worker. Questo è solo un esempio, ovviamente, tutti i tipi di effetti 2D interessanti possono essere implementati con gli shader.


2
Quindi rispetto al canvas, WebGL è più o meno gravoso per il sistema operativo?
Pacerier

Sono curioso di sapere se tutte le tele finiscono comunque per fare webgl; se utilizza un caso d'uso comune precompilato webgl, che sarebbe più efficiente di webgl diretto; o se non si interfaccia con opengl in alcun modo a meno che non utilizzi webgl.
Dmitry

1
@Dmitry grande domanda e diversi browser sono liberi di adottare approcci diversi a questo problema. Ma, indipendentemente da come accelerano l'API Canvas 2D, l'API Canvas 2D stessa non offre shader programmabili o buffer di array di vertici. È un'API "chiacchierona" (una chiamata JavaScript-to-Native per elemento disegnato), mentre l'API di WebGL consente il caricamento di dati in blocco e l'elaborazione personalizzata basata su GPU.
emackey

14

Bene, le prestazioni sarebbero uno dei motivi principali perché quando si codifica un gioco, deve essere veloce. Ma ci sono un paio di altri motivi per cui potresti voler scegliere WebGL su tela. Offre la possibilità di codificare shader, illuminazione e zoom, il che è importante se stai facendo un'app di gioco commerciale. Anche la tela diventa lenta dopo 50 sprite o giù di lì.


Soprattutto su un dispositivo come un tablet Android in cui la CPU viene sovraccaricata rapidamente in javascript, il motivo principale per utilizzare WebGL è trasferire il carico di rendering sulla GPU.
Curtis

1
@ Xk0n, Re "offre la possibilità di codificare shader, illuminazione e zoom", Ma allora non diventa dipendente dalla GPU?
Pacerier

Puoi ancora ingrandire con setTransform in un contesto di tela 2D. Tuttavia, ho avuto difficoltà con il sanguinamento della trama nella tela 2D durante il ridimensionamento da fogli sprite, motivo per cui mi sto rivolgendo a WebGL. Ho visto un tutorial che impedisce al campionamento del vicino più vicino di uscire dal rettangolo di origine, il che dovrebbe risolvere il mio problema di bleeding edge.
Frank

7

Non c'è niente che puoi fare con Canvas che non puoi fare con webGL: il canvas permette di schiacciare i byte con get / putImageData, e potresti disegnare linee, cerchi, ... a livello di programmazione con webGL.
Ma se stai cercando di fare alcuni disegni e anche alcuni effetti a 60 fps, il divario di prestazioni è così alto che non sarà possibile con canvas, quando funzionerà bene in webGL. Le prestazioni sono una caratteristica fondamentale.

Eppure webGL è abbastanza complicato da programmare: vedi se canvas è abbastanza buono per te o cerca una libreria che allevi il dolore ...
Altro svantaggio: non funziona su IE (ma cosa fa?) E su alcuni cellulari.
Vedere qui per la compatibilità: http://caniuse.com/webgl


7

Dato che vuoi specificamente alcune cose classiche 2d che non funzionano bene con la tela:

  • il colore si trasforma (come lampeggiare uno sprite)
  • ripetizione di riempimenti bitmap
  • mappe di piastrellatura in rotazione (sotto la tela alcune implementazioni creeranno cuciture)
  • stratificazione profonda (molto dipendente dall'implementazione)
  • miscelazione moltiplicativa o additiva

... ma ovviamente hai accesso ai pixel, quindi puoi fare davvero qualsiasi cosa, incluso quanto sopra, manualmente. Ma può essere davvero molto lento. Potresti emscripten Mesa openGl per renderizzare su tela in teoria.

Un altro grande motivo per utilizzare webGL sarebbe che il risultato è molto facile da portare in qualsiasi altro luogo. Il che rende anche l'abilità più preziosa.

Le ragioni per usare la tela sono che è ancora meglio supportata e se impari a fare le cose pixel per pixel, questa è anche una lezione molto preziosa.


Btw WebGL è multithread? Puoi avere due fili che disegnano due parti dello schermo contemporaneamente?
Pacerier

Penso che la risposta sia "sì e no", poiché i browser web sono intrinsecamente single-threaded, quindi la copia dei dati da renderizzare sulla GPU non è multi-thread. Ma stai usando la massiccia parallelizzazione della scheda grafica una volta che gli shader iniziano il rendering, che essenzialmente attinge a più parti dello schermo contemporaneamente. Per favore correggimi se sbaglio, chiunque.
Kent Weigel il

2

Poiché WebGL è una tecnologia particolarmente nuova e la tela HTML5 è più consolidata, ciò che desideri utilizzare dipende dai tuoi utenti. Se pensi che i tuoi utenti utilizzeranno dispositivi mobili, suggerirei HTML5 canvas, ma se desideri un rendering 2D migliore, utilizzerei WebGL. Quindi quello che potresti fare è se l'uso è sul rendering mobile con HTML5 altrimenti se sono su una piattaforma che supporta WebGL.

Per esempio:

 if (window.WebGLRenderingContext) {
     webGLcanvasApp()
         } else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
     html5CanvasAppFMobile()
    } else {
    html5CanvasApp()
    }

Fonti:
modo corretto per rilevare il supporto WebGL?
Qual è il modo migliore per rilevare un dispositivo mobile in jQuery?


1

WebGL è inutilizzabile senza una GPU.
Questa dipendenza dall'hardware non è un grosso problema perché la maggior parte dei sistemi ha GPU, ma se le architetture GPU o CPU si evolvono, preservare il contenuto webgl tramite l'emulazione potrebbe essere difficile. L'esecuzione su vecchi computer (virtualizzati) è problematico.

Ma "Canvas vs WebGL" non deve essere una scelta binaria. In realtà preferisco usare webgl per gli effetti, ma fare il resto in canvas. Quando lo eseguo in una VM, funziona ancora bene e velocemente, solo senza gli effetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.