Cocos2dx

我所理解的cocos2dx - 纹理(下)

纹理的缓存管理

纹理的声明周期:Texture2D在加载纹理后会把纹理上传到gpu内存里,发生在initWithMinpmaps(),而Texture2D实例被销毁的时候,会去申请删掉对应的纹理对象。有时候,为了避免一个纹理只是暂时不用,而后又会被使用到,又得从磁盘重新加载上来,应该选择性缓存一些纹理。所以一般不直接创建Texture2D对象,而是用TextureCache

textureCache管理纹理:负责纹理的创建缓存和删除。几乎所有ui元素需要的纹理都是通过此创建的。它为每一个纹理的texture2d对象创建一个索引值,后续需要用到时直接返回一个对象指针。一般是文件路径称为索引键,也能手动设置。它还有一个有用的功能就是adddImageAsync方法异步加载纹理。

场景过度中的资源管理:

1.基于引用计数的资源管理:每个观察对自己需要的资源引用+1,切换时对上一个场景资源-1,为0的就会释放掉。

2.更好的场景过渡资源管理:cache和1方法的结合,manager负责逻辑上的资源引用计数,内部实现关于短暂资源的加载和缓存

我所理解的cocos2dx - 纹理(上)

3d图形渲染最重要就是把纹理贴到物体表面,这过程主要发生在着色器工作阶段,使用光栅化阶段插值计算得出纹理坐标从纹理中采样,然后对片段着色,可以处理丰富特效,光照阴影等。

光栅化

作用是将2d图元转为帧缓冲的整数坐标的片段,每个片段包括颜色深度和模版值。首先确认视窗上哪些整数位置的片段会被图元覆盖,然后对图元进行插值计算。这些信息会被送入后续的阶段进行处理,最后结果用于更新帧缓冲上的该位置信息。片段的颜色由片段着色器决定,光栅化会生成一些易变变量。

多重采样:高分辨率信号以低分辨率表示无法准确运算出3d图形坐标时导致的图形混叠,具体就是锯齿的产生。多重采样就是解决这问题,它是通过以采样点为中心位置,对附近进行采样,共同决定这个点的颜色。多重采样的数据存储在帧缓冲额外的多重采样缓冲区。cocos2dx默认没有开多重采样,要手动设置CCEAGLView为yes开启,并且只能初始化的时候开启。

纹理坐标:纹理以左下角为原点,一个顶点在纹理中坐标通常使用uv,长宽是纹理的长宽,这是给客户端程序使用的。片段着色器使用坐标st,范围为0-1,这一规化过程在光栅化阶段完成。

cocos2dx纹理优化

为什么要谈纹理的问题,游戏的画面无时无刻不充斥着图像,通俗意义上一款精致的游戏都有着非常精美的画面,这样往往能给玩家带来更好的游戏体验,这一点也是对于游戏制作者来说所尽力追求的,但是无奈有CPU和GPU的限制,手持设备上的硬件资源就更窘迫一些了,如何处理好图片资源,往往能给游戏提供更大的扩展空间,从画面上给游戏加分。

就我个人的经历来说,手机上图片资源处理主要是围绕两个点来周旋的,一个是图片占用的内存,图片加载后生成的纹理会存储在GPU中,而纹理的像素格式就决定了在GPU中的内存,占用的内存小来保证了游戏的机型支持,在低端机上也能运行游戏;另一个非常重要的点就是图片的加载速度,速度太慢会导致CPU占用太大,游戏会显得比较卡,这一点非常影响用户体验。对于我们来说需要处理的就是在这两者与游戏画面之间找到自己的平衡点,采用适合自己游戏的图片资源处理方式,下面来慢慢介绍图片部分的基础知识,后面会再更新-x底层是如何加载和处理图片的一些文章,分享自己的一些看法。

像素格式

(以下为texturepacker支持的打包格式)

像素格式 描述

Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)

作者:乐逍遥Jun

上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object)、IBO(Index Buffer Object)和MVP(Modile-View-Projection)变换。

本文将在教程4的基础之上,添加纹理贴图支持。最后,本文会把纹理贴图扩展至3D立方体上面。

基本方法

当我们把一张图片加载到内存里面之后,它是不能直接被GPU绘制出来的,纹理贴图过程如下:

首先,我们为之前的顶点添加纹理坐标属性并传到vertex shader里面去,然后把内存里面的纹理传给GPU,最后,在fragment shader里面通过采样器,就可以根据vertex shader传递过来的纹理坐标把纹理上面的颜色值用插值的方式映射到每一个像素上去。

接下来,让我们看看具体怎么做。

准备纹理坐标(纹理坐标也叫UV坐标)

Cocos2dx-OpenGL ES2.0教程:使用VBO索引(4)

作者:乐逍遥Jun

上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了。在这篇文章中,我们不再画三角形了,改为画四边形。下篇教程,我们就可以画立方体了,到时候就是真3D了,哈哈。

为什么三角形在OpenGL教程里面这么受欢迎呢?因为在OpenGL的世界里面,所有的几何体都可以用三角形组合出来。我们的四边形也一样,它可以用两个三角形组合出来。

