Webgl GPU是否与CPU交换创建的纹理?

Webgl GPU是否与CPU交换创建的纹理?,webgl,Webgl,在HankMoody的评论后更新此内容。 我运行了这个程序,实际上在纹理创建过程中,在大约4GB的内存中发生了上下文丢失: Total size = 4001366016 [Violation] 'setTimeout' handler took 427ms WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost context lost; stopping now context is

在HankMoody的评论后更新此内容。 我运行了这个程序,实际上在纹理创建过程中,在大约4GB的内存中发生了上下文丢失:

Total size = 4001366016                        
[Violation] 'setTimeout' handler took 427ms    
WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost 
context lost; stopping now 
context is lost
这几乎与我可以从中获得的GPU信息一致chrome://gpu:

如果我正确地阅读了这篇文章,它应该意味着我有大约4GB的ram

有趣的是,我必须创建一个缓冲区数组并传递它,否则代码将永远运行

因此,就目前而言,我不能说GPU是否真的在与CPU交换任何东西。但我没有理由这么认为,因为我能够达到我的GPU的内存限制,并导致它重置

为了弄清我们在代码中不断丢失上下文的原因,我尝试通过无限期地创建纹理来模拟,直到上下文丢失为止

然而,无论我的循环持续创建纹理多长时间,我都并没有遇到这个问题。我的笔记本电脑变得完全没有响应,但我从未在Chrome控制台中看到“上下文丢失”

GPU是否以某种方式将纹理内存与CPU内存交换

以下是我使用的代码:

让contextLost=false; 函数createCanvascanvasWidth、canvasHeight{ const canvas=document.createElement'canvas'; canvas.width=canvasWidth+'px'; canvas.height=canvasHeight+'px'; canvas.addEventListenerwebglcontextlost,functionevent{ //违约事件; 日志“上下文丢失”; contextLost=true; },假; canvas.addEventListener webglcontextrestored,函数{ 日志“上下文已还原”; },假; 返回画布; } 函数getGLContextcanvas{ 常量属性={alpha:false,depth:false,antialas:false}; //仅在尚未获取gl上下文的情况下获取gl上下文 const gl=canvas.getContext'webgl2',属性; 如果!德国劳埃德船级社{ 抛出“不支持WebGL2”; } 如果!gl.getExtension'EXT\u color\u buffer\u float'{ 抛出“不支持浮点输出纹理”; } 返回总账; } 函数createTexturegl、宽度、高度、数据{ 常量纹理=gl.createTexture; //绑定纹理,以便以下方法影响该纹理。 gl.bindTexturegl.TEXTURE_2D,纹理; gl.texParameterigl.TEXTURE_2D,gl.TEXTURE_MIN_过滤器,gl.NEAREST; gl.texParameterigl.TEXTURE_2D,gl.TEXTURE_MAG_过滤器,gl.NEAREST; gl.texParameterigl.TEXTURE_2D、gl.TEXTURE_WRAP_S、gl.CLAMP_TO_EDGE; gl.texParameterigl.TEXTURE_2D、gl.TEXTURE_WRAP_T、gl.CLAMP_至边; //纹理的像素格式和数据 gl.texImage2D gl.TEXTURE_2D,//目标,与上面的绑定匹配。 0,//详细程度。 gl.R32F,//内部格式。 宽度,//宽度-标准化为s。 高度,//高度-标准化为t。 0,//在OpenGL ES中始终为0。 gl.RED,//每个像素的格式。 gl.FLOAT,//每个通道的数据类型。 data;//所述格式的图像数据,或null。 //解开纹理。 gl.bindTexturegl.TEXTURE_2D,空; 返回纹理; } 设totalSize=0; const buffer=new Float32Array1024*1024; 函数createTexture2{ 常数texsize=1024*1024*4; const-tex=createTexturegl,1024,1024,缓冲区; 如果!tex | | contextLost{ 日志“上下文丢失;立即停止”; 回来 } totalSize+=texsize; log'Total size='+totalSize; window.setTimeoutcreateTexture2,0; } const canvas=createCanvas1,1; const gl=getGLContextcanvas; 创建纹理2; 控制台。记录“结束”; GPU是否与CPU交换创建的纹理

这取决于浏览器/驱动程序/操作系统

一些驱动程序可以交换纹理。一些GPU与CPU共享内存,因此与普通CPU内存相同的交换也发生在GPU内存中

有些操作系统虚拟化了GPU,有些则没有。换句话说,如果您运行一些使用大量GPU内存的本地游戏,同时运行测试,您可能会得到不同的结果

有些浏览器可以实现自己的交换。换句话说,如果您同时在两个窗口中运行测试,您可能会得到不同或相同的结果


没有简单的答案。

FYI,您可以使用一个专用扩展触发上下文丢失,该扩展用于此目的:gl.getExtension'WEBGL\u lose\u context'.loseContext;。谢谢@hankmody。我认为我的问题措辞不恰当。我正在试图找出发生上下文丢失的条件我刚刚编辑了标题,以便更专注于一个实例,在该实例中,我认为上下文丢失会将while循环替换为setInterval,因此浏览器将有机会触发此事件或任何其他事件。将其转换为可运行代码
szDisplayMemoryEnglish  4163 MB