cocos2dx 异步加载csb游戏开始时道具加载的实现

一、前提:
完成Hello Game项目的创建编译。
具体参考:
二、本篇目标:
l& 分析proj.win32工程的主要构成
l& 分析proj.android工程的主要构成
l& 新建一个MyScene.cpp然后在游戏中显示出来
l& 在android真机上运行查看效果
三、分析:
我们游戏开发通常是这样的,首先在Microsoft Visual Studio 2012中proj.win32工程编写代码并且在windows上调试运行,当游戏主体开发完成后,进行so文件的编译打包,然后继续在eclipse的proj.android工程中编写少量的代码完成游戏在android平台下的打包开发。
l& 分析proj.win32工程的主要构成
用Microsoft Visual Studio 2012打开proj.win32工程
整个hellogame的解决方案由hellogame、libbox2d、libcocos2d、libSpine四个工程项目构成。
1、Hellogame工程:游戏主工程,我们开发工作主要在这个工程中完成
2、libbox2d工程:模拟2D刚体物体的C++物理引擎,大名鼎鼎植物大战僵尸、愤怒的小鸟等游戏均有这个引擎的功劳
3、libcocos2d工程:这个不用说了,整个cocos2dx核心
4、libSpine工程:工具软件支持库
接下来主要对Hellogame工程的代码进行解析,libbox2d工程在后面的物理引擎篇的时候在进行讲解,至于其它2个工程在后续使用到的篇幅中在进行讲解。
Hellogame工程的源代码:
工程主要由src目录下的AppDelegate.cpp、AppDelegate.h、HelloWorldScene.cpp、HelloWorldScene.h四个源文件和win32目录下的main.cpp、main.h两个源文件组成。
src目录下的源文件是所有6个平台共用的代码文件,不管是android还是ios都使用这个目录下的源文件,属于真正跨平台部分的代码。
win32目录下的源文件只是一个main主入口文件,负责win32平台下对游戏的调用。其实在对应的proj.android的工程里也有一个android平台对应的main主入口文件,只是由于平台的不同实现代码也各有不同,但是目的一样。
AppDelegate.cpp源代码:
AppDelegate类似于android的Application的作用,提供一些应用程序级别的状态的回调,整个游戏应用程序由这个文件方法进行控制。下面是几个主要方法的说明和解释:
#include "AppDelegate.h"
#include "HelloWorldScene.h"
//命名空间宏,偷懒引入cocos2d的头文件
USING_NS_CC;
AppDelegate::AppDelegate() {
AppDelegate::~AppDelegate()
//设置 OpenGL context
//这个设置对所有平台都有效
void AppDelegate::initGLContextAttrs()
//设置 OpenGL context 属性,目前只能设置6个属性
//red,green,blue,alpha,depth,stencil
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};
GLView::setGLContextAttrs(glContextAttrs);
//当应用程序启动时执行,游戏程序启动入口
//在这里我们启动了第一个scene(场景)
//在具体游戏中通常在这里启动loading界面
//你的游戏从这里开始!
bool AppDelegate::applicationDidFinishLaunching() {
// 初始化 director
auto director = Director::getInstance();
auto glview = director-&getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director-&setOpenGLView(glview);
// 在屏幕上显示FPS数
// 开发阶段建议开启这个设置,可以通过这个对自己游戏性能有个大体了解
// 等游戏正式发布时关闭这个设置
director-&setDisplayStats(true);
// 设置 FPS数 默认值为 1.0/60
director-&setAnimationInterval(1.0 / 60);
// 创建一个HelloWorld的scene.这个是自动回收的对象
auto scene = HelloWorld::createScene();
// 告诉director运行HelloWorld的scene
director-&runWithScene(scene);
return true;
// 当游戏进入后台时会调用这个方法
// 比如玩游戏时按下android手机的home按键
// 比如当游戏时有电话打入直接显示来电界面
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()-&stopAnimation();
// 如果你的游戏使用了SimpleAudioEngine,必须在这里进行暂停
// 暂停代码如下:
// SimpleAudioEngine::getInstance()-&pauseBackgroundMusic();
// 当游戏恢复到前台运行时会调用这个方法
// 比如接电话结束是游戏界面又恢复到前台时
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()-&startAnimation();
// 如果你的游戏使用了SimpleAudioEngine, 必须在这里进行恢复
// 恢复代码如下:
// SimpleAudioEngine::getInstance()-&resumeBackgroundMusic();
上述代码解释中的提到的director(导演:负责游戏场景的显示切换等,像电影导演一样掌控整个电影的一切)、scene(场景:负责显示一个游戏场景,就像电影的一个场景镜头)。
上面代码中最重要的方法为applicationDidFinishLaunching(),因为你的游戏从这个方法开始!
HelloWorldScene.cpp源代码:
上面代码中在AppDelegate类的applicationDidFinishLaunching()方法中创建了一个HelloWorldScene的场景,并且运行这个场景,HelloWorldScene.cpp就是这个场景具体的代码实现。下面是几个主要方法的说明和解释:
#include "HelloWorldScene.h"
USING_NS_CC;
//创建场景
Scene* HelloWorld::createScene()
//创建一个自释放的场景对象
auto scene = Scene::create();
//创建一个自释放的画面层对象
auto layer = HelloWorld::create();
//把创建的画面层添加到场景中
//一个场景可以添加多个画面层
scene-&addChild(layer);
//返回这个创建的场景
// 场景初始化方法
bool HelloWorld::init()
// 1. 首先进行父类初始化
if ( !Layer::init() )
//如果初始化父类失败返回false
return false;
//获取整个手机可视屏幕尺寸
Size visibleSize = Director::getInstance()-&getVisibleSize();
//获取手机可视屏原点的坐标
Vec2 origin = Director::getInstance()-&getVisibleOrigin();
// 创建一个带图标的关闭按钮
// 点击后调用menuCloseCallback方法退出游戏
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
// 设置关闭按钮的显示位置
// 显示在可视屏幕的右下角
closeItem-&setPosition(Vec2(origin.x + visibleSize.width - closeItem-&getContentSize().width/2 ,
origin.y + closeItem-&getContentSize().height/2));
// 创建一个可自释放的菜单
auto menu = Menu::create(closeItem, NULL);
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//创建一个显示"Hello Game"文字的Label
auto label = Label::createWithTTF("Hello Game", "fonts/Marker Felt.ttf", 24);
// 设置label在屏幕中的显示位置
label-&setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label-&getContentSize().height));
// 把label添加到画面层
this-&addChild(label, 1);
// 创建一个带图片的精灵
auto sprite = Sprite::create("HelloWorld.png");
// 设置图片精灵的显示位置
sprite-&setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// 添加图片精灵到画面层
this-&addChild(sprite, 0);
return true;
// 退出按钮事件
void HelloWorld::menuCloseCallback(Ref* pSender)
//当是wp8或者winrt平台的时候
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
//结束Director
Director::getInstance()-&end();
//当是ios平台的时候退出
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
上述的代码是一个简单的Scene(场景)实现代码,当我们真正开发游戏时,其实就是制作一个一个的场景,并且通过Director进行调度组织构成一个完整的游戏。
l& 分析proj.android工程的主要构成
用eclipse打开proj.android工程
整个hellogame的相比win32的要简单多了,除了android项目必须的一些组成部分之外:
1、& Classes文件夹:这里面的源文件和上面proj.win32中的属于同一份共享。
2、& jni/hellocpp/main.cpp:这个相当于proj.win32中的win32目录下的源文件,主入口。
3、& libs/armeabi/libcocos2dcpp.so:这个是整个游戏代码的编译包,其实真正游戏代码实现都最终由C++文件编译打包成这个so类库供android代码调用运行游戏。
整个游戏的开发基本上不需要在eclipse中编写代码,android平台只需要调用编译好的so文件即可运行游戏,eclipse中只需要把包含了so文件的android工程打包成apk文件发布即可。
l& 新建一个MyScene.cpp然后在游戏中显示出来
用Microsoft Visual Studio 2012打开proj.win32工程,我们将在这个工程里新加一个自己的Scence(场景)并且显示出来。这个看着是个很简单的任务但是对新手来说还是会碰到很多困难,所以这里特别的做一下演示。
文件新建:cpp文件这里有2个新建方法,
1、第一种方式
第一步:在右边的解决方案资源管理器中右键src新建类。
问题:到这里你会发现&浏览&按钮不可以用,新建的cpp只能新建到目录hellogame\proj.win32下,这样会导致一个问题。
第二步:先不管这个我们按照提示继续点击&添加&进入类向导界面输入类名MyScene然后点击完成类的创建,这个时候在proj.win32目录下新加MyScene.cpp和MyScene.h两个文件。
2、第二种方式
第一步:在右边的解决方案资源管理器中右键src新建项
问题:到这里你会发现&浏览&按钮可以用,点击修改一下目录为hellogame\Classes下,而且需要选择是新建.ccp文件还是.h文件.
第二步:这里先选择.cpp类型然后输入MyScene.cpp然后完成创建,然后继续前面的步骤新建MyScene.h文件。这个时候在Classes目录下会出现新加的MyScene.cpp和MyScene.h两个文件。
代码编写:
MyScene.h:
#include "cocos2d.h"
class MyScene : public cocos2d::Layer
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(MyScene);
MyScene.cpp:
#include "MyScene.h"
USING_NS_CC;
Scene* MyScene::createScene()
auto scene=Scene::create();
auto layer=MyScene::create();
scene-&addChild(layer);
bool MyScene::init()
if(!Layer::init())
return false;
//获取整个手机可视屏幕尺寸
Size visibleSize = Director::getInstance()-&getVisibleSize();
//获取手机可视屏原点的坐标
Vec2 origin = Director::getInstance()-&getVisibleOrigin();
//创建一个显示"MyScene"文字的Label
auto label = Label::createWithTTF("MyScene", "fonts/Marker Felt.ttf", 24);
//设置白色
label-&setColor(Color3B::WHITE);
// 设置label在屏幕中的显示位置
label-&setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label-&getContentSize().height));
// 把label添加到画面层
this-&addChild(label, 1);
return true;
完成MyScene编写后,我们要先在游戏开启后的界面中添加一个按钮菜单点击后进入MyScene&场景。游戏开启后的界面场景是HelloWorldScene,所以我们需要在HelloWorldScene中添加一个按钮,并且为这个按钮添加一个点击启动MyScene的事件。
HelloWorldScene.h:
在这个文件中首先声明一个按钮点击事件:
//切换到下一个scene事件
void menuNextCallback(cocos2d::Ref* pSender);
HelloWorldScene.cpp:
1、首先引入MyScene.h
#include "HelloWorldScene.h"
#include "MyScene.h"
USING_NS_CC;
2、实现menuNextCallback事件代码
// 按钮点击事件,点击后启动MyScene
void HelloWorld::menuNextCallback(Ref* pSender)
//新建MyScene实例
auto scene = MyScene::createScene();
//用这MyScene实例替换当前scene
Director::getInstance()-&replaceScene(scene);
添加在屏幕上添加启动按钮
// 设置关闭按钮的显示位置
// 显示在可视屏幕的右下角
closeItem-&setPosition(Vec2(origin.x + visibleSize.width - closeItem-&getContentSize().width/2 ,
origin.y + closeItem-&getContentSize().height/2));
// 新建一个带图片的按钮菜单
auto goItem=MenuItemImage::create("next_1.png","next_2.png",
CC_CALLBACK_1(HelloWorld::menuNextCallback, this));
goItem-&setPosition(Vec2(origin.x + visibleSize.width/2 - closeItem-&getContentSize().width/2 ,origin.y/2 + closeItem-&getContentSize().height/2));
// 创建一个可自释放的菜单
auto menu = Menu::create(closeItem,goItem, NULL);
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
好了到此为止我们完成了所有代码的编写,现在开始调试运行查看一下效果。
这个时候如果你是用第二中方法创建的MyScene能正常编译运行而第一种方法创建的MyScene会发无法通过编译没办法运行会报如下错误:
IntelliSense: 无法打开 源 文件 "MyScene.h"&&&
error C1083: 无法打开包括文件:&MyScene.h&: No such file or directory
第一步:项目名点击右键属性
第二步:选择左边的C/C++然后在右边的附加包含目录追添加:;$(ProjectDir)
这个是我本人的附加包含目录,每个人环境不同应该有点区别
$(EngineRoot)cocos\audio\$(EngineRoot)$(EngineRoot)external\chipmunk\include\$(EngineRoot)..\C..;%(AdditionalIncludeDirectories) ;$(ProjectDir)
完成如上设置后在进行项目调试运行就能正常运行起来了,并且点击按钮后成功的显示MyScene的画面达到了我们设定的目标。
l& 在android真机上运行查看效果
要在android真机运行,首先需要进行so文件的打包编译。
第一步:如果上面的步骤中是按照第一种方法创建的MyScene那么请把MyScene.cpp、MyScene.h两个文件从proj.win32文件拷贝到Classes文件夹下。如果是按照第二种方法创建的MyScene那么可以忽略本步骤。
第二步:用EditPlus等文本编辑器打开proj.android\jni目录下的Android.mk文件,把MyScene.cpp添加到需要编译的源文件清单中然后保存,如下:
LOCAL_SRC_FILES := hellocpp/main.cpp \
&&&&&&&&&& ../../Classes/AppDelegate.cpp \
&&&&&&&&&& ../../Classes/HelloWorldScene.cpp \
& & & & & &../../Classes/MyScene.cpp
第三步:开启Cygwin开始编译打包so文件,如果不会请参考:Cocos2dx.3x_Hello Game项目创建篇
第四步:打包so文件成功后,然后开启eclipse打开游戏工程并且连接android手机运行工程看看真机运行的效果是否跟前面windows中的效果是否一样。
Cocos2d-x3.3入门三部曲到这里就算是完成了,接下来将以具体一个游戏为一个系列的方式继续深入实战,第一个实战系列为:《Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始》,这个系列总共有多少篇待定,目标是直到做完一个完整的符合上线标准的游戏为止绝非草草的练习之作。
作者交流QQ:
& & & & & &邮箱:
阅读(...) 评论()Cocos2DX UIListView 大量加载优化方案 - CSDN博客
Cocos2DX UIListView 大量加载优化方案
笔者最近开发一个游戏项目,需要对 UIListView 的加载速度做处理 —— 产品经理希望它可以快速加载100个Item,且不能有卡顿的感觉。那么,问题来了,怎么样才能使UIListView做到快速而不卡顿呢?
作为程序,只有我们知道技术的实现细节。我们知道,UIListView 是一个一个PushItem的,你急也没用。当时我试过了常规的三种方法,它们分别是:
滚动到底部再加载
方法1、2在实质上是一样的,都属于 延时加载 的范畴;方法3比较有趣,只有当 UIListView 监听到自己滑动到底部的时候才会去加载剩下的一部分,当然我们需要开启它的滑动监听。如果有需要,我会在之后介绍一下这三种常规做法,这里先不作议论。
诚然,当数量不多的时候(比如 &= 100),这三种常规方法的加载速度也算是无可厚非了。从速度上看,方法3 & 方法1 & 方法2;但从体验上看,方法1 & 方法2 & 方法3。这是因为方法3开始只会加载一小部分,所以你需要不停地滑动到底部、滑动到底部,直到将所有内容全部加载完毕,而方法1、2只要启动之后,就会按部就班地开始一条一条的加载。
当数量超过一定数值(可能 &= 100,主要看需要渲染和处理Item的数据大小)后,你会发现 UIListView 总是一顿一顿的,当你尝试滑动的时候,这种卡顿的感觉会尤其明显,这极其影响用户的体验。
当然,如果你足够细心和机警,你会发现造成卡顿至少有两层原因:
其一,数量太多,如果是1000条数据,就算0.001秒加载一条,也需要1秒才能全部加载完,你觉得用户可以接受1秒钟的卡顿吗?
其二,要渲染和处理的数据太多。在实际开发中,可不止加载这回事,你还得负责对每条 Item 要展示的数据进行初始化,而这个往往才是极其耗时的步骤;所以说实现上述0.001秒的目标也是有些难度的。
综述:UIListView加载Item大概做了两件事情:初始化和渲染。围绕这两点,可以对其展开优化。
节省初始化的时间:UIListView加载单纯的Layout速度是很快的,对渲染的消耗是很可观的。假设在加载一个Item的时候,用一个Layout去 包装 它,但对Item所包含的数据不进行初始化「当然,程序需要预留一个初始化Item数据的接口」,那么,UIListView加载的Item相当于只有Layout,这样可以大大地节省掉初始化的时间。
节省渲染的时间:对UIListView可视区域内的Item予以初始化,而非可视区域内的Item则不提供初始化和渲染。
如何操作初始化?
原理处已经提到,由程序预留初始化接口,当Item进入可视区域时再执行初始化。
如何减少渲染?
这里采用了简单粗暴的方式:显示和隐藏。当Item进入可视区域时显示,出了可视区域后隐藏。当然,如果有更好的办法,可以提出、讨论、一起实现「UIListViewTest.lua中也预留了释放Item资源的回调方法,目前为空回调」。
怎么提高加载速度?
如果数量不多,可以直接添加;如果是大数量级别,请使用延时加载或者每帧加载。
目前只实现了常用的 垂直 UIListView的加载方案;水平 的貌似没有这个需求,所以就不打算做了。毕竟,有哪个傻逼愿意水平滑动大量的item啊。
获得可视区域底部Item所在行数方法返回的值可能不是非常精准,在未想到更好的办法之前,如果遇到这种情况,请暂时手动调整;
经测试,在加载完可视区域内的Items后,OpenGL渲染的顶点数GL verts基本稳定在一定数值。当然,当可视区域内可容纳最大Item数量发生变化时,GL verts也会随之变化,比如顶部和底部各露出一小部分Item的情况。
Item的初始化可以放在UIListView滚动回调里完成,也可以自行完成,具体开发中可能会遇到各种奇怪奇葩的需求,这时候,请根据实际情况自行调整初始化战略。
代码传送门
查看原文:
本文已收录于以下专栏:
相关文章推荐
项目里面需要加载一个很大的地图,目测最少是的分辨率。
先不考虑什么引擎最大支持多大的图啊,大图加载效率啊等等这些问题,光是4k x 4k的分辨率,ARGB8888...
本节主要有3个类,LoadingScene,AnimatinoUtil和
原文地址:http://cn.cocos2d-x.org/tutorial/show?id=556
Cocos2d-x中和Android,Windows都一样,如果在主线程中处理一些耗时操作...
在一个游戏里面,需要用到的数据一般都是由游戏策划提供的(这里的策划还是由我自己担任啦哈哈)。什么是需要用到的数据?例如我创建一个角色A,A有他自己的攻击力,防御力,速度等,再创建一个角色B...
最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大...
游戏刚启动时,最常见的画面就是进度条了。而进度条展示的都是资源的加载进度。包括图片资源的。
cocos2dx引擎的整体流程都是基于单线程的,但是加载图片资源是个很耗时的操作,如果放在主线程中执行,...
要实现题目中的需求,网上的做法一般是开一个新线程
cocos2dx30alpha1加载cocostudio编辑的ui
UILayer* ul = UILayer::create();
this->addChild(ul, 0,...
Widget 有 addChild()
两个方法研究
最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大...
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)关于cocos2dx客户端程序的自动更新解决方案 - CSDN博客
关于cocos2dx客户端程序的自动更新解决方案
&转自:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)
& & & & 随着手机游戏的不断发展,游戏包也越来越大,手机网络游戏已经超过100M了,对于玩家来说,如果每次更新都要重新下载,那简直是灾难。而且如果上IOS平台,每次重新发包都要审核,劳神费力。所以当前的主流手游都开始提供自动更新的功能,在不改动C++代码的前提下,使用lua或者js进行业务逻辑开发,然后自动更新脚本和资源,方便玩家也方便研发者。
& & & &以前做端游的时候,自动更新是一个大工程,不仅要能更新资源和脚本,还要更新dll文件等,后期甚至要支持P2P,手游目前基本上都使用http方式。cocos2dx也提供了一个基础功能类AssetsManager,但是不太完善,只支持单包下载,版本控制基本没有。因此我决定在AssetsManager的基础上扩展一下这个功能。
& & & &先明确一下需求,自动更新需要做些什么?鉴于手游打包的方式,我们需要能够实现多版本增量更新游戏资源和脚本。明确设计思路,首先,服务器端,我们要要有一个版本计划,每一个版本和上一个版本之间的变化内容,打成一个zip包,并为之分配一个版本,然后将所有版本的信息放到http服务器上。然后,客户端程序启动的时候我们都需要读取服务器所有的版本信息,并与客户端版本进行比较,大于本地版本的都是需要下载的内容,将下载信息缓存起来,然后依次下载并解压,然后再正式进入游戏。
& & & &好了,我们先设计一下版本信息的格式吧!大家可以看看。
& & & 我们现在开始改造AssetsManager,首先定义下载任务的结构。
& & & &然后改造bool checkUpdate(),这里把服务器的版本内容解析出来,放到一个队列_versionUrls里面。
& & & &其次,改造void downloadAndUncompress(),把版本队里里面的任务取出来,下载解压,然后写本地版本号,直到版本队列为空。
& & & 再次,对lua进行支持,原来的方案是写了一个脚本代理类,但是写lua的中间代码比较麻烦,我采用了比较简单的方式,通常自动更新是全局的,所以自动更新的信息,我通过调用lua全局函数方式来处理。
& & & & 最后把UpdateEngine使用PKG方式暴露给lua使用,这个lua文件是app里面调用的第一个lua文件,里面没有任何游戏内容相关,游戏内容都从main.lua开始加载,达到更新完毕后在加载其他lua文件的目的。
& & & &好了,主要代码和思路以及给出来了,现在我们看看如何使用吧!
& & & &最后说明一点,需要把下载解压的目录加到文件搜索的最前面,保证cocos2dx优先加载解压的lua文件和资源。
本文已收录于以下专栏:
相关文章推荐
原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]
博客地址:http://blog.csdn.net/qq
能够进行热更新,是Lua脚本...
[cocos2dx 3.0 (二)] 多线程std::thread的使用 以及performFunctionInCocosThread函数
第一次动手弄热更新将这过程记录一下。1.热更新基本原理
这里先说一下热更新的基本原理
1)不能更新主程序,只能更新资源、lua等文件
c++生成的主程序如果变化只能通过下载升级包安装,而其它文件...
前言:游戏上线后,我们常常还会需要更新,如新增玩法,活动等,这种动态的更新资源我们称为游戏的热更新。热更新一般只适用于脚本语言,因为脚本不需要编译,是一种解释性语言,而如C++语言是很难热更新的,其代...
Cocos2d-3.10 使用Curl异步下载文件(断点续传)
CURL是cocos2dx推荐的网络传输库。它包括阻塞传输方式和非阻塞传输方式。在这里值用到了阻塞方式。
本文基于资源在线更新的工作内容讲了3个问题:
设置文件搜寻路径
文件对比方式
非阻塞传输在网络...
以前一直打算做这个功能,结果一直没做,最近抽了1天时间研究了下,怕以后又忘记,特意将一些注意事项写来下
版本为cocos2dx-3.9,
目前版本已经废除了以前的AssertManager,...
有的时候很多操作如果在cocos2dx的主线程中来调用,可能会极大地占用主线程的时间,从而使游戏的不流畅。比如在获取网络文件数据或者在数据比较大的游戏存档时,就需要使用多线程了。
网上的一些教程上是使...
热更新介绍
什么是热更新?
游戏客户端启动时,主动请求服务端检查版本号,并更新资源到本地。
应用场景:
情况一:游戏客户端已经发布了,但突然发现有个比较严重的bug需要修复。这时需要更新游戏的代...
Android里面有runOnUiThread,IOS下有performSelectorOnMainThread。
cocos2dx在3.0以上的版本中则可以用Scheduler::performF...
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 cocos2dx异步加载资源 的文章

 

随机推荐