2015-08-13 13 views
5

Scrivendo un filtro video che elabora dati image/telaio nel sistema di (non il video) di memoria, rende la grafica 2D, dovrebbe essere cross-platform (almeno Windows, Linux & OSX) e funzionano molto velocemente, ho esaminato diversi renderer, come Cairo, AGG e molti altri progetti. Preferirei non aver bisogno di GPU, quindi il mio obiettivo era il rendering del software finora.tempo reale 2D di rendering per la memoria di sistema

Purtroppo Cairo potrebbe diventare molto lenta su percorsi complessi & gradienti e prodotto guasti geometria brutti da piccoli segmenti di percorso, AGG era troppo lento a causa di ottimizzazioni che richiede un sacco di lavoro dagli utenti mancante, altri progetti appena resi per Windows o le prestazioni non era importante per loro. Blend2D mi ha fatto incuriosire ma ha bisogno di tempo per crescere.

Ora mi chiedo: se dovessi eseguire il rendering su un framebuffer OpenGL e fare il materiale da 2D a 3D con una libreria di geometrie, prendi la sfida di sviluppare un renderer software da zero (accelerato da SIMD, pipeline threaded , ecc.) o mi è mancata una libreria adatta a me?

Sta spingendo tutto ciò che riguarda la grafica relativa alla GPU sempre utile a causa del trasferimento dati a basso costo a & dalla memoria video in questi giorni, anche con immagini 1080p o più grandi?

+0

Grazie per aver menzionato Blend2D, non sono molte le persone a conoscenza di questo progetto. Offrirà un rendering basato su software 3-10 volte più veloce rispetto a Cairo/Qt. – Petr

risposta

1

In alternativa a OpenCV potrebbe essere SDL. C'è almeno un tutorial e una documentazione che parla specificamente di streaming video data to the hardware. Ovviamente, dovrai riscrivere il tuo filtro in glsl per ottenere un'accelerazione decente.

Detto questo, sembra che il problema potrebbe trarre maggiore vantaggio da una soluzione di calcolo GPU come OpenCL o Cuda. In questo caso non è necessario il rendering, ma si inviano i dati a un kernel GPU e recuperati quando viene elaborato. Oppure puoi inviarlo a OpenGL/DirectX (la memoria video può essere riutilizzata come texture abbastanza facilmente senza perdita di prestazioni) per il rendering. Se non sei interessato a spostarti oltre l'API di OpenGL, puoi anche utilizzare uno shader di elaborazione . Funziona come uno shader tradizionale tranne per il fatto che calcola in un passaggio, ma con alcuni vincoli e restrizioni aggiuntivi.

1

Una tipica CPU desktop ha 4 core di elaborazione in esecuzione a 2,5 GHz. A modern desktop GPU (circa 2010) ha da 48 a 480 shader in esecuzione a 1,4 GHz. Quindi in termini di potenza di elaborazione non elaborata, la GPU può elaborare grafica da 7 a 70 volte più veloce della CPU.

Per quanto riguarda la larghezza di banda di trasferimento, un'immagine 1080p è 1920x1080 pixel, il frame rate è di 30 fotogrammi al secondo e un pixel è di 4 byte (32 bit). Così la larghezza di banda totale del bus necessario per l'elaborazione in tempo reale 1080p è

1920 x 1080 x 30 x 4 = 248 MB/s 

La larghezza di banda di uno slot PCI Express 2.0 x16 è 8000 MB/s. Il che significa che la velocità di trasferimento della CPU in GPU non è un problema.

Quindi, per rispondere alla tua domanda: Sì, spingere tutto ciò che riguarda la grafica relativa alla GPU vale sempre, anche con immagini 1080p o più grandi.

+0

Grazie, questo già risponde alla mia ultima frase. Desidero ancora renderizzare offline (magari offrendo un backend software e hardware), potresti aggiungerne di più alla mia domanda generale? – Youka

0

Hai provato OpenCV?

Fornisce sia il software che il renderer hardware con il huge library di funzioni altamente ottimizzate per l'elaborazione e il rendering delle immagini in tempo reale.

+0

OpenCV è piuttosto per operazioni su tutta l'immagine, come analisi, post-elaborazione, registrazione, ecc. Altre cose sono giocattoli, incluse le funzioni di disegno e wrapper OpenGL. Per il rendering 2D, il Cairo ha fatto un lavoro migliore. Inoltre è un'enorme dipendenza per un "piccolo" filtro video alla fine. – Youka

Problemi correlati