当前位置:首页 » 存储配置 » cocos2dx存储

cocos2dx存储

发布时间: 2022-11-01 01:10:36

Ⅰ cocos2dx android打包出来时,怎么删除有很多平台的文件夹

按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。
其实,如果项目运行的平台就是中文操作系统,
如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,
只要判定两种常见的编码就可以了:GBK和UTF-8。
由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。

Ⅱ cocos2d texturecache 怎么管理内存

1. 介绍
纹理缓存是将纹理缓存起来,之后的绘制工作就能减少内存。每一个缓存图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中,不用在每一次绘制的时候都发送给GPU。

2. CCTextureCache
Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理。

当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite。所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了。怎么样加载这些纹理就看你自己的想法。例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条。

当你创建一个精灵,你一般会使用CCSprite::create(pszFileName)。假如你去看CCSprite::create(pszFileName)的实现方式,你将看到它将这个图片增加到纹理缓存中去了:

bool CCSprite::initWithFile(const char *pszFilename)
{
CCAssert(pszFilename != NULL, "Invalid filename for sprite");
CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);

if (pTexture)
{
CCRect rect = CCRectZero;
rect.size = pTexture->getContentSize();
return initWithTexture(pTexture, rect);
}

// don't release here.
// when load texture failed, it's better to get a "transparent" sprite then a crashed program
// this->release();
returnfalse;
}

上面代码显示一个单例在控制加载纹理。一旦这个纹理被加载了,在下一时刻就会返回之前加载的纹理引用,并且减少加载的时候瞬间增加的内存。(详细API请看CCTextureCache API)

3. CCSpriteFrameCache
CCSpriteFrameCache单例是所有精灵帧的缓存。使用spritesheet和与之相关的xml文件,我们可以加载很多的精灵帧到缓存中,那么之后我们就可以从这个缓存中创建精灵对象了。

和这个xml相关的纹理集一般是一个很大的图片,里面包含了很多小的纹理。下面就是一个纹理集的例子:

有三种方式来加载纹理集到CCSpriteFrameCache中:
(1)加载一个xml(plist)文件
(2)加载一个xml(plist)文件和一个纹理集
(3)通过CCSpriteFrame和一个精灵帧的名字

具体完整API请看CCSpriteFrameCache API。

样例:

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();

cache->addSpriteFramesWithFile(“hello.plist”, “hello.png”);

使用缓存的原因就是减少内存,因为当你使用一个图片创建一个精灵的时候,如果这个图片不在缓存中,那么就会将他加载到缓存中,当你需要用相同的图片来新建精灵的时候,就可以直接从缓存中取得,而不用再去新分配一份内存空间。

4. CCSpriteFrameCache 对比 CCSpriteBachNode
(1) 最好是尽可能的使用spritesheets (CCSpriteBatchNodes)。这样的方式是减少draw的调用次数。Draw的调用是非常耗时的。每一个batchnode调用一次draw就可以绘制上面所有的节点,而不是每一个节点的draw都单独调用一次,

(2) CCSpriteBatchNode渲染所有的子节点只需要一次,只需要调用一次draw。那就是为什么你需要把精灵加载batch node的原因,因为可以统一一起渲染。但是只有这个精灵使用的纹理包含在batch node中的才可以添加到batch node上,因为batch node一次只渲染这相同的纹理集。

(3) 假如你把精灵添加到其他的节点上。那么每一个精灵就会调用自己的draw函数,batch node就没起作用了。

(4) CCSpriteBatchNode也是一个常用节点。你可以从场景中像其他节点一样移除掉。纹理集和精灵帧都被缓存在CCTextureCache 和 CCSpriteFrameCache单例中。假如你想要从内存中移除纹理集和精灵帧,那么你不得不通过缓存类来完成这个工作。
转载

Ⅲ cocos2dx 加载资源,怎么才能加载完成再进入游戏

楼主的概念错了,我们说的内存是内部存储器的意思,是用来存放计算机当前正要执行的程序和数据。CPU可以直接对内部存储器中的数据进行存取操作。外部存储器主要存放大量计算机暂时不使用而又需要长期保存的程序和数据,如硬盘,CPU不能直接存取外部存储器中的数据,当CPU存取外部存储器中的数据时,必须通过内部存储器进行,内部存储器简称内存是计算机的数据交换中心。你说的占100M是他在运行时占用内存条中的空间,硬盘那不叫内存,称空间大小比较合适

Ⅳ 怎么通过cocos2dx中vector的begin获得存储的数据

vector重载了[]操作符,所以取出数据和数组一样用;
参考方法如下:
vector<int> name1;
while(cin>>m_gname)
name.push_back(m_gname);

for(vector<string>::iterator iter1=name.begin();iter1!=name.end();iter1++)
{
cout<<*iter
}

Ⅳ 老师说cocos2dx过两年就会被淘汰,unity3D才是正道,各位怎么看

