1. 程式人生 > >Cocos2dx學習筆記38 plist的非同步載入

Cocos2dx學習筆記38 plist的非同步載入

原文地址:http://cn.cocos2d-x.org/tutorial/show?id=556

Cocos2d-x中和Android,Windows都一樣,如果在主執行緒中處理一些耗時操作,那麼主執行緒就會出現阻塞現象,表現在介面上就是卡住,未響應等情況。為了避免這種情況的出現,我們需要在後臺開闢工作執行緒進行資料的處理,再採用訊息傳遞或者其他形式來通知主執行緒進行UI變化。最常見的情況就是遊戲進入前的loading。

1.圖片的非同步載入

在多執行緒和同步的第一篇介紹到使用pthread庫的時候,講到由於CCAutoreleasePool不是執行緒安全的,所以不能在工作執行緒中引入Cocos2d-x相關的API(其實並不是所有的API都不能使用)。但是Cocos2d-x顯然考慮到這個問題了,所以它本身就幫我們封裝好了一個API,避免了還要手動引入pthread庫的尷尬。

1 void CCTextureCache::addImageAsync(const char *path, CCObject *target, SEL_CallFuncO selector)
其中path是圖片的位置,selector是載入完成時的回撥函式。很方便,如果需要載入很多圖片的話,對每一個進行回撥處理,然後在update中更新UI即可。

2.plist的非同步載入

可是由於記憶體原因,大部分情況下圖片會被合成打包,同時帶入plist。這時候如何進行圖片的非同步載入呢?這個時候就需要對addImageAsync的原始碼進一步的探究了。

2.1.耗時的是什麼?

首先要理解的是耗時的動作是什麼,只有把耗時的工作真正抓出來丟到工作執行緒上,非同步載入才有意義。我們知道,圖片在記憶體中是以紋理的形式存在的,而圖片的載入,通俗來講也就是紋理的生成,這就是耗時的原因。那CCTexureCache中addImage(同步載入)和addImageAysnc(非同步載入)分別做了什麼事?

(1)addImage

可以看出addImage使用同步的方式生成了紋理,也就是在主執行緒中進行了耗時的載入操作。

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 26 27 28 29 30 31 32 //...Cocos2d-x維護著一個全域性紋理,在判斷紋理是否已存在 if (! texture) { do { //...判斷圖片格式 pImage = new CCImage(); CC_BREAK_IF(NULL == pImage); bool bRet = pImage->initWithImageFile(fullpath.c_str(), eImageFormat); CC_BREAK_IF(!bRet); texture = new CCTexture2D();    //開闢紋理空間 if( texture && texture->initWithImage(pImage) )  //使用CCImage初始化紋理 { #if CC_ENABLE_CACHE_TEXTURE_DATA // cache the texture file name VolatileTexture::addImageTexture(texture, fullpath.c_str(), eImageFormat); #endif m_pTextures->setObject(texture, pathKey.c_str()); texture->release(); }

相關推薦

Cocos2dx學習筆記38 plist非同步載入

原文地址:http://cn.cocos2d-x.org/tutorial/show?id=556 Cocos2d-x中和Android,Windows都一樣,如果在主執行緒中處理一些耗時操作,那麼主執行緒就會出現阻塞現象,表現在介面上就是卡住,未響應等情況。為

學習筆記38—國外appleID註冊教程

國外appleid註冊教程來啦…。至於國外appleid有什麼用處就不過多的介紹了,需要的人自然是知道,不知道的百度下。1.首先開啟蘋果appleid註冊網址:https://appleid.apple.com/#!&page=signin,然後建立appleid,這裡以美國appleid為例。在這裡

Zookeeper學習筆記十之 非同步實現主節點選舉

非同步實現主節點選舉      Zookeeper中,所有同步呼叫方法都有對應的非同步呼叫方法,通過非同步呼叫,我們可以在單執行緒中同時進行多個呼叫,接下來實現一個非同步實現主節點選舉的例子        Zookeeper.create方法的非同步呼叫版本      

AI-009: 吳恩達教授(Andrew Ng)的機器學習課程學習筆記38-47

本文是學習Andrew Ng的機器學習系列教程的學習筆記。教學視訊地址: 38. Neural Networks - Representation - Non-linear hypotheses Why neural networks? Simple linear

leetcode學習筆記38

22. Generate Parentheses For example, given n = 3, a solution set is: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 這道題是借鑑網上的思路解出的,主要

Java學習筆記38:通過Spring Bean 注入static變數,來設計一套適合測試,開發,生產環境的配置項

