2017-09-19 57 views
1

例如,對於我的940M顯卡,用下面的代碼創建的畫布需要500 MB顯存空WebGL的情況下使用了大量的內存

var c = document.createElement('canvas'); 
var ctx = c.getContext('webgl'); 
c.width = c.height = 4096; 

的同時,對OpenGL上下文相同尺寸僅使用100 MB視頻內存:

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE); 
int s = 4096; 
glutInitWindowSize(s, s); 
glutCreateWindow("Hello world :D"); 

爲什麼WebGL使用這麼多內存?是否可以減少大小相同的上下文使用的內存量?

+0

你是怎麼測量的? –

+0

@LJᛃ使用Opera中的任務管理器或者Ubuntu – Ni55aN

+1

中的NVidia X服務器設置好像獲得像您一樣的默認WebGL上下文具有反鋸齒,alpha通道,深度緩衝區和(afaik)雙緩衝,您的glut設置代碼具有沒有.. –

回答

4

正如LJ指出的那樣,canvas是雙緩衝,反鋸齒,默認情況下具有alpha和深度緩衝區。你所做的畫布4096×4096,這樣的

16meg * 4 (RGBA) or 64meg for one buffer 

你得到至少4次

front buffer = 1 
antialiased backbuffer = 2 to 16 
depth buffer = 1 

所以這是256meg取決於什麼瀏覽器精選抗鋸齒1152meg。

在回答你的問題,你可以嘗試不要求提供深度緩衝,阿爾法緩衝器和/或反鋸齒

var c = document.createElement('canvas'); 
var ctx = c.getContext('webgl', { alpha: false, depth: false, antialias: false}); 
c.width = c.height = 4096; 

無論是瀏覽器實際不分配的Alpha通道或不只是忽略它取決於瀏覽器和驅動程序。它是否實際上不分配深度緩衝區也取決於瀏覽器。通過antialias: false應該至少使第二個緩衝區1x而不是2x到16x。

+0

非常感謝。沒有深度的上下文,alpha和anti-aliasing確實佔用更少的內存 – Ni55aN