很难说,虽然现在的走势3D是主流,但具体还是体现在PC和主机上。虽然unity3D技术也比cocos2dx成熟太多了,要做东西也可以花费更少的代价做漂亮的多的场景。但要注意你用的是手机。
手机本身的性能决定了对3D的表现力就非常有限:
一,操作方式,不像PC和主机,有鼠标+键盘或者手柄。手机的有效操作方式只能触控,虽然可以多点触控,但人的意识决定了你能有效的操作只有左手和右手,也就是最多只有两个点你能够清楚的知道自己在干什么。所以这点更适合2D。
二,手机的计算能力远不如PC,并且各种手机的性能从几百块钱的到几千块钱的更是层次不齐,你总不能向PC一样,玩手游还看配置吧。手机3D模型要严格控制顶点的数目,单个模型最好不要超过5w,所以都是低模。应此你现在玩3D手游同场景其他玩家人物都不可见。人物也是偏向于卡通的。应为真实场景的模拟需要大量的渲染(不仅仅是顶点,还有光照等)是手机不可承受的。现在一般做个2D游戏帧率都不一定能够得到保持。更别说比2D复杂的多的3D了。
三,现在玩手游的,一般也就图个方便,可以在地铁玩,公交玩,家里躺着玩。应为移动方便。3D需要的计算量肯定是要比2D多得多的。手机发热,你就在掌心(如果你有个iphone 6 plus你不心疼?)。就算你不心疼,但电量用的快了。你还得一边充电一边玩(虽然我也不相信有什么辐射,但仔细想想,我现在这样为什么不用电脑?还能不能愉快的玩耍了?)。

手机永远也只有那么大一个,如果未来,CPU和GPU的性能能够像存储磁盘那样从3mb到现在移动硬盘几个T那样变化,同时还能保证散热量的话,那么我坚信手机3D是硬道理。(但就目前的技术发展,我看到手机游戏里面渲染的3D人物,和虚幻4一比,和maya场景中的一比,简直就像绿豆苍蝇一样难看),就目前的情况而言,虽然U3D比cocos2dx强大太多太多了,但在手游上的表现力其实并没有什么差别,除了成套的编辑功能外,其他的甚至还有所不如。

我觉得现在一个手游最好的表现形式,应该是以2D场景为主,中间穿插一些3D的元素(如果场景是全3D的,你手机本身也不能像pc,我W,S,A,D外加鼠标,想看哪里点哪里,虽然现在手游渲染的3D场景并没有让我情不自禁想观光一下全场景的想法)。cocos2dx 本身就是用3D来渲染2D,虽然没U3D那么强大,并且技术要求也要高得多,能够参考的资料也相当有限,调试的过程更是让人醉生梦死,要死要活,必要的时候还要去修改引擎源代码,但对自己也是个相当大的提升吧。引擎也只是我们写游戏的手段,不是目的。

现代人总是更钟情于闪闪发亮的事物,我觉得一个2D场景如果能有好的美工,外加程序员写一些好的Shader,比现在不伦不类的3D更加有表现力。

手游取决于玩法,不在于3D,所以类似于愤怒的小鸟,跑酷,这些可以说是里程碑式的发展。所以楼主应该更加考虑如何去让一个游戏变得更加好玩,游戏做的漂亮固然让人赏心悦目,但只是手段,不是我们做游戏的目的。

以上仅代表个人看法,最后还想说,现在手机页游开始崛起,cocos2dx的王哲也非常看好,但我觉得,第一,现在的人虽然很多人在玩页游,但骨子里其实瞧不起页游(各种网站上的弹窗让页游太掉价了)。第二,性能,javascript的是解释型的语言,同一个方法,c++的执行速度是其百倍。电脑上跑个页游也是相当需要电脑的计算资源的,更别说手机。
吃饭去啦,不说啦。。。。

Ⅵ cocos2dx userdefault 数据会不会删除

游戏中一些比较简单的数据可以使用UserDefault来保存,它的存储方式为xml文件格式。

UserDefault定义如下所示:

