lua中实现异步资源读写

同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除。如果使用os.execute执行 rm -rf ooxx 是非常快的
但由于os.execute一旦报错,那整个lua进程就杯具了。于是,我们最后换成了lfs来进行目录遍历并逐个删除。
这样一来,文件数目如果过多,会等很久。于是想到使用异步的方式来处理。

一开始我尝试了lua的协程,我以为他和golang等语言中的一样。可以实现轻量级线程。
于是我做了一个简单的测试

h = coroutine.creat( function() for i=0,100000 do print("hahahahahaha") end end )
coroutine.resume(h)
print("oh yeah,i am here")

按我的期望是,最后这句话会在一堆hahahahaha中出现。 而实际上,是要等所有的hahahahaha打印完了,才出现。
协程看来不是我想像中的那货。

那又怎么办呢,引入线程? 刚刚返回的h就是一个thread
看来在lua中使用线程行不同,那如果用c++实现一个异步的等效函数,并提供一个监听呢。这样无疑是很ok的。
从唐门世界的更新模块中我发现它就是用java和oc分别实现的android和ios

这样下去,走太远了。
我们回过头来看看,我们之所以面临这个问题是因为,为了累加更新,我们的文件很小,没有打包。
基于这个特性我们可以想到,我们的单个文件删除的开销是极小的。
于是,我们可以采用如下技巧

遍历出所有要删除的文件放入一个table

在onEnterFRame中,一次处理一定数目的文件,直到全部处理完。

这个技巧对单个文件不大的项目非常有效,这个技巧源自我们公司的关卡pre loading方案。 避免了线程问题,同时又使得图形有机会渲染,保证了进度条的更新和防止画面假死。

此技巧在目前公司所有项目中都有使用,大家不用再纠结可行性了,大胆尝试吧。

lua中实现异步资源读写,布布扣,bubuko.com

时间: 2024-10-05 13:15:44

lua中实现异步资源读写的相关文章

cocos2d-x lua中实现异步加载纹理

原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住. 原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步. 想通过在lua中启动一个线程去加载资源

cocos2dx lua中异步加载网络图片,可用于显示微信头像

最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能会提供这个功能的地方,发现好像没有提供类似功能,那么只能自己动手写.所以我在ImageView这个类里面添加了一个成员方法,其实可以不写在ImageView里,而且我觉得非必需情况下还是不要修改引擎源码的好,因为如果源码改动比较多的话,将来引擎版本升级会比较麻烦.我写在ImageView里纯粹是想偷

《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通知所取代.异步通知类似于硬件上的"中断"概念,比较准确的称谓是"信号驱动的异步I/O". 9.1 异步通知的概念和作用 异步通知:一旦设备就绪,则主动通知应用程序,该应用程序无需查询设备状态 几种通知方式比较: 阻塞I/O :一直等待设备可访问后开始访问 非阻塞I/O:

Cocos2d-x 3.0多线程异步资源加载

Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的"死循环",一旦某一帧遇到了"大活儿",比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视频资

Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力

Cocos2d-x--iOS平台lua加密成luac资源方法和Jsc文件&lt;MAC平台开发试用--windows平台暂未研究&gt;

    首先要说,最近真的是太忙了,好久没写博客了,今天正好有空,就写一下最近在写游戏中的一些发现: 话说,基于Cocos2dx 引擎 + 脚本写游戏,至今的感触就是可以进行增量更新和即时编译等,节省了很多时间:好了废话不多说了,进入正题: 这里我是以Cocos2d-x-2.2.2 为例<其实,写着文章时候Cocos2d-x-3.2 都封版了>: 今天我就说一下怎么用Cocos2d-x3.2中的cocos-console 去 批量 加密lua脚本-变成luac文件 ,js文件变成jsc加密文

Lua语言基础汇总(13)-- Lua中一些常用的库

前言 这篇文章将会来一些比较轻松的内容,就是简单的介绍一下Lua中几个常用的库.简单的说就是几个API的介绍.所以说,看起来比较容易,也没有多大的分量.就是纯粹的总结.使用库就是为了方便我们的开发,提高开发效率,同时也能保证代码的质量.希望大家以后也不要重复造轮子了. 数学库 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 1. 三角函数(sin,cos,tan……) 所有的三角函数都使用弧度单位,可以用函数deg(角度)和rad(弧度)来转

Lua中的一些库(1)

[数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan--)所有的三角函数都使用弧度单位,可以用函数deg(角度)和rad(弧度)来转换角度和弧度.示例代码: print(math.sin(math.rad(30))) -- 0.5 谨记:三角函数的参数都是弧度,在实际使用中不要忘了,是弧度. 取整函数(floor,ceil) floor:返回不大于x的最大整数:向下取整:ceil:返回不小于x的最大整数

关于servlet3.0中的异步servlet

刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了,但是到现在,里边的一些东西还是没有能够好好地了解一下 最近在研究java的长连接,在了解jetty中的continuations机制的时候也重新了解了一下servlet3.0中的异步servlet机制,通过看几个博客,加上自己的一些测试,算是搞明白了一些,在这里记录一下: 在服务器的并发请求数量比