Javascript 以毫秒为单位测量WebGL纹理负载

Javascript 以毫秒为单位测量WebGL纹理负载,javascript,webgl,Javascript,Webgl,如何以毫秒为单位测量WebGL纹理负载 现在,我有一个图像数组,将使用游戏循环渲染为地图,我感兴趣的是捕获WebGL以毫秒为单位加载每个纹理图像所需的时间。我想知道如何测量这一点,因为JavaScript与WebGL不同步。测量WebGL中任何时间的唯一方法是计算在一定时间内可以做多少工作。选择一个目标速度,比如30fps,使用requestAnimationFrame,不断增加工作量,直到超过目标 var targetSpeed = 1/30; var amountOfWork = 1;

如何以毫秒为单位测量WebGL纹理负载


现在,我有一个图像数组,将使用游戏循环渲染为地图,我感兴趣的是捕获WebGL以毫秒为单位加载每个纹理图像所需的时间。我想知道如何测量这一点,因为JavaScript与WebGL不同步。

测量WebGL中任何时间的唯一方法是计算在一定时间内可以做多少工作。选择一个目标速度,比如30fps,使用requestAnimationFrame,不断增加工作量,直到超过目标

var targetSpeed  = 1/30;
var amountOfWork = 1;

var then = 0;
function test(time) {
   time *= 0.001;  // because I like seconds 

   var deltaTime = time - then;
   then = time;

   if (deltaTime < targetTime) {
     amountOfWork += 1;
   }

   for (var ii = 0; ii < amountOfWork; ++ii) {
     doWork();
   }

   requestAnimationFrame(test);
}
requestAnimationFrame(test);
实际使用资源

许多资源都是延迟初始化的,因此只需上载一个资源即可 但不使用它不会给你一个准确的测量。你会 需要对上传的每个纹理进行绘制。当然 用一个简单的着色器绘制一个小的1像素1三角形。这个 着色器必须实际访问资源,否则驱动程序 我的系统不会进行任何惰性初始化

不要假设不同类型/大小的纹理具有比例 速度的变化

司机对不同的事情。例如,某些GPU可能不支持 除了RGBA纹理之外的任何东西。如果上载亮度纹理 驱动程序将其扩展到RGBA。因此,如果使用RGBA纹理计时 并假设相同尺寸的亮度纹理将上载 快4倍你就错了

同样,不要假设不同大小的纹理将在 速度与它们的大小成比例。驱动程序的内部缓冲区 其他限制意味着不同的尺寸可能需要不同的时间 路径

换句话说,您不能假设1024x1024纹理将上载 4倍于512x512纹理的速度

请注意,即使这样也不能保证实际结果

我的意思是,例如,如果你使用的是平铺硬件iPhone 例如,GPU的工作方式是收集所有 使用绘图命令,将它们分割为平铺,剔除任何 画那些看不见的,只画剩下的 大多数桌面GPU绘制每个三角形的每个像素

因为一个平铺的GPU 一切都结束了这意味着如果你继续上传 将数据上传到同一纹理之间并绘制,每次上传都会 在绘制之前,必须保留所有纹理的副本。 在内部,它可能会在某个点刷新并 在再次缓冲之前绘制它所具有的内容

即使是桌面驱动程序也希望通过管道上传,以便您上传 内容到纹理B,绘制,将新内容上传到纹理B, 画如果驾驶员在进行第一次绘图的中间 它不想等待GPU来替换内容。 相反,它只是想把新内容上传到其他地方 不使用,然后它可以将纹理指向新的 内容

在正常使用中,这不是问题,因为几乎没有人上传 每时每刻都有成吨的纹理。他们最多上传1到2个视频 帧或1或2个程序生成的纹理。但是当你 基准测试您正在给驱动程序施加压力,并使其完成任务 它实际上不会正常工作。在上面的例子中,它可能 假设一个纹理不太可能一帧上传10000次 你将达到一个极限,它必须冻结管道直到 将绘制一些排队的纹理。那次冻结会使我们的生活更加困难 您的结果看起来比正常情况下实际得到的结果慢 用例

关键是你可能会基准测试,并被告知需要5毫秒 要上传纹理,但实际上只需要3毫秒,你只需 管道多次停止,超出了您的基准 不太可能发生


这对你有什么帮助?你会在那里检查百万种不同的机器和驱动程序吗?例如,在运行Android 5.0.1和5.0.2的Nexus 5和运行不同操作系统的Samung Galaxy Note 6上上传纹理需要多长时间,不同的操作系统和不同型号的iPhone、iPad、每个操作系统加上不同操作系统的Mac,然后是所有具有不同CPU、不同GPU、不同驱动程序的windows机器。。。。我这样问是因为无论你们试图解决什么问题,都不清楚在一台机器上测量上传时间会有什么帮助。这是我做的一项研究工作。我需要从我构建的webgl测试应用程序中获取此类数据。您仍然没有回答我的问题。这些数据有什么意义?如果你得到1ms的答案,这将对你有什么帮助,因为它对其他机器没有用处,而且JavaScript无法找出用户在哪种机器上。测试在特定的设备上运行。在画布和WebGL图形中对特定场景进行测量。许多请求将被提出,而上下文切换可能是WebGL的成本。这是我研究的一部分。我有一个关于GPU测量的问题,要知道这项研究是关于什么是无关的。这是相关的,因为答案对于99.9999999%的所有用例都是无用的。你所处的浏览器运行在超过一百万个浏览器上 硬件方面的问题。即使是本土游戏也不这么做。他们只是让用户选择不同的图形选项,因为有太多的变化,不知道是否有东西会太慢。
var start = performance.now;         // WRONG!
gl.someCommand(...);                 // WRONG!
gl.flush(...);                       // WRONG!
var time = performance.now - start;  // WRONG!