原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html

前言

  问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住。

原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步。

想通过在lua中启动一个线程去加载资源,但lua是不支持多线程的,只有协程,但并不是真正意义上的多线程,只不过是函数间执行权的相互交换。

 解决思路:

  1. 把需要加载的资源的路径存放到一个CCArray中;
  2. 通过tolua++工具(查看tolua++工具的使用),在C++中绑定一个异步加载纹理的接口到lua中,该接口接收两个参数,参数一为CCArray(资源路径数组),参数二为int类型(lua回调函数)(点击查看C++回调Lua函数    
  3. 在绑定接口方法中迭代资源路径数组,使用CCTextureCache的addImageAsync方法加载纹理,当资源加载完成时回调lua方法

示例代码

1.编写绑定到Lua中异步资源加载接口类

AsynResLoader.h

#ifndef  _ASYNRESLOADER_H_
#define _ASYNRESLOADER_H_ #include "cocos2d.h" USING_NS_CC; //供Lua调用的异步的资源加载器
class AsynResLoader: public CCObject
{
private:
int count;
int total;
//lua回调方法
int mLuaCallback;
public:
//创建一个异步资源加载器
static AsynResLoader* create();
//异步加载纹理
void asynLoadTexture(CCArray* paths, int luaCallbck);
//加载回调
void callback(CCObject* pSender);
}; #endif

  
AsynResLoader.cpp

#include "AsynResLoader.h"
#include "CCLuaEngine.h" //创建一个异步资源加载器
AsynResLoader* AsynResLoader::create(){
AsynResLoader* instance = new AsynResLoader;
if (instance)
{
instance->autorelease();
return instance;
}
return NULL;
} //异步加载纹理
void AsynResLoader::asynLoadTexture(CCArray* paths, int luaCallback){
this->count = 0;
this->total = paths->count();
this->mLuaCallback = luaCallback; for(int idx = 0; idx <total; idx++)
{
const char* path = ((CCString*)paths->objectAtIndex(idx))->getCString();
CCLOG("asynLoadTexture PATH idx=%d : %s",idx,path);
CCTextureCache::sharedTextureCache()->addImageAsync(path, this, callfuncO_selector(AsynResLoader::callback));
}
} //纹理加载回调方法
void AsynResLoader::callback(CCObject*){
this->count++;
//当资源加载完成时,回调指定的lua函数
if (this->count >= this->total)
{
CCLOG("asyn load res completed..");
if (this->mLuaCallback)
{
CCLuaStack* pStack = CCLuaEngine::defaultEngine()->getLuaStack();
//第一个参数是函数的整数句柄,第二个参数是函数参数个数
pStack->executeFunctionByHandler(this->mLuaCallback,0);
pStack->clean();
CCLOG("call lua function..");
}
}
}

  

2.使用tolua++工具把类绑定到lua中(点击查看使用方法

3.在lua中创建资源路径数组,调用接口方法,把路径数组和回调函数传递进去

lua代码:

function asynLoadTexture(callback)
local pngs = CCArray:create()
-- Buff动画帧路径
for _, anim in ipairs(buff_anim_config.buff_anim_config) do
pngs:addObject(CCString:create(anim.png))
end
-- 技能动画帧路径
for k, anim in ipairs(skill_anim_config.skill_anim_config) do
pngs:addObject(CCString:create(anim.png))
end
AsynResLoader:create():asynLoadTexture(pngs,callback)
end

4.运行效果

实质就是lua调用C++方法实现异步加载资源。

  

cocos2d-x lua中实现异步加载纹理的更多相关文章

  1. cocos2dx 3.3 异步加载纹理

    这里以3d场景加载为例,2d情况类似. 先同步加载模型数据和尺寸缩小了100倍的贴图,创建mesh.然后异步加载所有精细纹理并每加载完一个就替换一个,并进入场景. 如此做法的效果是当刚进入场景时看到的 ...

  2. 【Cocos2dx3.x Lua】图片异步加载

    一.说明     异步加载就是把消耗程序时间比较大的加载操作放到其他线程中,待加载完毕后通过回调函数的方式通知主线程.   addImageAsync函数实现(Cocos2dx 3.3) Link:  ...

  3. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  4. listview中getview异步加载网络图片

    前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点 ...

  5. Android中ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  6. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...

  7. IOS中UITableView异步加载图片的实现

    本文转载至 http://blog.csdn.net/enuola/article/details/8639404  最近做一个项目,需要用到UITableView异步加载图片的例子,看到网上有一个E ...

  8. Unity中场景异步加载

    引入命名空间 using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; using Syst ...

  9. MVC中ztree异步加载

    var setting = { async: { enable: true, url: "*****/LoadChild", autoParam: ["id"] ...

随机推荐

  1. SOJ 2930_积木城堡

    [题意]若干个城堡,给定每个城堡的积木数及每块积木的棱长.从城堡中抽出积木使每块城堡高度相同,求最大高度 [分析]城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装 ...

  2. Codeforces Educational Round 21

    A =w= B qwq C wvw D(multiset) 题意: 有n(n<=1e5)个数,希望通过把一个位置y的数字放到位置x上这个操作,使得新序列的某个前缀和等于总和的一半,问这样的操作是 ...

  3. 记 SpringBoot1.* 转 Springoot2.0 遇到的问题

    1.拦截器问题 到2.0之后在配置文件中写 static-path-pattern: /static/** 已经不起作用(2.0需要在方法中配置) SpringBoot1.*写法 @Configura ...

  4. 纤程(FIBER)

    Indy 10 还包含对纤程的支持.纤程是什么?简单来说,它也是 一个“线程”,但是它是由代码控制的,而不是由操作系统控制的.实际上,可以认为线程 是一个高级纤程.纤程和 Unix 用户线程(Unix ...

  5. vue assetsPublicPath

    vue 中 /config/index.js,  assetsPublicPath 的作用是便于访问打包后的静态资源,默认是相对于根 /, 当然如果直接把dist文件夹当成根来配置域名 可以什么都不用 ...

  6. Android Api Demos登顶之路(四十五)Loader--&gt;Cursor

    这个demo演示了类载入器的用法.关于类载入器的使用我们在前面的demo中已经介绍过了 在此再小小的复习一下. 类载入器的使用步骤: * 1.获取类载入器的管理者LoaderManager manag ...

  7. Ajax 之 DWR

    DWR是开源框架,类似于hibernate.借助于DWR,开发人员无需具备专业的JavaScript知识就可以轻松实现Ajax,是Ajax更平民化. 添加jar包   dwr.jar   common ...

  8. 以太网接口TCP/IP协议介绍,说的很容易懂了

      以太网接口TCP/IP协议介绍,说的很容易懂了  TCP/IP协议,或称为TCP/IP协议栈,或互联网协议系列. TCP/IP协议栈(按TCP/IP参考模型划分) 应用层 FTP SMTP HTT ...

  9. [整理]EABI和OABI【转】

    本文转载自:https://www.crifan.com/order_eabi_and_oabi/ 1.什么是ABIABI,application binary interface (ABI),应用程 ...

  10. POJ2503 Babelfish map或者hash_map

    POJ2503 这是一道水题,用Map轻松AC. 不过,可以拿来测一下字符串散列, 毕竟,很多情况下map无法解决的映射问题需要用到字符串散列. 自己生成一个质数, 随便搞一下. #include&l ...