你的第一个四边形

首先,因为OpenGL里面没有直接绘制四边形的命令的,所以我们需要画两个三角形来拼成一个四边形。这样的话,这样的话我们一共需要6个顶点。这6个顶点的坐标如下所示:

float vertercies[] =
{ -1,-1,
1, -1,
-1, 1,
-1, 1,
1,1,
1, -1};

Cocos2dx-OpenGL ES 2.0教程:你的第一个三角形(1)

作者:乐逍遥Jun

前言

在本系列教程中,我会以当下最流行的2D引擎Cocos2D-X为基础,介绍OpenGL ES 2.0的一些基本用法。本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2D-X过程中,知其然,更知其所以然。因为我自己的图形学水平有限,所以这些教程不会涉及非常底层的数学原理,同时也不会过多地提及OpenGL本身的一些细节知识。但是我会在每篇文章的最后给出一些参考链接,大家可以顺藤摸瓜,一举Get OpenGL这个新技能。

我第一次学习OpenGL是在2008年,但是那时候学得很烂,被各种矩阵变换搞得云里雾里。我于今年年初彻底重新学习OpenGL,目前来讲,应该算是入门了,至少矩阵变换是理解了,同时也会自己写一些简单的shader,可以进行OpenGL调试了。但是,我的学习之路才刚刚开始,我希望在我自己学习的过程,把有用的一些知识记录下来,方便自己和他人查阅。经过这次重新学习,我个人觉得,OpenGL真的没有那么难,只要你用心,就一定可以学会。当然,好的学习方法和好的学习资料肯定是会使之事半功倍的,希望接下来我的这些博文能为大家带来些许帮助。

cocos2dx(3.X)中调用OpenGL

最近几个月一直在用pomelo写后端,现在项目接近尾声,终于有时间继续研究下OpenGL相关的东西了。

OpenGL本身是跨平台的,但是每个平台的开发环境并不一样,把OpenGL的代码放在cocos里面运行就方便多了。

下面就是一个最简单的示例,在cocos中调用OpenGL方法,将窗口设置成蓝色。

首先新建一个cocos项目,删掉不需要的示例代码, 重写draw和onDraw方法

头文件中添加代码:
view sourceprint?

public:

virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override;

void onDraw(const cocos2d::Mat4& transform, uint32_t flags);

private:

cocos2d::CustomCommand _customCommand;

源文件中代码:
view sourceprint?

更改文字换行风格 ( cocos2dx change line )

在 cocos2dx change line 的实现中,我们可以简单的使用 dimensions属性控制换行。使用它只需将对应的参数值传入构造函数,或者调用 setDimensions 函数即可。

它的换行策略是:当一个单词超出限制长度时,将它移动到下一行。有时这种策略并不合适。例如,在某些语言中,单词都比较长。如果采用这种策略,会出现每一行中只有一个单词。因此需要更改换行策略。当超出限制长度时,使用 - 作为一个分隔单词的标志。

换行策略调用

通过查看Cocos2d-x中换行的实现方式,我发现换行策略是区分平台编程出来的代码。也就是说,为了更改换行策略,我需要分别编写 IOS 和 Java 两部分代码。因为我的目标平台是 Android 平台,因此我只对Java文件进行了更改。IOS 平台的换行策略调用的是系统函数,有兴趣研究的读者可以跟踪源码更改。入口函数为:

bool CCTexture2D::initWithString(const char *text, ccFontDefinition *textDefinition)
{
......

CCImage* pImage = new CCImage();
do
{
CC_BREAK_IF(NULL == pImage);

cocos2dx 使用iAd的问题

已基本实现iad加入应用中,就是在使用ipad的时有一个问题,可能比较少的人遇到。具体情况是:
应用只支持正常的竖屏模式,但是在ipad加载广告后,我是指点击广告后,广告全屏并显示,并且会将屏幕旋转为横屏,然后关闭广告回到应用,那么应用也会变为横屏。如果将屏幕旋转锁定,那么屏幕就转不回来了。我加了测试,在rootViewController中:-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
NSLog(@"RootViewController 视图旋转方向发生改变时会自动调用");
}

确实显示屏幕rootViewController被旋转,如何禁止iad旋转屏幕或者如何让应用自动恢复正常方向,而不需要通过旋转设备。期望版主、大侠。。。。给点提示?

代码见附件:加不了附件??
贴代码:
/ AdViewController.h
#import
#import

【连载】Cocos2dx 小技巧(十一)

说起来很不好意思,我竟然才知道cocos2dx 有OrbitCamera的这种接口(不是RotateTo),赶紧到testCpp里看了下,还真有,以前竟然没注意到!我果然还是太单纯了!
接口是酱紫的:

1

这参数多的让我头晕,到网上查了下意思,是用到了球坐标,参数分别是:旋转的时间,起始半径,半径差,起始z角,旋转z角差,起始x角,旋转x角差。这解释够详细了吧,可我还是没全搞懂~~~~。没办法,自己创建了个小人来转一转:

2

更改参数反复运行后找到了那么点门道:

同步内容
--电子创新网--
粤ICP备12070055号