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方案。 避免了线程问题,同时又使得图形有机会渲染,保证了进度条的更新和防止画面假死。

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

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/p/3811890.html

时间: 2025-01-18 18:28:52

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

什么是.Net的异步机制(异步Stream读写)

异步的Stream读/写操作 下面是继承于System.IO.Stream的类 System.IO.Stream Microsoft.JScript.COMCharStream System.IO.BufferedStream System.IO.FileStream System.IO.MemoryStream System.IO.UnmanagedMemoryStream System.Security.Cryptography.CryptoStream System.Printing.Pr

在dotnet中如何使用资源

如何使用资源文件 -------------------------------------------------------------------------------- 摘要.NET 中有一套非常完善的地方化系统被定义在 System.Resources 名字空间中.不过大多数人都被 MissingManifestResourceException 这个错误困惑着.本文就是要让大家了解什么是资源文件,它有什么用处以及如何正确的调用从而避免一些"奇怪"的错误,包括 Missin

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分

编程|网络|异步 ///////////////////////////////////////////////////////////////////////////////////////////* 标题:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分 当看到.NET中TcpListener和TcpClient的时候,我非常高兴,那就是我想要的通讯模式但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们. 下面提供了一些类,可以

Lua中的文件I/O操作教程

  这篇文章主要介绍了Lua中的文件I/O操作教程,是Lua入门学习中的基础知识,需要的朋友可以参考下 Lua中I/O库用于读取和处理文件.有两种类型的文件操作,在Lua即隐含文件的描述符和明确的文件描述符. 对于下面的例子中,我们将使用一个示例文件test.lua,如下图所示. 代码如下: -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用下面的语句. 代码如下: file = io.open (filename [, mode]) 各种文

Lua中计算、执行字符串中Lua代码的方法

  这篇文章主要介绍了Lua中计算.执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下 一.Lua中执行字符串 运行过程中有个问题,我有个字符串,是一个数学表达式,如何计算这个字符串表达式的值呢? 比如,local param = "7*100", 我需要的结果其实是700,但是怎么样直接计算出这个值呢?方法如下 字符串前面 加个 "return" 然后loadstring以后得到一个functio

Android 开发中利用异步来优化运行速度和性能

本文讲的是Android 开发中利用异步来优化运行速度和性能, 我们知道,在Android框架中提供了很多异步处理的工具类.然而,他们中大部分实现是通过提供单一的后台线程来处理任务队列的.如果我们需要更多的后台线程的时候该怎么办呢? 大家都知道Android的UI更新是在UI线程中进行的(也称之为主线程).所以如果我们在UI线程中编写耗时任务都可能会阻塞UI线程更新UI.为了避免这种情况我们可以使用 AsyncTask, IntentService和Threads.在之前我写的一篇文章介绍了An

Lua中的文件I/O操作教程_Lua

 Lua中I/O库用于读取和处理文件.有两种类型的文件操作,在Lua即隐含文件的描述符和明确的文件描述符. 对于下面的例子中,我们将使用一个示例文件test.lua,如下图所示. 复制代码 代码如下: -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用下面的语句. 复制代码 代码如下: file = io.open (filename [, mode]) 各种文件模式列示于下表中.  隐文件描述符 隐文件描述符使用标准输入/输出模式,或使用单

Lua中计算、执行字符串中Lua代码的方法_Lua

一.Lua中执行字符串 运行过程中有个问题,我有个字符串,是一个数学表达式,如何计算这个字符串表达式的值呢? 比如,local param = "7*100", 我需要的结果其实是700,但是怎么样直接计算出这个值呢?方法如下 字符串前面 加个 "return" 然后loadstring以后得到一个function 然后执行获得700的返回值,这样通过转化,得到的结果如下: 二.以字符串形式执行Lua代码 有时候,我们在代码中希望能够动态的切换上下文,改变程序的处理

Lua中的一些常用函数库实例讲解_Lua

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