Webgl GPU是否与CPU交换创建的纹理?
在HankMoody的评论后更新此内容。 我运行了这个程序,实际上在纹理创建过程中,在大约4GB的内存中发生了上下文丢失: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
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