wanggg 的blog

Cocos2dx v3.x渲染管线流程

cocos2dx v3渲染流程做了很大的升级,具体的提升和新的特性大概有以下几点:

  •   场景的遍历和渲染分离开来,在遍历节点的时候会把绘图命令放入一个队列,并不会实际调用OpenGL渲染API;
  •   视锥体几何裁剪,摄像机视野外的对象将会自动从当前帧中移除,并不会进行渲染;
  •   执行OpenGL绘图命令的将会移动到一个独立的线程,更好地利用现在移动平台的多核CPU;
  •   自动合并批次
  •   基于节点的定制化渲染

Cocos2dx v3.x渲染管线流程

cocos2d-x 创建精灵的五种方法

方法一:直接创建精灵        方法二:参数 图片名称 矩形区域        方法三: 利用帧缓存中的一帧的名称声称一个对象   方法四:利用另外一帧生成一个精灵对象        方法五:利用纹理

关于Cocos2d-x中数据的存储

当局分数的打印和最高分数的记录

1.首先定义一个Label类型的节点在GameScene.cpp的init方法中,设置初始分数为0

_myScore = 0;
scorelabel = Label::createWithSystemFont("Score: 0", "Arial", 36);
scorelabel->setAnchorPoint(Vec2(1, 0));
scorelabel->setColor(Color3B::BLACK);
scorelabel->setPosition(size.width, size.height - scorelabel->getContentSize().height); 
this->addChild(scorelabel,2);

2.当满足某个加分条件时,改变Label的文本值(没必要放在什么Update方法中,效率太低)

//如果敌方飞机挂了,玩家增加分数,加1分
_myScore += 1;
char buf[100] = { 0 };
sprintf(buf, "Score: %d", _myScore);
scorelabel->setString(buf);

我所理解的cocos2dx - 精灵

用sprite绘制一个矩形区域

精灵可以绘制一张纹理或者上面的一个矩形区域,最终会关联一个texture2d对象和上面的一个区域。createWithTexture不使用TextureCache创建纹理,所以需要额外的小心它的生命周期。

精灵可以通过setTexture来修改关联的纹理,用SpriteFrame来高效播放精灵动画。

V3F_C4B_T2F_Quad结构体

所有对sprite绘制属性的修改最终都是表现为对一个V3F_C4B_T2F_Quad结构体变量quad的修改。此结构拥有4个v3f_c4b_t2f顶点属性(坐标vec3,颜色color4B和纹理坐标tex2F)。opengl es不支持多边形图元,所以一个quad图元实际会分为2个三角形。对于图元修改,我们只需要修改每一个顶点的相关数据即可。

使用QuadCommand进行绘制

cocos2d-x多线程渲染的一些探讨

可行性:

游戏循环主要包括这几个部分:
1、硬件事件,主要就是指触屏事件,按键事件和鼠标事件;
2、游戏事件,主要指定时器事件和预定义事件,比如schedule;
3、游戏逻辑,对于胖脚本端来说,这个就指的脚本逻辑;
4、渲染数据的生成,在引擎里面就是指node的visit,这里计算生成所有即将发往OpenGL的数据,包括顶点纹理坐标等attribute数据,变换矩阵纹理等uniform数据,混合模式等渲染状态;
5、通过OpenGL接口把所有数据发往OpenGL。

这几个步骤里面,只有第五个步骤需要涉及到OpenGL操作,而前面四个步骤都是为第五个步骤做准备,而第五个步骤不用或者很少需要反馈数据给前面四个步骤。这是一个典型的生产者消费者模式,在很低线程同步开销的情况下课采用多线程处理。

必要性:

处理游戏逻辑(包括前四个步骤)承担了太多cpu运算,而发数据到OpenGL也相当耗时,尤其涉及到多次的渲染状态切换。在多核cpu上面把二者分开可以提高并行性,进而提高游戏帧率。

一些方案:

【Cocos2d-x游戏开发】浅谈游戏中的坐标系

无论是开发2D还是开发3D游戏,首先必须弄清楚坐标系的概念。在Cocos2d-x中,需要了解的有OpenGL坐标系、世界坐标系和节点坐标系。

1.UI坐标系

IOS/Android/Windows SDK中通用的UI坐标系默认起点坐标(x=0,y=0)位于坐上角,x轴从屏幕最左边开始,由左向右逐渐增加;Y轴坐标从屏幕最上方开始,由上至下逐渐增加,如图所示:

【Cocos2d-x游戏开发】浅谈游戏中的坐标系

UI坐标系又被称为纹理坐标系,在Cocos2d-x中,只有从纹理截取部分矩形时才使用这个坐标系,例如Sprite的TextureRect属性。