/**
* UserDefault acts as a tiny database. You can save and get base type values by it.
* For example, setBoolForKey("played", true) will add a bool value true into the database.
* Its key is "played". You can get the value of the key by getBoolForKey("played").
*
* It supports the following base types:
* bool, int, float, double, string
*/
class CC_DLL UserDefault
{
public:
// get value methods

/**
@brief Get bool value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is false.
* @js NA
*/
bool getBoolForKey(const char* pKey);
/**
* @js NA
*/
bool getBoolForKey(const char* pKey, bool defaultValue);
/**
@brief Get integer value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is 0.
* @js NA
*/
int getIntegerForKey(const char* pKey);
/**
* @js NA
*/
int getIntegerForKey(const char* pKey, int defaultValue);
/**
@brief Get float value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is 0.0f.
* @js NA
*/
float getFloatForKey(const char* pKey);
/**
* @js NA
*/
float getFloatForKey(const char* pKey, float defaultValue);
/**
@brief Get double value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is 0.0.
* @js NA
*/
double getDoubleForKey(const char* pKey);
/**
* @js NA
*/
double getDoubleForKey(const char* pKey, double defaultValue);
/**
@brief Get string value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is "".
* @js NA
*/
std::string getStringForKey(const char* pKey);
/**
* @js NA
*/
std::string getStringForKey(const char* pKey, const std::string & defaultValue);
/**
@brief Get binary data value by key, if the key doesn't exist, a default value will return.
You can set the default value, or it is null.
* @js NA
* @lua NA
*/
Data getDataForKey(const char* pKey);
/**
* @js NA
* @lua NA
*/
Data getDataForKey(const char* pKey, const Data& defaultValue);

// set value methods

/**
@brief Set bool value by key.
* @js NA
*/
void setBoolForKey(const char* pKey, bool value);
/**
@brief Set integer value by key.
* @js NA
*/
void setIntegerForKey(const char* pKey, int value);
/**
@brief Set float value by key.
* @js NA
*/
void setFloatForKey(const char* pKey, float value);
/**
@brief Set double value by key.
* @js NA
*/
void setDoubleForKey(const char* pKey, double value);
/**
@brief Set string value by key.
* @js NA
*/
void setStringForKey(const char* pKey, const std::string & value);
/**
@brief Set binary data value by key.
* @js NA
* @lua NA
*/
void setDataForKey(const char* pKey, const Data& value);
/**
@brief Save content to xml file
* @js NA
*/
void flush();

/** returns the singleton
* @js NA
* @lua NA
*/
static UserDefault* getInstance();
/**
* @js NA
*/
static void destroyInstance();

/** deprecated. Use getInstace() instead
* @js NA
* @lua NA
*/
CC_DEPRECATED_ATTRIBUTE static UserDefault* sharedUserDefault();
/**
* @js NA
*/
CC_DEPRECATED_ATTRIBUTE static void purgeSharedUserDefault();
/**
* @js NA
*/
const static std::string& getXMLFilePath();
/**
* @js NA
*/
static bool isXMLFileExist();

private:
UserDefault();
~UserDefault();

static bool createXMLFile();
static void initXMLFilePath();

static UserDefault* _userDefault;
static std::string _filePath;
static bool _isFilePathInitialized;
};

使用如下:

UserDefault::getInstance()->setStringForKey("key","value"); //添加一个字符串数据到指定key下,UserDefault::getInstance()如果是第一次调用则会自动生成一个UserDefault.xml文件,该文件用以保存所有的UserDefault中的数据,UserDefault中的数据是以key-value的方式来存储的
UserDefault::getInstance()->getStringForKey("key","default value");//读取指定key的数据,如不存在该数据则返回指定的默认值"default value"
UserDefault::isXMLFileExist();//用以判断是否已经存在UserDefault.xml文件
如果嫌弃调用时代码过长,可以使用宏,如

#define SaveStringToXML UserDefault::getInstance()->setStringForKey

#define LoadStringFromXML UserDefault::getInstance()->getStringForKey
...

#define SaveBooleanToXML UserDefault::getInstance()->setBoolForKey

#define LoadBooleanFromXML UserDefault::getInstance()->getBoolForKey

有时需要判断是否首次运行/生成某些数据,可使用一个boolean值来进行记录,如
if(LoadBooleanFromXML("first_time",true))

{

//进行所需的首次加载操作

SaveBooleanToXML ("first_time",false);

}

Ⅶ Cocos2dx打不开求解

应用程序初始化内存分配错误。
0xc0000005错误发生的诱因主要分为四大类:
1、自由表存储载体的缺陷(主要体现在VCX、VCT,SCX和SCT上)。
2、第三方监控性质的软件。(如:防毒软件在内存即时监控状态下、词霸软件在全屏拾取模式下等);
3、Visual Foxpro 自身的代码漏洞;
4、硬件因素。

建议断开网络,然后关闭防火墙,再安装试试,如果不行,重启电脑再试,再不行则归类为程序缺陷了。

Ⅷ cocos2dx之如何优化内存使用

在输出到PNG格式之后,无论是4444还是8888,它变成了每像素32位的PNG标准,或者RGBA88 88。内存不会减少。只有出口是PVR格式正确支持RGBA44 44。在iOS中可以观察到更少的内存占用。如果针对iOS的开发,RGBA44将有颜色分级问题,建议使用PVRTC4,内存消耗最少,最富成本的纹理处理。但PVRTC4也存在缺陷,即透明性存在明显缺陷。协调Android,我们现在推荐PNGQANT工具,它可以高度优化PNG的大小。但它不会减少内存占用。也有一些选项,比如将图像分割成RGB和数据两部分,RGB部分用JPG格式压缩,部分用PNG压缩。在调用之前,将其合并到内存中的纹理数据中,并将其加载到视频存储器中。但也有不利的一面,这意味着紧缩的JPG和合并的渠道消耗更多的CPU功率,占用更多的时间。如果材料量大,问题将变得更加明显。

Ⅸ cocos2dx 怎么直接取纹理缓存

1. 介绍 纹理缓存是将纹理缓存起来,之后的绘制工作就能减少内存。每一个缓存图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中,不用在每一次绘制的时候都发送给GPU。 2. CCTextureCache Cocos2d通过调用CCTextureCache或...

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:335
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:944
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371