cocos2dx存儲
Ⅰ 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或...