0%

闲话

感冒好像有些更严重了,头很不舒服。

下午听王爷说他们发奖金了,虽然不多,但是也是要恭喜一下的,毕竟不管发多少,总比不发强吧,而且现在他的项目进展的也算是顺利。一想到这项目还是会有些郁闷,毕竟是我们哥几个一点点弄出来的,现在却成了别人的孩子,而且还是不太待见的孩子,郁闷。

正文

今天随便说说Sprite Sheet吧,简单来说,这是一个小图片集合。我印象中,这种技术最早用于WEB开发中,当在网页中使用很多小图片时,在访问时,浏览器需要对每个图片发起请求,而每次请求都只传送了一个很小的图片文件,这无形中就浪费了大量的HTTP请求和网络连接,即使在HTTP 1.1的环境中,默认的头Connection保持keep-alive时可以我重用连接,便是多次请求传送的Header也会浪费很多的流量。

因此,就有聪明人发明了这种方式,把多个小图片合成一个大图片,这样不仅减少了请求数、节约了资源,还使数据传输更加有效率,于是人们亲切的称之为Sprite Sheet。

而在游戏开发中,合理的使用Sprite Sheet同样有着积极的作用,比如将相关性较高的图片合并到一张大图片中,不仅可以使图片的渲染过程得到优化,同时还能使图片资源更便于管理(这也是我最近也学到的,:))。

Read more »

废话

今天和王爷一起去传说中的车库咖啡见了一个创业团队,跟他们有了一个小时左右的交流时间,交流的详情就不说了,总之,让我和王爷多了一个很好的话题,在回家的路上,我们就这个话题进行了友好、亲切而又愉快的交流,受益匪浅。
不过,最糟心的是,跑这一趟我竟然感冒了,主要是天气热,出了很多汗,而在地铁通道里风太大,晾了汗了,纠结死我了,明天还要去见一个离得比较近的创业团队,我在犹豫到底还要不要去。

概述

今天随便说说在Cocos2D-X开发中,关于对CCSprite方面的优化,总得来说就是尽可能减少渲染次数,这样可以使游戏运行更有效率,能够空出更多的CPU时间做其它的事情,以增加游戏的流畅与体验。

正文

Cocos2D为图片资源批量加载提供了CCSpriteFrameCache类,此类可以通过使用Sprite Sheet文件来减少图片加载次数,简单来说,就是把多个图片拼成一个大图片,之后通过坐标在大文件上取到相应的图片,这个技术被广泛使用在网页设计及游戏开发中。在这里我使用了一个叫做Zwoptex的软件自动生成大图片及相应的.plist,软件的具体使用方法就不在这里细说了(另外,朋友介绍说Texture Packer是可以更好的做这件事的工具,改天尝试一下)。

另外,Cocos2D还提供了一个CCSpriteBatchNode类,这个类主要作用是,当相同图片资源被重复使用时,通过这个类可以减少使相同的图片只渲染一次,具体做法看下面的代码。
PS: 代码基于上一篇BLOG,只对关键部分进行说明。

GameSceneDH.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __StudyCocos2D__GameSceneDH__
#define __StudyCocos2D__GameSceneDH__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class GameSceneDH: public CCLayer {
public:
static CCScene *scene();
virtual bool init();
CREATE_FUNC(GameSceneDH);
};
Read more »

废话

本来部门计划今天下午全部门去搞团建的,主要活动是开卡丁车、桌游等项目,可惜天不从人愿,早晨有点下雨,好不容易盼到中午晴天,结果Leader又一个通知,说今天事情太多,活动改期到下周了,我勒个去的,废话不多说,进去正题。

概述

今天练习的内容主要是在Cocos2D开发中,对菜单的运用以及场景切换,中间还涉及到对于CCSprite对象的一些操作和schedule的简单应用。

正文

首先用create_project.py建立一个基础项目,然后分别建立两个CCLayer的子类。

StudyCocos2D.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
// StudyCocos2D.h
// StudyCocos2D
//
// Created by Toby Lee on 14-3-28.
//
//

#ifndef __StudyCocos2D__StudyCocos2D__
#define __StudyCocos2D__StudyCocos2D__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;

class StudyCocos2D: public CCLayer {
private:
void onStartClick(CCObject *obj);
public:
static CCScene * scene();
virtual bool init();
CREATE_FUNC(StudyCocos2D);
};

#endif /* defined(__StudyCocos2D__StudyCocos2D__) */

这是一个最简单的头文件,相比上一篇只多了一个私有方法void onStartClick(CCObject *obj),其作用后面再说明。

Read more »

对MySQL协议稍作了解后,我们就知道在协议中,服务端与客户端相互之间的通讯都是以包的形式进行的。

在这些包中,有一个固定的特征就是前四个字节用途不变,前三个字节表示数据包的长度,第四个字节表示当前包在本次交互中是序数。

前三个字节最大只能表达16M的长度,这是三个字节表达无符号整型的极限,所以,每次客户端可以接受到的最大数据包为16M+4个字节。

至于第四个字节,这是表达当前包的序数的,一个字节能表达的最大正整数是255。我们知道,在MySQL协议中,发送COM_QUERY命令后,服务器返回的数据格式为,响应头为一个包,然后,每一个字段的描述也会是一个包,字段说明后面会跟一个EOF包表示字段描述结束,之后则跟随的是表中的数据,每一个数据包表达一行数据,一般情况,我们每次从数据库里检索的条数,去掉描述协议的部分,在序数中我们还有不少空间可以用在数据记录上,但是,如果总的包数超过255,那会是怎么的情况哪?

在我们使用数据库的经验中,我们可以经常有机会看到很多条记录同时显示出来的例子,记录数明明超过了255,可是依然正常显示,这是为什么哪?

经过对MySQL交互嗅探,我发现在数据包次序达到255后,之后紧随的包的次序就变成了0,在Wireshark的协议分析中会认为这是错乱的协议,我想,这应该是MySQL特意使用的方式。

前后端的交互中,到发现次序达到255后,对序数加1,由于只使用了一个字节,所以数据溢出变成了0,这样的情况在MySQL协议中被认为是合法的,只要前后端认可这种方式,那这种通讯就不会出错。

所以我认为,在MySQL通讯中,包序号只是用来确认包的次序没有发生错误的,至于序号是几并不重要,只要认定255号后为0号是合法的,那就可以达到正常交互并保证数据序号不会出错的目的。

概述

今天学习了在Cocos2D-X开发中创建场景,以及在场景中加入图片资源,并通过写一个简单的例子对涉及到的CCLayer和CCSprite进行练习和熟悉。

过程

首先,场景类需要继承于CCLayer,并且必须实现类函数CCScene *scene()和虚函数bool init(),前者用于建立场景并在场景中加入层以备演示CCSprite,而后者则是用于对本场景进行初始化,代码如下:

GameScene.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef __HelloCocos__GameScene__
#define __HelloCocos__GameScene__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class GameScene: public CCLayer {
private:
public:
virtual bool init();
static CCScene * scene();
CREATE_FUNC(GameScene);
};
#endif /* defined(__HelloCocos__GameScene__) */

以上代码, CREATE_FUNC(GameScene)是一个宏,此宏的功能是为GameScene类创建一个GameScene *GameScene::create()类函数,由于此函数的功能单一,其主要作用就是用来调用对象中的init()方法,因此,使用宏对代码进行简化是一个非常好的方法。

Read more »