1. 程式人生 > >cocoscreator獲取和載入資源

cocoscreator獲取和載入資源

動態載入 Asset

Creator 提供了 cc.loader.loadRes 這個 API 來專門載入那些位於 resources 目錄下的 Asset。和 cc.loader.load 不同的是,loadRes 一次只能載入單個 Asset。呼叫時,你只要傳入相對 resources 的路徑即可,並且路徑的結尾處不能包含副檔名。

[javascript] view plain copy
  1. // 載入 Prefab
  2. cc.loader.loadRes("test assets/prefab"function (err, prefab) {  
  3.     var newNode = cc.instantiate(prefab);  
  4.     cc.director.getScene().addChild(newNode);  
  5. });  
  6. // 載入 AnimationClip
  7. var self = this;  
  8. cc.loader.loadRes("test assets/anim"function (err, clip) {  
  9.     self.node.getComponent(cc.Animation).addClip(clip, "anim");  
  10. });  
  11. // 載入 SpriteAtlas(圖集),並且獲取其中的一個 SpriteFrame
  12. // 注意 atlas 資原始檔(plist)通常會和一個同名的圖片檔案(png)放在一個目錄下, 所以需要在第二個引數指定資源型別
  13. cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {  
  14.     var frame = atlas.getSpriteFrame('sheep_down_0');  
  15.     sprite.spriteFrame = frame;  
  16. });  

載入獨立的 SpriteFrame

圖片設定為 Sprite 後,將會在 資源管理器 中生成一個對應的 SpriteFrame。但如果直接載入 test assets/image

,得到的型別將會是 cc.Texture2D。你必須指定第二個引數為資源的型別,才能載入到圖片生成的 cc.SpriteFrame:

[javascript] view plain copy
  1. // 載入 SpriteFrame
  2. var self = this;  
  3. cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {  
  4.     self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;  
  5. });  

如果指定了型別引數,就會在路徑下查詢指定型別的資源。當你在同一個路徑下同時包含了多個重名資源(例如同時包含 player.clip 和 player.psd),或者需要獲取“子資源”(例如獲取 Texture2D 生成的 SpriteFrame),就需要宣告型別。

資源釋放

loadRes 載入進來的單個資源如果需要釋放,可以呼叫 cc.loader.releaseResreleaseRes 可以傳入和 loadRes 相同的路徑和型別引數。

[javascript] view plain copy
  1. cc.loader.releaseRes("test assets/image", cc.SpriteFrame);  
  2. cc.loader.releaseRes("test assets/anim");  

此外,你也可以使用 cc.loader.releaseAsset 來釋放特定的 Asset 例項。

[javascript] view plain copy
  1. cc.loader.releaseAsset(spriteFrame);  

動態載入 Raw Asset

Raw Asset 可以直接使用 url 從遠端伺服器上載入,也可以從專案中動態載入。對遠端載入而言,原先 Cocos2d 的載入方式不變,使用 cc.loader.load 即可。對專案裡的 Raw Asset,載入方式和 Asset 一樣:

[javascript] view plain copy
  1. // 載入 Texture,不需要字尾名
  2. cc.loader.loadRes("test assets/image"function (err, texture) {  
  3.     ...  
  4. });  

cc.url.raw

Raw Asset 載入成功後,如果需要傳給一些 url 形式的 API,還是需要給出完整路徑才行。你需要用 cc.url.raw 進行一次 url 的轉換:

[javascript] view plain copy
  1. // 原 url 會報錯!檔案找不到
  2. var texture = cc.textureCache.addImage("resources/test assets/image.png");  
  3. // 改用 cc.url.raw,此時需要宣告 resources 目錄和檔案字尾名
  4. var realUrl = cc.url.raw("resources/test assets/image.png");  
  5. var texture = cc.textureCache.addImage(realUrl);  

資源批量載入

cc.loader.loadResDir 可以載入相同路徑下的多個資源:

[javascript] view plain copy
  1. // 載入 test assets 目錄下所有資源
  2. cc.loader.loadResDir("test assets"function (err, assets) {  
  3.     // ...
  4. });  
  5. // 載入 sheep.plist 圖集中的所有 SpriteFrame
  6. cc.loader.loadResDir("test assets/sheep", cc.SpriteFrame, function (err, assets) {  
  7.     // assets 是一個 SpriteFrame 陣列,已經包含了圖集中的所有 SpriteFrame。
  8.     // 而 loadRes('test assets/sheep', cc.SpriteAtlas, function (err, atlas) {...}) 獲得的則是整個 SpriteAtlas 物件。
  9. });  

載入遠端資源和裝置資源

在目前的 Cocos Creator 中,我們支援載入遠端貼圖資源,這對於載入使用者頭像等需要向伺服器請求的貼圖很友好,需要注意的是,這需要開發者直接呼叫 cc.loader.load。同時,如果使用者用其他方式下載了資源到本地裝置儲存中,也需要用同樣的 API 來載入,上文中的 loadRes 等 API 只適用於應用包內的資源和熱更新的本地資源。下面是這個 API 的用法:

