‎Cocos2d-x 学习笔记(26) 从源码学习 DrawCall 的降低方法

时间:2022-04-07 22:06:50

【Cocos2d-x】学习笔记目录

本文链接:https://www.cnblogs.com/deepcho/p/cocos2dx-drawcall-glcalls.html

1. 屏幕左下角

我们通常在Cocos2d-x项目运行前,在AppDelegate::applicationDidFinishLaunching()方法中,执行

director->setDisplayStats(true);

用于开启屏幕左下角的数据显示,数据一共三行,分别是:

‎Cocos2d-x 学习笔记(26) 从源码学习 DrawCall 的降低方法第一行GL verts表示此时绘制的顶点数。

第二行GL calls表示此时DrawCall数量。

第三行表示此时的FPS。

我们研究第二行的GL calls,也就是DrawCall的相关知识。

2. bool _displayStats

左下角数据通过Director的setDisplayStats方法控制显示与否。该方法仅改变了Director的_displayStats变量,我们可以猜测是该变量控制了数据显示。该变量默认为false,所以要开启数据显示的话,需要手动修改该变量。

另外,Director::setDefaultValues(void)方法也会修改_displayStats。下面看setDefaultValues方法的被调用过程。

在程序入口Application::run()方法调用的AppDelegate::applicationDidFinishLaunching()方法的第一行,执行了:

Configuration::getInstance()->loadConfigFile("configs/config-example.plist");

可以猜测该行是加载了一个plist配置文件,因为其执行的位置很靠前,应该是设置了Cocos2d-x项目的一些重要变量。

打开该plist发现刚才的预测正确。该plist文件如下:

‎Cocos2d-x 学习笔记(26) 从源码学习 DrawCall 的降低方法 loadConfigFile方法仅设置了Configuration单例对象的几个变量。在该方法最后,执行了:

Director::getInstance()->getEventDispatcher()->dispatchEvent(_loadedEvent);

该行表面看是分发了一个我们自定义的事件,实际上重要的是,这是Director在程序内的初始化位置。

因为此时不存在Director单例对象,所以执行Director::init()方法。在init方法第一行,执行了:

setDefaultValues();

该方法是对刚才的Configuration单例对象plist文件内与Director和图像纹理相关的内容进行设置,包括这几个内容:

_oldAnimationInterval  _animationInterval(1.0/fps)

_displayStats

_projection (3d、2d、CUSTOM)

Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA8888)

Image::setPVRImagesHavePremultipliedAlpha(pvr_alpha_premultiplied)

所以,这是在我们手动调用setDisplayStats方法之前对_displayStats的一次设置,这次设置是通过在setDefaultValues方法中加载plist配置文件进行的。

3. ssize_t _drawnBatches

在帧循环内的Director::drawScene()方法中,会对_displayStats进行判断,为true时分别执行showStats()方法和calculateMPF()方法。

showStats()方法是直接输出三行数据到屏幕左下角。其中DrawCall的值是Renderer成员变量_drawnBatches。

DrawCall的值就是_drawnBatches的值,_drawnBatches的增加仅在Renderer::drawBatchedTriangles()方法中进行,如下:

    /************** 3: Draw *************/
for (int i=; i<batchesTotal; ++i)
{
CC_ASSERT(_triBatchesToDraw[i].cmd && "Invalid batch");
_triBatchesToDraw[i].cmd->useMaterial();
glDrawElements(GL_TRIANGLES, (GLsizei) _triBatchesToDraw[i].indicesToDraw, GL_UNSIGNED_SHORT, (GLvoid*) (_triBatchesToDraw[i].offset*sizeof(_indices[])) );
_drawnBatches++;
_drawnVertices += _triBatchesToDraw[i].indicesToDraw;
}

所以,表面上看想办法降低batchesTotal的值就能降低DrawCall的值。

上篇文章对Renderer渲染的学习中可以总结出降低DrawCall的大致思路:

