cocoscreator獲取和載入資源
動態載入 Asset
Creator 提供了 cc.loader.loadRes
這個 API 來專門載入那些位於 resources 目錄下的 Asset。和 cc.loader.load
不同的是,loadRes
一次只能載入單個 Asset。呼叫時,你只要傳入相對 resources 的路徑即可,並且路徑的結尾處不能包含副檔名。
- // 載入 Prefab
-
cc.loader.loadRes("test assets/prefab", function (err, prefab) {
- var newNode = cc.instantiate(prefab);
- cc.director.getScene().addChild(newNode);
- });
- // 載入 AnimationClip
- var self = this;
- cc.loader.loadRes("test assets/anim", function (err, clip) {
- self.node.getComponent(cc.Animation).addClip(clip, "anim");
- });
-
// 載入 SpriteAtlas(圖集),並且獲取其中的一個 SpriteFrame
- // 注意 atlas 資原始檔(plist)通常會和一個同名的圖片檔案(png)放在一個目錄下, 所以需要在第二個引數指定資源型別
- cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
- var frame = atlas.getSpriteFrame('sheep_down_0');
- sprite.spriteFrame = frame;
- });
載入獨立的 SpriteFrame
圖片設定為 Sprite 後,將會在 資源管理器 中生成一個對應的 SpriteFrame。但如果直接載入 test
assets/image
- // 載入 SpriteFrame
- var self = this;
- cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {
- self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
- });
如果指定了型別引數,就會在路徑下查詢指定型別的資源。當你在同一個路徑下同時包含了多個重名資源(例如同時包含 player.clip 和 player.psd),或者需要獲取“子資源”(例如獲取 Texture2D 生成的 SpriteFrame),就需要宣告型別。
資源釋放
loadRes
載入進來的單個資源如果需要釋放,可以呼叫 cc.loader.releaseRes
,releaseRes
可以傳入和 loadRes
相同的路徑和型別引數。
- cc.loader.releaseRes("test assets/image", cc.SpriteFrame);
- cc.loader.releaseRes("test assets/anim");
此外,你也可以使用 cc.loader.releaseAsset
來釋放特定的 Asset 例項。
- cc.loader.releaseAsset(spriteFrame);
動態載入 Raw Asset
Raw Asset 可以直接使用 url 從遠端伺服器上載入,也可以從專案中動態載入。對遠端載入而言,原先 Cocos2d 的載入方式不變,使用 cc.loader.load 即可。對專案裡的 Raw Asset,載入方式和 Asset 一樣:
[javascript] view plain copy- // 載入 Texture,不需要字尾名
- cc.loader.loadRes("test assets/image", function (err, texture) {
- ...
- });
cc.url.raw
Raw Asset 載入成功後,如果需要傳給一些 url 形式的 API,還是需要給出完整路徑才行。你需要用 cc.url.raw
進行一次
url 的轉換:
- // 原 url 會報錯!檔案找不到
- var texture = cc.textureCache.addImage("resources/test assets/image.png");
- // 改用 cc.url.raw,此時需要宣告 resources 目錄和檔案字尾名
- var realUrl = cc.url.raw("resources/test assets/image.png");
- var texture = cc.textureCache.addImage(realUrl);
資源批量載入
cc.loader.loadResDir
可以載入相同路徑下的多個資源:
- // 載入 test assets 目錄下所有資源
- cc.loader.loadResDir("test assets", function (err, assets) {
- // ...
- });
- // 載入 sheep.plist 圖集中的所有 SpriteFrame
- cc.loader.loadResDir("test assets/sheep", cc.SpriteFrame, function (err, assets) {
- // assets 是一個 SpriteFrame 陣列,已經包含了圖集中的所有 SpriteFrame。
- // 而 loadRes('test assets/sheep', cc.SpriteAtlas, function (err, atlas) {...}) 獲得的則是整個 SpriteAtlas 物件。
- });
載入遠端資源和裝置資源
在目前的 Cocos Creator 中,我們支援載入遠端貼圖資源,這對於載入使用者頭像等需要向伺服器請求的貼圖很友好,需要注意的是,這需要開發者直接呼叫 cc.loader.load
。同時,如果使用者用其他方式下載了資源到本地裝置儲存中,也需要用同樣的
API 來載入,上文中的 loadRes
等 API 只適用於應用包內的資源和熱更新的本地資源。下面是這個 API 的用法:
- // 遠端 url 帶圖片字尾名
- var remoteUrl = "http://unknown.org/someres.png";
- cc.loader.load(remoteUrl, function (err, texture) {
- // Use texture to create sprite frame
- });
- // 遠端 url 不帶圖片字尾名,此時必須指定遠端圖片檔案的型別
- remoteUrl = "http://unknown.org/emoji?id=124982374";
- cc.loader.load({url: remoteUrl, type: 'png'}, function () {
- // Use texture to create sprite frame
- });
- // 用絕對路徑載入裝置儲存內的資源,比如相簿
- var absolutePath = "/dara/data/some/path/to/image.png"
- cc.loader.load(absolutePath, function () {
- // Use texture to create sprite frame
- });
目前的此類手動資源載入還有一些限制,對使用者影響比較大的是:
- 遠端載入不支援圖片檔案以外型別的資源(已在 1.5/1.6 支援計劃中)
- 這種載入方式只支援 raw asset 資源型別,不支援 SpriteFrame、SpriteAtlas、Tilemap 等資源的直接載入和解析(需要後續版本中的 Assets Bundle 支援)
- 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 +載入JPG和PNG資源的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