Memory 空的WebGL上下文使用大量内存

Memory 空的WebGL上下文使用大量内存,memory,opengl-es,html5-canvas,webgl,Memory,Opengl Es,Html5 Canvas,Webgl,例如,对于我的940M视频卡,使用以下代码创建的画布占用500 MB的视频内存 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;

例如,对于我的940M视频卡,使用以下代码创建的画布占用500 MB的视频内存

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使用了这么多内存?对于相同大小的上下文,是否可以减少使用的内存量?

正如LJ所指出的,画布是双缓冲、抗锯齿的,默认情况下有alpha和深度缓冲区。你做的画布是4096 x 4096,所以

16meg * 4 (RGBA) or 64meg for one buffer
你至少得到4次

front buffer = 1
antialiased backbuffer = 2 to 16
depth buffer = 1
这是256mg到1152meg,这取决于浏览器选择的抗锯齿

在回答您的问题时,您可以尝试不要求深度缓冲区、alpha缓冲区和/或抗锯齿

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

浏览器实际上是否没有分配alpha通道,或者只是忽略了alpha通道,这取决于浏览器和驱动程序。它是否真的不分配深度缓冲区也取决于浏览器。传递抗锯齿:false至少应该使第二个缓冲区为1x,而不是2x到16x。

正如LJ指出的,画布是双缓冲、抗锯齿的,默认情况下有alpha和深度缓冲区。你做的画布是4096 x 4096,所以

16meg * 4 (RGBA) or 64meg for one buffer
你至少得到4次

front buffer = 1
antialiased backbuffer = 2 to 16
depth buffer = 1
这是256mg到1152meg,这取决于浏览器选择的抗锯齿

在回答您的问题时,您可以尝试不要求深度缓冲区、alpha缓冲区和/或抗锯齿

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

浏览器实际上是否没有分配alpha通道,或者只是忽略了alpha通道,这取决于浏览器和驱动程序。它是否真的不分配深度缓冲区也取决于浏览器。传递antialias:false至少应该使第二个缓冲区变为1x,而不是2x到16x。

您是如何测量的?@LJᛃ 使用Opera中的任务管理器,或UbuntuWell中的NVidia X服务器设置,获得默认的WebGL上下文,就像您启用了抗锯齿、alpha通道、深度缓冲和afaik双缓冲一样,您的glut设置代码没有这些。您是如何测量的?@LJᛃ 使用Opera中的任务管理器,或UbuntuWell中的NVidia X服务器设置,像您一样获得默认WebGL上下文,启用了抗锯齿、alpha通道、深度缓冲和afaik双缓冲,您的glut设置代码没有这些功能。非常感谢。没有深度、alpha和抗锯齿的上下文占用的内存要少得多。没有深度、alpha和抗锯齿的上下文占用的内存要少得多