OpenGL顶点着色器的功能如何?可以绘制多少个四边形?

时间:2019-04-06 13:23:24

标签: webgl vertex-shader webgl2

我编写了一个演示应用程序来测试顶点着色器的功能,因为到处都可以说它每秒可以处理数百万个四边形,但是在我的情况下,它会在一定限制下失败。

我编写了一个演示here,其中有一个仅接受数字的输入框,它将根据输入数字动态呈现正方形。 我可以很容易地看到它的运行,没有任何延迟,直到大约25平方四分之一,然后它变慢,甚至在某些时候甚至GPU崩溃,也更糟。

我们可以优化我编写的代码吗?还是它限制了GPU和OpenGL-ES?

代码:

`

{
    $sales = Order::all();//OR $sales = Order::where('xxx')->get();

    try
    {

        $xml = new XMLWriter();

        $xml->openURI('file.xml');

        $xml->startDocument('1.0');
        $xml->startElement('ListOrder');
        $xml->setIndent(4);
        $i=1;
        foreach ($sales as $s){
            $xml->startElement('Order'.$i);
            $xml->writeElement('id', $s->id);
            $xml->writeElement('order_item_id', $s->order_item_id);
            $xml->writeElement('lazada_id', $s->lazada_id);
            $xml->writeElement('seller_sku', $s->seller_sku);
            $xml->writeElement('lazada_sku', $s->lazada_sku);
            $xml->writeElement('updated_at', $s->updated_at);
            $xml->writeElement('order_number', $s->order_number);
            $xml->writeElement('shipping_address3', $s->shipping_address3);
            $xml->writeElement('unit_price', $s->unit_price);
            $xml->writeElement('shipping_fee', $s->shipping_fee);
            $xml->writeElement('item_name', $s->item_name);
            $xml->writeElement('tracking_code', $s->tracking_code);
            $xml->endElement();
            $i++;
    }
        $xml->endElement();


        $xml->endDocument();

        $xml->flush();

    }
    catch(Exception $e)
    {
        echo $e;
    }

}// Trí_Pro

`

1 个答案:

答案 0 :(得分:0)

您问了一个无法回答的问题

  

可以绘制多少个四边形?

我们正在谈论哪个设备?树莓派? iPhone 2?使用NVidia 2080 RTX的Windows PC?什么尺寸的四边形?您的片段着色器在做什么?

无论如何,您遇到的问题不是顶点着色器问题,而是断层着色器问题。绘制像素需要时间。绘图说一个1024x1024的四边形绘图了100万像素。绘制一百个1024x1024四边形就是绘制一亿像素。试图每秒进行60次处理,则要求绘制60亿像素。

将所有四边形更改为1x1像素,由于它只要求每秒绘制6000像素,因此它将运行得很好。

这通常被称为填充率约束。您只是不能画那么多像素。在您的情况下,也被称为透支过多。通过绘制重叠的四边形,您所做的浪费工作是绘制相同像素多于一个像素。如果可能,您应该只绘制一次每个像素。

我想一般的经验法则是,大多数GPU每秒只能以60帧的速度绘制2到12个全屏四边形。我只是毫无疑问地拉出了这个数字,但是例如一个原始的Android GPU只能以60fps绘制1.5个全屏四边形。我认为一个Raspberry PI可能不到4。我知道2015年的Intel Graphics(不确定哪种型号)在1280x720分辨率下可以显示约7。我的2019年Macbook Air可以执行大约3个操作(分辨率为2560x1600,与1280x720的12个屏幕大致相同。

至于崩溃,GPU并没有崩溃,而是浏览器或操作系统重置了GPU,因为它花费了太长时间。大多数GPU(截至2019年)都像CPU那样不是多任务处理。 CPU可以被中断并切换为其他功能。这就是您的PC能够同时运行许多应用程序和服务的方式。大多数GPU无法做到这一点。他们一次只能做一件事。因此,如果您在一次抽奖电话中给他们30秒的工作时间,他们将完成30秒的工作而不会受到干扰。这对OS不利,因为它需要GPU更新窗口并运行其他应用。因此,操作系统(和某些浏览器)会在每次绘图调用时进行计时。如果一次绘制调用花费的时间超过一定的时间,他们将重置GPU,并经常杀死要求GPU执行耗时太长的程序或页面。

关于如何知道太多的工作,您不应该尝试做尽可能多的工作,而应该尝试尽可能少地做。您的应用无缘无故地绘制重叠的四边形。

如果您确实确实需要绘制重叠的四边形或进行一些需要很长时间的计算,那么您可能需要找到一种方法将每个绘制调用将其分解为较小的运算。每个抽奖电话处理5个四边形,并使用5个抽奖电话(而不是25个)。处理更多较小的四边形而不是较少的大型四边形,依此类推。