同GlobalZOrder的元素中,元素被添加到节点的顺序就是渲染命令的添加顺序。当两个命令相邻且同材质ID的情况下,这两个命令的索引是被添加到同一个_triBatchesToDraw的索引中,而_triBatchesToDraw的索引是在被GL一次绘制,_triBatchesToDraw的数量决定了batchesTotal的值,也就是DrawCall的值。所以,我们要想实现一次DrawCall中绘制多个元素,就要尽可能让不同元素添加到节点的顺序是相邻的且不被打断,并且它们的材质ID一致,从而这些元素顶点索引被整合到一起,在一次glDrawElements方法中被绘制。


本文链接:https://www.cnblogs.com/deepcho/p/cocos2dx-drawcall-glcalls.html

 

‎Cocos2d-x 学习笔记(26) 从源码学习 DrawCall 的降低方法的更多相关文章

  1. Hadoop学习笔记&lpar;10&rpar; ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  2. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  3. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  4. Laravel学习笔记之Session源码解析&lpar;上&rpar;

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  5. Sping学习笔记&lpar;一&rpar;----Spring源码阅读环境的搭建

    idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...

  6. mybatis源码学习&lpar;一&rpar; 原生mybatis源码学习

    最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybati ...

  7. 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)

    一.Spring事务管理的特点 Spring框架为事务管理提供一套统一的抽象,带来的好处有:1. 跨不同事务API的统一的编程模型,无论你使用的是jdbc.jta.jpa.hibernate.2. 支 ...

  8. JUC&period;Lock&lpar;锁机制&rpar;学习笔记&lbrack;附详细源码解析&rsqb;

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  9. &lbrack;Golang学习笔记&rsqb; 03 库源码文件

    库源码文件:不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用. 代码包声明的基本规则: 1. 同目录下的源码文件的代码包声明语句要一致.也就是说,它们要同属于一个代码包( ...

随机推荐

  1. 【BZOJ 2820】YY的GCD

    线性筛积性函数$g(x)$,具体看Yveh的题解: http://sr16.com:8081/%e3%80%90bzoj2820%e3%80%91yy%e7%9a%84gcd/ #include&lt ...

  2. Jquery 获取 radio&sol;select选中值

    Radio <input type="radio" name="rd" id="rd1" checked="checked& ...

  3. The listener supports no services解决一例

    The listener supports no services解决一例   Listener动态监听静态监听注册实例 今天做Advacned Replication实验的时候碰到一个问题,启动目标 ...

  4. Scrapy源码学习(一)

    用Scrapy已经有一段时间了,觉得该是看一下源码的时候了.最开始用的时候还是0.16的版本,现在稳定版已经到了0.18.结合使用Scrapy的过程,先从Scrapy的命令行看起. 一.准备 下载源代 ...

  5. javascript常用方法整理--数组篇

    1. arrayObject.slice(start,end) 从已有的数组中返回选定的元素 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说 ...

  6. 奇异值分解&lpar;SVD&rpar; --- 几何意义

    原文:http://blog.sciencenet.cn/blog-696950-699432.html PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD ...

  7. windows server 2012R2 故障转移集群配置

    配置说明: AD:10.10.1.10/24  Node-2:10.10.1.20/24 Node-3:10.10.1.30/24 zhangsan-PC:10.10.1.50/24  VIP1:10 ...

  8. 每月IT摘录201903

    技术 1.在开发高并发系统时,有很多手段来保护系统,如缓存.降级.限流等.缓存可以提升系统的访问速度,降级可以暂时屏蔽掉非核心业务,使得核心业务不受影响.限流的目的是通过对并发访问进行限速,一旦达到一 ...

  9. 初识数据库、初识MySQL

    一.为什么要用数据库 # 1.将文件和程序存在一台机器上是很不合理的. # 2.操作文件是一件很麻烦的事. 所以就出现了一个新的概念 —— 数据库 你可以理解为 数据库 是一个可以在一台机器上独立工作 ...

  10. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...