這邊文章的目的主要是為了在spring開發web專案的時候,讓我們的測試,開發,生產環境的配置項 .properties作為配置檔案。 我們首先需要建立一個config資料夾,然後建立開發,測試,生產環境的.properties配置項檔案。 例如,dev.proper

【opencv學習筆記】002之載入影象imread、修改影象cvtColor、顯示影象imshow及儲存影象imwrite

目錄 一、前言 二、影象基本操作 1、載入影象CV :: imread 2、建立視窗cv::namedWindow 3、顯示影象CV :: imshow 4、修改影象 (cv::cvtColor) 5、儲存影象 (cv::imwrite) 三、全部程式碼及結果展示

Django學習筆記--Static檔案的載入

Static檔案的載入 Django把圖片、JavaScript、CSS看做是static files(靜態檔案)。 1. 載入CSS 建立資料夾命名static 這個資料夾應在在web app目錄下。最好在static資料夾下再建立一個

Android-Universal-Image-Loader 學習筆記(二)載入圖片原理

public void displayImage(String uri, ImageAware imageAware, DisplayImageOptions options, ImageLoadingListener listener, ImageLoadingProgressListener pro

cocos2dx學習筆記:自定義動作實現圓周運動

最近在翻帖子的時候發現很多大牛都自己實現自定義動作,而不是通過各種動作進行組合,正好最近需要一個圓周運動的效果,就自己寫了一個自定義的動作,這裡備註下大致的實現思路。 Contents[hide] 備註: 該動作並未實際應用在遊戲中,可能有b

《Spring技術內幕》學習筆記3——IoC容器載入Bean定義資原始檔

1.當Spring的IoC容器將Bean定義的資原始檔封裝為Spring的Resource之後,接下來要做的就是通過Spring的資源載入器(resourceLoader)讀入Bean定義資原始檔的過程。對於IoC容器來說,Bean定義的載入過程就是將Bean定義資原始檔

python學習筆記-38 操作文件和目錄

ras eas 合成 文件復制 使用 mkdir copyfile cal 文件 如果我們要操作文件、目錄,可以在命令行下面輸入操作系統提供的各種命令來完成。比如dir、cp等命令。 如果要在Python程序中執行這些目錄和文件的操作怎麽辦?其實操作系統提供的命令只是簡單

SpringBoot 2.x 學習筆記(5):ECharts+AJAX實現非同步資料載入

1、JavaBean package cn.hadron.eba.bean; import java.io.Serializable; public class UserBean implements Serializable{ private String usernam

Android非同步載入(慕課網學習筆記)

最近看了慕課網的教學視訊,這裡記錄一下學習筆記. 學習視訊地址:http://www.imooc.com/learn/406 視訊完成的小例子很簡單,就是展示一個帶圖片的列表.如下圖所示: 首先把MainActivity的佈局,ListView的It

Android異步載入學習筆記之四:利用緩存優化網絡載入圖片及ListView載入優化

角度 thread 下午 出發 easy code cat height back 假設不做不論什麽處理。直接用網絡載入圖片在網速快的情況下可能沒什麽不好的感覺。可是假設使用移動流量或是網絡不好的時候。問題就來了,要麽用戶會抱怨流量使用太多。要麽抱怨圖

【C#學習筆記載入圖片並居中

mode collect angle mage event names args void fromfile using System; using System.Collections.Generic; using System.ComponentModel;

cocos2d-x學習筆記(十二)cocos2dx 3.10添加lua LuaFileSystem庫遍歷文件

luafilesystem庫;lfs;遍歷文件在lua中遍歷目錄文件需要用到lfs庫,而所用的cocos2dx 3.10沒用lfs,需要自己添加1、下載lfs.c和lfs.hhttps://github.com/keplerproject/luafilesystem 從github獲取源碼,在src目錄拷貝l

Android學習筆記 三二 執行緒 後臺非同步任務AsyncTask

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Leaflet學習筆記-載入北京地鐵線路

Leaflet學習筆記-載入北京地鐵線路 先上效果圖 本文主要由兩部分組成: 獲取線路和站點json Leaflet載入線路和站點GeoJson 獲取線路和站點json 高德地圖-地鐵 路線json(包含站點座標) http:/

學習筆記-Python基礎18-asyncio非同步

# asyncio  - Python3.4開始引入標準庫當中,內建對非同步io的支援  - asyncio本身是一個訊息迴圈  - 步驟:     - 1、建立訊息迴圈     - 2、把協成加進去     - 3、關閉 # asyncio非同步協成,簡單案例1 import threading i