wanggg 的blog

我所理解的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,这一规化过程在光栅化阶段完成。

【Cocos2d-x游戏开发】解决Cocos2d-x中文乱码的三种方法

众所周知,Cocos2d-x是一款不错的开源引擎,但是在Cocos2d-x中直接使用中文是无法正确显示的。

解决这个问题常用的有三种方法:

1.通过转换为UTF-8编码来显示。
2.使用iconv库来解决。
3.使用解析xml或者json文件来解决。

这里推荐使用第三种方法来解决,因为比较简单方便,还能支持I18N国际化。下面我们来一一详细了解一下每种解决方案的具体实现:

一、通过转换为UTF-8编码的方式显示出来

建立一个方法用于转换中文到对应的UTF-8编码,具体代码如下:

char *HelloWorld::FontToUTF8(const char* font){
    int len = MultiByteToWideChar(CP_ACP,0,font,-1,NULL,0);
    wchar_t *wstr = new wchar_t[len+1];
    memset(wstr,0,len+1);
    MultiByteToWideChar(CP_ACP,0,font,-1,wstr,len);

关于Cocos2d-x中定时器的使用总结

定义:定时器在大部分游戏中是不可或缺的,即每隔一段时间,就要执行相应的刷新体函数,以更新游戏的画面、时间、进度、敌人的指令等等。

cocos2dx为我们提供了定时器schedule相关的操作。其操作函数的定义在CCNode中,所以基本上大多数的引擎类都可以设置定时器,如CCLayer、CCSprite、CCMenu等。

种类

定时器更新的方式分为三类:

(1)默认定时器 :scheduleUpdate();
(2)自定义定时器:schedule();
(3)一次性定时器:scheduleOnce();

Demo下载

https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E5%AE%9A...

scheduleUpdate

默认定时器:scheduleUpdate()。

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度。

下面我们就来一起学习一下Cocos2d-x开发中那些不得不了解的C++11知识。

1.初始化列表

POD结构或者数组根据成员在结构内定义的顺序,可以使用初始化列表来进行初始化以简化代码。

struct StructA{
    int a;
    int b;
};

StructA sa={1,2};

在C++03中,非POD结构的类或者STL容器并不支持这种简便的写法,而C++11提供了强大的支持。使用std::initializer_list可以让类和普通函数使用初始化列表,并且STL容器也是可以使用初始化列表,代码如下:

//类使用初始化列表
class ClassA{
public:
    ClassA(std::initializer_list<int>list){}
};

ClassA a = { 1, 2, 3 };

【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术

上一篇博客《【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术》中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术。

一、弱联网技术介绍

在网络游戏中许多重要的功能都需要网络连接,而根据需要的不同,这些连接大体可分为弱联网和强联网两种。比如,在《微信飞机大战》或者《开心消消乐》这类的游戏中,玩家在本地进行游戏,只有最后才会上传成绩到服务器进行排名或者将成绩分享。这样数据量和频率都比较低的网络通信就可以使用弱联网技术。而在一些需要实时对话或者处理大量的数据的游戏中弱联网就不再适合,需要使用强联网技术了。

一般来说,弱联网技术都采用了某种web方式通过HTTP协议来传输数据,而强联网技术则通过Socket的方式由开发者根据需要来制定某种协议进行通信。

二、通过HTTP协议获取网站信息

在Cocos2d-x中使用HTTP协议传输数据的话,需要用到第三方库CURL。在使用第三方库之前,需要先将它添加到项目中,具体做法如下:

【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

一、引言

数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得从头来再玩一遍。那玩家一定会掏出准备已久的西瓜刀~)

其实Cocos2d-x引擎早已为我们开发者封装好了多种数据存储的类或者方法,包括简单信息的存储,文件的读写,SQLite数据库和RAR格式的压缩文件的读取等等。(用心良苦啊!)其中大部分的存储功能被封装到了UserDefault类中。

二、数据存储

1.UserDefault类

UserDefault 是一个小型的数据管理类。你可以通过这个类保存并获得基本类型值的数据。 例如:setBoolForKey("played", true) 将在数据库中添加一个值为 true 的布尔型数据。 它的 key 是 "player"。可以通过 getBoolForKey("player") 获取这个数据。