[javascript] view plain copy
  1. // 遠端 url 帶圖片字尾名
  2. var remoteUrl = "http://unknown.org/someres.png";  
  3. cc.loader.load(remoteUrl, function (err, texture) {  
  4.     // Use texture to create sprite frame
  5. });  
  6. // 遠端 url 不帶圖片字尾名,此時必須指定遠端圖片檔案的型別
  7. remoteUrl = "http://unknown.org/emoji?id=124982374";  
  8. cc.loader.load({url: remoteUrl, type: 'png'}, function () {  
  9.     // Use texture to create sprite frame
  10. });  
  11. // 用絕對路徑載入裝置儲存內的資源,比如相簿
  12. var absolutePath = "/dara/data/some/path/to/image.png"
  13. cc.loader.load(absolutePath, function () {  
  14.     // Use texture to create sprite frame
  15. });  

目前的此類手動資源載入還有一些限制,對使用者影響比較大的是:

  1. 遠端載入不支援圖片檔案以外型別的資源(已在 1.5/1.6 支援計劃中)
  2. 這種載入方式只支援 raw asset 資源型別,不支援 SpriteFrame、SpriteAtlas、Tilemap 等資源的直接載入和解析(需要後續版本中的 Assets Bundle 支援)
  3. Web 端的遠端載入受到瀏覽器的 CORS 跨域策略限制,如果對方伺服器禁止跨域訪問,那麼會載入失敗,而且在 WebGL 渲染模式下,即便對方伺服器允許 http 請求成功之後也無法渲染,這是 WebGL 的安全策略的限制

資源的依賴和釋放

在載入完資源之後,所有的資源都會臨時被快取到 cc.loader 中,以避免重複載入資源時傳送無意義的 http 請求,當然,快取的內容都會佔用記憶體,有些資源可能使用者不再需要了,想要釋放它們,這裡介紹一下在做資源釋放時需要注意的事項。

首先最為重要的一點就是:資源之間是互相依賴的。

比如下圖,Prefab 資源中的 Node 包含 Sprite 元件,Sprite 元件依賴於 SpriteFrame,SpriteFrame 資源依賴於 Texture 資源,而 Prefab,SpriteFrame 和 Texture 資源都被 cc.loader 快取起來了。這樣做的好處是,有可能有另一個 SpriteAtlas 資源依賴於同樣的一個 SpriteFrame 和 Texture,那麼當你手動載入這個 SpriteAtlas 的時候,就不需要再重新請求貼圖資源了,cc.loader 會自動使用快取中的資源。

在搞明白資源的相互引用之後,資源釋放的問題也就呼之欲出了,當你選擇釋放一個 Prefab 時,我們是不會自動釋放它依賴的其他資源的,因為有可能這些依賴資源還有其他的用處。所以使用者在釋放資源時經常會問我們,為什麼我都把資源釋放了,記憶體佔用還是居高不下?原因就是真正佔用記憶體的貼圖等基礎資源並不會隨著你釋放 Prefab 或者 SpriteAtlas 而被釋放。

接下來要介紹問題的另一個核心:JavaScript 中無法跟蹤物件引用。

在 JavaScript 這種指令碼語言中,由於其弱型別特性,以及為了程式碼的便利,往往是不包含記憶體管理功能的,所有物件的記憶體都由垃圾回收機制來管理。這就導致 JS 層邏輯永遠不知道一個物件會在什麼時候被釋放,這意味著引擎無法通過類似引用計數的機制來管理外部物件對資源的引用,也無法嚴謹得統計資源是否不再被需要了。基於以上的原因,目前 cc.loader 的設計實際上是依賴於使用者根據遊戲邏輯管理資源,使用者可以決定在某一時刻不再需要某些資源以及它依賴的資源,立即將它們在 cc.loader 中的快取釋放。也可以選擇在釋放依賴資源的時候,防止部分共享資源被釋放。下面是一個簡單的示例:

[javascript] view plain

相關推薦

cocoscreator獲取載入資源

動態載入 Asset Creator 提供了 cc.loader.loadRes 這個 API 來專門載入那些位於 resources 目錄下的 Asset。和 cc.loader.load 不同的是,loadRes 一次只能載入單個 Asset。呼叫時,你只要傳入相對 resources

Cocos Creator中獲取載入資源(官方文件摘錄)

Cocos Creator 有一套統一的資源管理機制 ,在本篇教程,我們將介紹資源的分類如何在 屬性檢查器 裡設定資源動態載入 Asset動態載入 Raw Asset資源的分類目前的資源分成兩種,一種叫做 Asset,一種叫做 Raw Asset。AssetCreator 提

egret 全屏, 載入資源, 以及回撥函式

1, 有時候在手機瀏覽器中因為有  虛擬按鍵以及標題欄, 使得即便設定了全屏也沒有辦法變成全屏, 但是好像JS 中有方法向瀏覽器請求全屏 2, 載入資源, 關閉後解除安裝, 第二次再進來的時候依然很快, 這是因為瀏覽器有快取 3, egret的回撥函式十分的隨便, 帶引數的回撥函式