2.OpenGL坐标系

关于Cocos2d-x中对其他某个类的某个属性的获得

类A要获得类B中的某个属性,可以是节点属性

方法一

1.先在B类中定义一个_edge的节点属性(可以在B类中进行各种对_edge的操作),然后写一个方法

Node* GameController::getEdge(){
  return _edge;
}

2.接着在A类中先实例化一个B类的对象,然后用这个对象调用刚才写在B类中的那个方法,就可以获得B类中的那个属性。

if (gc->getEdge()->getBoundingBox().containsPoint(t->getLocation())) {
   
}

方法二

1.先在B类中定义一个_edge的节点属性(可以在B类中进行各种对_edge的操作)

2.接着在A类中先实例化一个B类的对象,因为这个对象本身是一个指针,所以再用“*”可以变成一个真实的对象,真实的实例,这时候就可以直接用“.属性值”的方法来获得想要的B类中的_edge的节点属性。

if ((*gamecontroller)._hero->getPositionX() < 0) {

}

Cocos2dx 小技巧——三种缓存类介绍

在介绍三个缓存时,我们要先理清一个问题:什么是纹理?通俗的解释呢,纹理就是图片的意思啦。当一张图片被加载到内存后,它是以纹理的形式存在的。从这里可以看出,纹理其实就是一块内存!这块内存中存放的是按照指定的像素格式填充的图片像素信息。

下面进入正题:

1、TextureCache

TextureCache纹理缓存是最底层也是最有效的纹理缓存。它到底有什么用呢?我先描述一个现象吧:假设游戏中有个界面用到的图片非常多,,第一次点进这界面时速度非常慢(因为要加载绘制很多图片),可第二次点击却一下子就进去了。这是为什么呢?原来Cocos2dx的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而达到重复使用,降低内存和GPU运算资源的消耗与开销。举个例子:创建一个精灵

auto sp = Sprite::create("image.png");//精灵图片是image.png  

第一次使用image.png这图片有两个步骤,一个是先将图片加载进TextureCache缓存中,下一步是绘制图片,从而将其显示在场景中。

第二次使用image.png时,因为之前image.png已经被放入TextureCache中,所以这里只需从缓存中找到这张图片,然后将其绘制出来就可以。

Cocos2d-x精灵的性能优化——使用纹理图集和精灵帧缓存

使用纹理图集

纹理图集(Texture)也称为精灵表(Sprite Sheet)

使用纹理图集的优点:

1、减少文件读取次数,读取一张图片比读取一推小文件要快

2、减少OpenGL ES绘制调用并且加速渲染
OpenGL ES 1.1仅仅能够使用2的n次幂大小的图片(即宽度或者高度是2、4、8、64…)。
如果采用小图片OpenGL ES1.1会分配给每个图片2的n次幂大小的内存空间,即使这张图片达不到这样的宽度和高度也会分配大于此图片的2的n次幂大小的空间。那么运用这种图片集的方式将会减少内存碎片。
虽然在Cocos2d-x v2.0后使用OpenGL ES2.0,它不会再分配2的几次幂的内存块了,但是减少读取次数和绘制的优势依然存在。

3、减少内存消耗。

4、Cocos2d-x全面支持Zwoptex和TexturePacker,所以创建和使用纹理图集是很容易的

Cocos2d-x精灵的性能优化

Cocos2d-x中的Node

节点是cocos2d-x游戏引擎中的重要元素,是其他重要游戏元素的基类,例如,场景Scene,图层Layer,菜单Menu和精灵sprite都是继承节点类Node. Node类包含了一些基本的属性、节点相关、Action动作的执行、以及定时器等相关的操作。 当然Node也有父类,其父类为Ref。

节点的主要特点:

— 他们可以包含其他的节点对象(addChild, getChildByTag, removeChild, etc)
— 他们可以安排定期的回调(schedule, unschedule, etc)
— 他们可以执行一些动作(runAction, stopAction, etc)
— 子类节点通常意味着(单一的/所有的)
— 重写初始化资源并且可以安排回调
— 创建回调来操作进行的时间
— 重写“draw”来渲染节点
— 节点的属性有:位置、缩放、旋转、倾斜、锚点、内容大小、可见性

节点常用的一些操作函数及新的功能特性。

(1)节点的属性:位置、缩放、旋转、倾斜、锚点、内容大小、可见性

//  
/** 
 * 位置Position 
 *     设置节点的坐标(x,y).在OpenGL中的坐标 
 *     增加3D坐标 
 *     增加标准化坐标设置 
 */  
同步内容
--电子创新网--
粤ICP备12070055号