zoukankan      html  css  js  c++  java
  • Unity对象与Draw Calls的关系

    什么是Draw Calls?

    首先我们先来了解一下,什么叫做“Draw Calls”:一个Draw Call,等于呼叫一次 DrawIndexedPrimitive (DX) or glDrawElements (OGL),等于一个 Batch。

    摸过 DirectX 或 OpenGL 的人来说,对 DrawIndexedPrimitive 与 glDrawElements 这 API 一定不陌生。当我们准备好资料 (通常为三角面的顶点资讯) 要 GPU 划出来时,一定得呼叫这个函式。换句话说,如果在画面上有一张 “木" 椅子、一张 “铁" 桌子,那理论上就会有两个 Draw Call。

    有看到特别点出 “木" 与 “铁" 吗?这代表两物件是使用不同材质球或者不同的 Shader。在 DirectX 或 OpenGL 里,对不同物件指定不同贴图或不同 Shader 的描述,就会需要呼叫两次Draw Call。Procedure code如下:

    SetShader(“Diffuse");
    SetTexture(“铁");
    DrawPrimitive(DeskVertexBuffer);
    
    SetShader(“VertexLight");
    SetTexture(“木");
    DrawPrimitive(ChairVertexBuffer);
    

    每次对 Shader 的更动或者贴图的更动,基本上就是对 Rendering Pipeline 的设定做修改,所以需要不同的 Draw Call 来完成物件的绘制。现在了解为什么 Unity 官方文件里,老是要你尽量使用同样材质球,以减少 Draw Call 数量了吧!

    摄像机看到的对象与Draw Calls数值的关系:

    现象一:所以对象都可见,都在摄像机范围内。

    Draw Calls:27

    现象二:后方的圆球被挡住。

    Draw Calls还是为27,其他数值也没变过。

    现象三:把一个对象[圆柱]移动到摄像机外面,完看不见。

    这次的Draw Calls少了2,也就是当一个物体不在摄像机范围内,就不会产生Draw Calls,也就是GPU不会去画这个物品。

    现象三:后面被挡住的圆球屏蔽,不显示;

    这时候Draw Calls为20

    数据比较:

     

    总结:

    我们要减少Draw Calls可以做到以下几点:

    1、当调整摄像机的获取范围;

    2、把一些遮档住的物品屏蔽,不要显示;

  • 相关阅读:
    HTTP协议入门
    TCP/IP的分层管理
    TCP与UDP
    如何处理某个Web页面的HTTP请求
    AGC005D ~K Perm Counting
    “玲珑杯” 线上赛Round #17 B 震惊,99%+的中国人都会算错的问题
    bzoj4455 [Zjoi2016]小星星
    AGC010F Tree Game
    AGC016E Poor Turkeys
    AGC003E Sequential operations on Sequence
  • 原文地址:https://www.cnblogs.com/Martin_Q/p/6364887.html
Copyright © 2011-2022 走看看