cocos2dx中載入圖片資源的方法,從記憶體中獲取已經載入的圖片資源的方法 以及釋放問題

遊戲中通常需要將常用的資源如:聲音,圖片,plist檔案,提前載入進記憶體,以加快遊戲的流暢度 1.預載入聲音: SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3"); 載入之後就可以

一般方式ajax方式從後臺獲取資料載入進網頁

1,普通方法無非就是先訪問相應servlet拿到資料,存到request域中,跳轉到jsp頁面,通過jsp標籤遍歷拿到資料,前面的文章提到了點選開啟連結。 2,若想通過某些規則校驗表單資料,沒有訪問資料庫,jquery是你不二選擇,點選跳轉到jquery表單校驗外掛 3,通過aj

動態載入資源簡析實踐

本文所引用的原始碼為Android 6.0版本 Resources建立過程 getResources()呼叫過程 在Activity中我們經常使用getResources()來獲取Resources。拿到這個物件之後,我可以通過它獲取apk中的

使用GDI +載入JPGPNG資源的CGdiPlusBitmap類

介紹 最近我需要顯示一些JPG和PNG檔案。我有一箇舊版的LeadTools和這兩種格式的開源庫,但希望我的可執行檔案儘可能的小。所以我決定給GDI +一個嘗試。我很快發現GDI +設計不好,非常古怪,但它對我的目的很好,直到我發現我的恐懼,GDI +無法載入儲存為資源的JPG或PNG影象! 像我相信,

【NLP】Python NLTK獲取文字語料詞彙資源

作者:白寧超 2016年11月7日13:15:24 摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Name

javascript獲取動態載入圖片的寬度高度?

html: <imgsrc="loading.gif"loadsrc='xxx.jpg'id='test'/> javascrpt: var im =newImage();im.src = $('#test').attr('loadsrc');$

資料儲存,資源管理載入

資料儲存PlayerPrefs 遊戲存檔作用:在遊戲會話中儲存和訪問遊戲存檔。儲存路徑:Mac OS X: ~/Library/Preferences/Unity/WebPlayerPrefsWindows: %APPDATA%\Unity\WebPlayerPrefs一個

獲取載入dll路徑應用程式執行目錄

獲取程式路徑和獲取載入模組路徑 DWORD GetModuleFileName(HMODULE hModule,LPTSTR lpFilename,DWORD nSize); 函式引數說明: hModule HMODULE 裝載一個程式例項的控制代碼。如果該引數為NULL,

Assetbundle打包、載入提取資源的方式

打包AB的方式 注意:unity2017和5.X的版本API已經不一樣了,一個AB包裡可以有多個資源> BuildPipeline.BuildAssetBundles 會把所有標記的資源打包到指定目錄 一般情況下,我們會打包到Stream

spring boot 載入資源路徑配置classpath問題

1、spring boot預設載入檔案的路徑: /META-INF/resources/ /resources/ /static/ /public/ 我們也可以從spring boot原始碼也可以看到: priva

webView獲取連結後的url載入經過處理後的HTML

webview是android比較重要和常用的控制元件,網路上很多相關內容,在此介紹下WebViewClient比較少見的操作: 我們獲取WebView裡面連結別的網頁的url地址 private class MyWebViewClient extends WebViewC

(萊昂氏unix原始碼分析導讀-39)inode“資源”的獲取釋放

                                              by cszhao1980 iget()函式用於獲取inode資源,它有2個引數,裝置號和inode id。前面說過,通過這兩個引數 會唯一確定一個inode。簡單的說,該函式的作

easyui的tree節點的獲取選中

urn -m selected -a XML target ref easy pre 1.設置選中tree的節點 var node = $(‘#tt‘).tree(‘find‘, 1);//找到id為”tt“這個樹的節點id為”1&ld

可重入鎖的獲取釋放須要註意的一點兒事

style 能夠 public 獲取 post 不能 lock stat exec 什麽是可重入鎖,不可重入鎖呢?"重入"字面意思已經非常明顯了,就是能夠又一次進入。可重入鎖,就是說一個線程在 獲取某個鎖後,還能夠繼續獲取該鎖,即同意一個線程多次獲取同一個鎖。比方syn

前端數據處理:參數的獲取組織發送

字符 字符串 div ren pri 其他 發送 其中 處理 1.var t = $(this); 當前DOM節點為開始 2.var uid = t.parent("dd).attr("perid"); 利用jquery獲取當前DOM節點父子,兄弟的屬性值 3."<d

redis入門(3)redis的配置獲取修改

配置 daemonize rip require str 無限 文件的操作 idf master 一、Redis 配置 Redis 的配置文件位於 Redis 安裝目錄下,文件名為 redis.conf。 你可以通過 CONFIG 命令查看或設置配置項。 二、使用配置 1、

【小程序】獲取微信 自帶的 收貨地址獲取整理

code blog itl ucc success span .info toa pan 1、wx.chooseAddress(OBJECT) if(wx.chooseAddress){ wx.chooseAddress({ success: function (r