精华内容
下载资源
问答
  • "cocos2d.h" USING_NS_CC ; class ReloadeResouce: public Layer {   public :     static Scene * createScene();     virtual bool init();     CREATE_FUNC ( ReloadeResouce );   void ...

    //

    //  ResourceReload.hpp

    //  HelloCocos

    //

    //  Created by LXBig on 17/5/8.

    //

    //


    #ifndef ResourceReload_hpp

    #define ResourceReload_hpp


    #include <stdio.h>

    #include <iostream>

    using namespace std;

    #include "cocos2d.h"

    USING_NS_CC;

    class ReloadeResouce:public Layer {

        

    public:

        

        static Scene* createScene();

        

        virtual bool init();

        

        CREATE_FUNC(ReloadeResouce);

        void loadingCallback(Ref* pSender);//加载一张图片完成后跳转的回调函数

        

        void gotoNewLayer();//加载完后的跳转函数

        private:

        cocos2d::ProgressTimer* loadProgress;//进度条

        

        Label* percentLabel;//加载进度label

        Label* loadLabel;//显示 loading: label

        

        int m_numSp;//要加载的资源数目

        int m_loadedSp;//一经加载的资源数目

        

        

    };


    #endif /* ResourceReload_hpp */

    //

    //  ResourceReload.cpp

    //  HelloCocos

    //

    //  Created by LXBig on 17/5/8.

    //

    //


    #include "ResourceReload.hpp"

    Scene* ReloadeResouce::createScene()

    {

        auto scene = Scene::create();

        auto layer = ReloadeResouce::create();

        scene->addChild(layer);

        return scene;

        

    }


    bool ReloadeResouce::init()

    {

        if (!Layer::init()) {

            return false;

        }

        

        

        m_numSp = 100;

        m_loadedSp = 0;

        


        Size visibleSize = Director::getInstance()->getVisibleSize();

        Point origin = Director::getInstance()->getVisibleOrigin();

        

        loadLabel = Label::createWithSystemFont("Loading:","Arial",20);//创建显示Loading: label

        loadLabel->setPosition(Point(visibleSize.width/2-30,visibleSize.height/2+30));

        this->addChild(loadLabel,10);

        

        percentLabel = Label::createWithSystemFont("0%","Arial",20);//创建显示百分比的label

        percentLabel->setPosition(Point(visibleSize.width/2+35,visibleSize.height/2+30));

        this->addChild(percentLabel,2);

        

        

        auto loadBg = Sprite::create("Back.png");//进程条的底图

        loadBg->setPosition(Point(visibleSize.width/2,visibleSize.height/2));

        this->addChild(loadBg,1);

        

        loadProgress = ProgressTimer::create(Sprite::create("loadingbar1.png"));//创建一个进程条

        loadProgress->setBarChangeRate(Point(1,0));//设置进程条的变化速率

        loadProgress->setType(ProgressTimer::Type::BAR);//设置进程条的类型

        loadProgress->setMidpoint(Point(0,1));//设置进度的运动方向

        loadProgress->setPosition(Point(visibleSize.width/2,visibleSize.height/2));

        this->addChild(loadProgress,100);

        

        

        

        //加载一百次图片

        for (int i = 1; i <= m_numSp; i++) {

    //        char str[30];

    //        sprintf(str, "shop_lan%d.png",i);

    //        cout<<str<<endl;

            //纹理缓冲,addImageAsync函数是加载一次调用一次函数

            Director::getInstance()->getTextureCache()->addImageAsync("haha.jpg", CC_CALLBACK_1(ReloadeResouce::loadingCallback, this));

        }

        

        

        

        

        

        

        return true;

    }

    void ReloadeResouce::loadingCallback(Ref* pSender)

    {

        ++m_loadedSp;//每进到这个函数一次,让m_loadedSp + 1

        

        char buf_str[16];

        //%为转义符号

        sprintf(buf_str,"%d%%",(int)(((float)m_loadedSp / m_numSp)*100 ));

        percentLabel->setString(buf_str);//更新percentLabel的值

        

        float newPercent = ((float)m_loadedSp)/((float)m_numSp)*100;//计算进度条当前的百分比

        //因为加载图片速度很快,所以就没有使用ProgressTo

        //或者ProgressFromTo这种动作来更新进度条

        loadProgress->setPercentage(newPercent);//更新进度条

        

        //图片加载完成后

        if(m_loadedSp == m_numSp)

        {

    //        this->removeChild(loadProgress);//将添加的几个对象删除掉

    //        this->removeChild(percentLabel);

    //        this->removeChild(loadLabel);

            

            //加载完既要跳转到gotoNewLayer,在这里可以

            //创建新的Scene,新的Layer,或者其他什么乱七八糟的

            this->gotoNewLayer();

        }

    }

    void ReloadeResouce::gotoNewLayer()

    {

        auto size = Director::getInstance()->getWinSize();

        

        auto sp = Sprite::create("haha.jpg");//用之前加载到缓存中的图片,创建一个精灵。

        sp->setPosition(Point(size.width/2,size.height/2 - 80));

        this->addChild(sp,1);

    }









































    展开全文
  • 有一个异步加载资源的函数,CCTextureCaChe里的,去找一下吧,addImageAsny类似的。。。 也可以自己用一个线程来加载,然后回调主线程的方法[performOnMainThread.....]大概是这样,有一段时间没写obj c了.......
    有一个异步加载资源的函数,CCTextureCaChe里的,去找一下吧,addImageAsny类似的。。。
    
    也可以自己用一个线程来加载,然后回调主线程的方法[performOnMainThread.....]大概是这样,有一段时间没写obj c了....不好意思,提供一思路,自己实现去吧。
    展开全文
  • cocos2d-x异步加载plist

    2013-11-11 09:41:14
    cocos2d-x异步加载plist cocos2d-x v2.2.0
  • cocos2d-x图片异步加载

    2015-07-04 09:45:41
    [转]cocos2d-x图片异步加载  (2014-07-08 08:29:04) 转载▼ 标签:  it 分类: 学术 原文地址:http://www.fusijie.com/blog/2013/11/11/play-cocos2dx-23/ cocos2d-x中和...

    [转]cocos2d-x图片异步加载

      (2014-07-08 08:29:04)
    标签: 

    it

    分类: 学术
    原文地址: http://www.fusijie.com/blog/2013/11/11/play-cocos2dx-23/

    cocos2d-x中和Android,Windows都一样,如果在主线程中处理一些耗时操作,那么主线程就会出现阻塞现象,表现在界面上就是卡住,未响应等情况。为了避免这种情况的出现,我们需要在后台开辟工作线程进行数据的处理,再采用消息传递或者其他形式来通知主线程进行UI变化。最常见的情况就是游戏进入前的loading。

    1.图片的异步加载

    在多线程和同步的第一篇介绍到使用pthread库的时候,讲到由于CCAutoreleasePool不是线程安全的,所以不能在工作线程中引入cocos2d-x相关的API(其实并不是所有的API都不能使用)。但是cocos2d-x显然考虑到这个问题了,所以它本身就帮我们封装好了一个API,避免了还要手动引入pthread库的尴尬。

    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使用同步的方式生成了纹理,也就是在主线程中进行了耗时的加载操作。

    //...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(); } else { CCLOG("cocos2d: Couldn't create texture for file:%s in CCTextureCache", path); } } while (0); } //...释放资源,返回纹理

    (2)addImageAsync

    addImageAsync则是在工作线程中加载图片,然后通过调度器进行纹理的转换。

    //创建工作线程用于后台加载图片 pthread_create(&s_loadingThread, NULL, loadImage, NULL); //创建调度队列,用来根据已加载的图片进行纹理转换 CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CCTextureCache::addImageAsyncCallBack), this, 0, false); void CCTextureCache::addImageAsyncCallBack(float dt) { //... CCTexture2D *texture = new CCTexture2D(); //开辟纹理空间 #if 0 //TODO: (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) texture->initWithImage(pImage, kCCResolutioniPhone); #else texture->initWithImage(pImage); //使用CCImage初始化纹理 #endif #if CC_ENABLE_CACHE_TEXTURE_DATA VolatileTexture::addImageTexture(texture, filename, pImageInfo->imageType); #endif //...将加入autorelease,进行加载后的回调函数的调用,释放相关资源 }

    2.2.plist加载的原理

    之前使用plist是这样子的:

    void CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist)//传入plist文件即可

    在它的实现中,发现了这么一句:

    CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(texturePath.c_str());

    原来addSpriteFramesWithFile会先查找是否存在纹理,否则会在.plist的目录下寻找同名图片,然后调用同步的addImage函数来生成纹理。这也就是为什么只加载了plist,而纹理就会存在的原因了。

    2.3.异步加载plist

    知道了这些,那就让addSpriteFramesWithFile调用异步的addImageAsync函数就可以了,当然不需要改源码,因为CCSpriteFrameCache还提供了如下的plist加载方式:

    void CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)

    所以我们可以手动异步生成纹理后,在回调函数中和.plist一起传入addSpriteFramesWithFile,搞定!还记得刚开始的selector么?生成的纹理会作为参数传入这个回调函数中,完美!

    2.4.注意

    只要注意一点的是,在使用任何plist中的小图片时,引擎并不会为每一张小图片生成一个纹理,而是共用了大图片的纹理,同时指定了小图片的坐标和长宽。

    3.示例

    其中ui_text.png是大图片,raffle_b_friend.png和raffle_b_diamond.png是两张小图片。

    bool CTestLayer::init() { bool bRet=false; do { CC_BREAK_IF(!CCLayer::init()); //addImage or addImageAsync中创建纹理 CCTextureCache::sharedTextureCache()->addImageAsync("ui_text.png",this,callfuncO_selector(CTestLayer::showSprite)); bRet=true; } while (0); return bRet; } void CTestLayer::showSprite(CCObject* obj) { CCTexture2D* texture_ui_text=(CCTexture2D*)obj;//传入的obj即是异步生成的纹理 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui_text.plist",texture_ui_text);//通过纹理和.plist文件加入CCSpriteFrameCache CCSprite* raffle_b_friend=CCSprite::createWithSpriteFrameName("raffle_b_friend.png");//尽情使用小图片吧 raffle_b_friend->setPosition(ccp(100,100)); this->addChild(raffle_b_friend); //错误,只能获取ui_text.png的纹理 //CCTexture2D* raffle_b_diamond_texture=CCTextureCache::sharedTextureCache()->textureForKey("raffle_b_diamond.png"); //正确,可以用这种先获取精灵帧,再从精灵帧中获取ui_text的纹理,以及大小,来构建CCSprite CCSpriteFrame* raffle_b_diamond_spriteframe=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("raffle_b_diamond.png"); CCTexture2D* texture=raffle_b_diamond_spriteframe->getTexture(); CCRect rect=raffle_b_diamond_spriteframe->getRect(); CCSprite* raffle_b_diamond=CCSprite::createWithTexture(texture,rect); //如果纹理需要旋转,setRotation吧 raffle_b_diamond->setRotation(false); raffle_b_diamond->setPosition(ccp(300,100)); this->addChild(raffle_b_diamond); }
    展开全文
  • Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的“死循环”,一旦某一帧遇到了“大活儿”,比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿...
  • 数据存储单例类 CCTextureCache 有一个字典m_pTextures , 其中key是文件名, 数据是cocos2d-x的纹理类指针CCTexture2D* .异步加载数据队列 保存 AsyncStruct*(需要加载文件和回调信息)的 s_pAsyncStructQueue 队列. ...

    数据存储

    单例类 CCTextureCache 有一个字典m_pTextures , 其中key是文件名, 数据是cocos2d-x的纹理类指针CCTexture2D* .

    异步加载数据队列

    • 保存 AsyncStruct*(需要加载文件和回调信息)的 s_pAsyncStructQueue 队列.
    • 保存ImageInfo*(加载后图片信息) 的s_pImageQueue队列 .

    异步加载接口 addImageAsync

    • 若初次调用 , 则启动加载线程 loadImage
    • 将图片和回调信息保存pushs_pAsyncStructQueue

    加载线程

    循环 :
    * 从 s_pAsyncStructQueue 队列中top 一个需要加载的文件信息.
    * 加载文件数据
    * 将加载的数据pushs_pImageQueue队列

    异步加载回调函数 addImageAsyncCallBack

    • s_pImageQueue队列中top加载后数据.
    • 利用数据创建纹理类
    • 将纹理加入m_pTextures .

    简略图示 :

    异步加载流程

    展开全文
  • 移除 Cocos2D 初始化的异步特性,支持更结构化的资源加载机制。 通过不代表开发人员做出假设和决定,让开发人员获得更多自由。 在目前的情况下,我们必须谦虚和低要求,以便: Typescript to JavaScript 编译...
  • Cocos2d-js异步图片加载

    2014-11-12 13:19:00
    这里说的是在需要的使用加载图片,比如游戏中的某个关卡的...这种方式加载资源要用到cc.loader官方文档上有介绍(http://www.cocos2d-x.org/docs/manual/framework/html5/v3/cc-loader/zh),主要有 loadJs load...
  • cocos2d-x异步加载图片

    2016-02-16 16:30:46
    1、将图片通过TexturePacker打包成plist和png或.pvr.ccz(加密)文件 2、将需要加载的图片路径存入集合paths...Director::getInstance()->getTextureCache()->addImageAsync(paths[i]+".png", [=](Texture2D*){ SpriteF
  • Cocos2d-3.10 使用Curl异步下载文件(断点续传)
  • Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结 CocoaChina会员2014-08-07 10:36:017284 次阅读 本章只分享一下异步加载的逻辑,如有不对的地方还望大家及时指出。 目前我代码中需要异步加载的...
  • 转载自:http://cn.cocos2d-x.org/tutorial/show?id=1277 本章只分享一下异步加载的逻辑,如有不对的地方还望大家及时指出。 目前我代码中需要异步加载的资源一共有四类: 1.png,单个png的情况...
  • cocos2d-x 2.2.1异步加载图片

    千次阅读 2013-12-04 14:48:36
    bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(!CCLayer::init()); CCTextureCache::sharedTextureCache()->addImageAsync("CloseNormal.png", th
  • [cocos2d]cocos2D性能优化

    2017-04-23 13:09:08
    cocos2D性能优化 常用的设计模式:  单例模式:    委托模式:  观察者模式 C++的内存管理:  内存分配区域:  动态分配内存: Ref内存管理: 其他类型的内存管理: 性能优化工具:   图片与纹理...
  • 本节书摘来异步社区《Cocos2D-X游戏开发技术精解》一书中的第1章,第1.8节,作者: 刘剑卓 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.8 Cocos2D-X引擎的体系 Cocos2D-X游戏开发技术...
  • 使用cocos2d-x的人应该都知道CCTextureCache类中有个异步加载
  • quick-cocos2d-x与cocos2d-x + lua 调研 1. 前言 调研的目的是为新的游戏项目选择的技术方向,本文将主要以介绍quick为主,因为quick其实就是用cocos-lua,只是在上层框架有扩展而已,把扩展的部分直接去掉...
  • 本节书摘来异步社区《Cocos2D-X游戏开发技术精解》一书中的第1章,第1.2节,作者: 刘剑卓 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 Cocos2D-X引擎的来历 Cocos2D-X游戏开发技术...
  • Cocos2d-x预加载图片和动画资源
  • cocos2d-x中的图片异步加载机制

    千次阅读 2016-04-03 22:33:33
    3.X版本的cocos2d-x使用C++11标准,最新的C++11标准引入了对线程的原生支持,下面对其做简单介绍。在C++11标准中可以使用std::thread来快速创建一个线程:  void threadFunc1(){  std::cout "threadFunc1:\t...
  • Cocos2d-x教程(36)-多线程与异步加载

    千次阅读 2014-11-22 18:23:36
    Cocos2d-x 多线程与异步加载
  • 项目中摘抄出来的代码,在LoadingLayer::onEnter()中,开了一个boost thread来加载资源
  • Cocos2d-x Lua】异步任务工具类

    千次阅读 2014-12-02 09:55:39
    Cocos2d-x Lua 异步任务工具类 多线程的使用
  • Cocos2d-x 3.0多线程异步资源加载

    万次阅读 2014-07-10 14:53:12
    Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的“死循环”,一旦某一帧遇到了“大活儿”,比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现...
  • 这个系列我们主要学习Cocos2d-x Lua,总结Lua开发过程中所涉及的知识点,以及在开发过程中如何使用Cocos Code IDE。这一篇讲解Lua 异步任务工具类。 思路 实现思路 1.使用pthread库,封装一个用于执行异步任务的...
  • 4.CocosStudio导出的.ExportJson后缀的动画文件 再重复一遍加载机制:所有的资源是按序加载的,不可同时加载多个文件。执行异步加载的处理肯定是写在void update(float f)中,做到按帧加载。 1.png
  • Cocos2d-x3.3RC0的多线程与异步加载

    千次阅读 2014-11-25 12:40:35
    Cocos2d-x是一个单线程的引擎,引擎mei'yi'zhen
  • 本文TextureCache类异步加载功能的代码抽出,总共代码就200多行,感兴趣可以看看。 研究这个主要是因为项目中需要异步插入数据,但之前的方法在Android上总是崩溃所以想到TextureCache有异步加载的功能就将其抽出了...
  • cocos2d-x使用了些第三方开源库,用于支持文件解压、图片解析、网络支持、视频音频等功能;此外,cocos2d-x封装了些与平台无关的接口,如文件加载、纹理解析、线程操作等。 渲染系统是cocos2d-x的核心部分,包含了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,702
精华内容 2,680
关键字:

cocos2dx异步