UserDefault类提供了一些常用的方法用于读取和存储数据信息,如下表:

Cocos2d-x v3.16正式版发布!

众多小伙伴苦等了数月的Cocos2d-x v3.16版本今天正式发布啦!许多开发者升级使用后的一致反馈是:实用、功能强大、稳定性好。

该版本对Cocos Creator的原生游戏开发工作流进行升级,更好的支持creator_to_cocos2dx插件,满足开发者用Cocos Creator制作场景的需求;新增LayerRadiaGradientLayer功能;Web引擎更新Spine runtime到v3.5.35;支持升级到Android Studio 2.3.3;修复了多个Cocos2d-x的bug,持续提升版本的稳定性。

这是一个令人值得期待的全新版本!

Cocos2d-x v3.16版本下载地址: http://www.cocos.com/download

下面让我们详细地来了解每个亮点功能的特性。

更好地支持creator_to_cocos2dx,提升原生游戏开发体验

creator_to_cocos2dx是一个Cocos Creator的插件。该插件用于导出Creator创建的场景内容给cocos2d-x的C++/Lua工程使用。

cocos2d - 纹理的选择

普通的2D纹理就是一张图片,在cocos2d里,纹理的使用主要分为两步:

一,从本地加载纹理图片,并将纹理数据读取到内存。
二,将内存里的纹理数据以copy的形式上传到GPU内存。

前者主要涉及到的问题是图片尺寸以及加载后的内存占用。例如,我们要从本地加载了一张1024*1024的png图片(假设是RGBA8888格式),其大小约为1024*1024*4 = 4MB。这意味着,如果这张图片打包进安装包就会使整个程序增加4MB,如果在运行时加载到游戏里就相当于多了至少4MB内存。

对于一个有责任心(小肚鸡肠)的开发者来说,程序无缘无故增加了4MB内存,无疑是令人耿耿于怀的。能不能把尺寸或者运行时内存减少一点呢?答案是可以的。

要解决纹理的内存问题,首先,我们应当了解一下纹理图片为何会占了这么多内存。对于,我们常见的图片,无论是png还是jpg图片,他们都是非压缩纹理。非压缩纹理的意思是,这些图片的RGBA四个通道的像素数据在文件里都是按照一定顺序规则排列的。类似于RGBA,RGBA,….,RGBA这样的排列,不同的非压缩格式图片的区别在于,有一些只使用了rgb三个通道值,有一些使用的通道精度是小于28。

使用Cocos开发一款简单的3D VR抓钱游戏

最近VR成为了一个新兴的热点,很多以前从事游戏开发的团队都在关注这个方向。如何在VR时代来临之际快速的掌握开发VR游戏的方法,这对于很多中小团队来说,是一个要考虑的问题。

目前市面上有很多3D引擎已经开始支持VR功能。特别是虚幻,Unity等引擎对于VR这个领域都非常重视,但是国内这几年有大量的手游团队在使用Cocos2d-x来开发游戏项目,现有人员的的经验对于游戏开发非常宝贵,更何况目前VR领域并未出现很好的CP盈利案例。短期内贸然转型,放弃现有的引擎编程语言和使用经验,直接转向Unity或虚幻,有一定风险。

那么是否有可能直接使用Cocos来开发VR游戏呢?

理论上讲,这样既节省了成本,又可以使大量之前所开发的Cocos2d-x项目经验得到非常好的保留。对于很多传统的Cocos手游中小团队来讲,是一个相对比较容易接受的方案。

随着Cocos在3D方面的不断完善,使用Cocos开发3D或VR游戏变的现实,这一年来,我和我的团队一直在尝试着用Cocos开发一些3D和VR方面的游戏项目,经过不断的尝试和探索,我们已经用Cocos开发出了多款VR游戏,并将它们推向了暴风魔镜,87870,乐相大鹏,蚁视的内容平台。

比如下面的《南瓜保卫战》,它是一款休闲风格的VR游戏,算是传统“打地鼠”游戏的VR版本。

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