在lua中,如果是使用http来请求的是字节流的数据
那么在cocos2dx v3.3中 需要使用xmlhttprequest这个类
在处理获取的字节流数据时,首先需要转化字节流为字符串,转换的方法是:string.char
local response = xhr.response -- 获得返回数据
for i = 1,size do
byteData = byteData..string.char(response[i])
end
这个办法的特点是一个字符一个字符的处理。还有一个批量处理的方法。那就是使用unpack方法。
local response = xhr.response -- 获得返回数据
byteData = byteData..string.char( unpack(response))
这种批量处理的方式的好处是,能够批量处理,速度较快。
但是这样处理还有一个缺点,那就是看网上说一次最大只能处理10k的数据,也就是长度为10000个字节的数据
而且在我的游戏这种长度是不够的,我需要处理的是40000左右字节的数据
苦思冥想之后,想到的办法是:首先把response的数据分块,分块之后,对每一块进行转化成数据,然后在合成一个完整的字符串。
在这个过程中,一定要注意数据的完整性。
下面这段代码是分成10块进行分别处理的
local part = 10
local partData = ""
local startIndex = 1
local partIndex,endIndex1 = math.modf(size/part)
local endIndex = partIndex
print(" endIndex is "..endIndex)
print(" endIndex1 is "..endIndex1)
for i=1,part do
local partUnPack = string.char(unpack(response,startIndex,endIndex))
startIndex = startIndex + partIndex
endIndex = endIndex + partIndex
partData = partData..partUnPack
print(" startIndex is "..startIndex)
print(" 解码 i is "..i.." time is "..os.time())
end
local rest = size % part --求余数
-- print(" rest is "..rest)
-- print("startIndex is "..startIndex)
local restData = ""
for i=1,rest do
restData = restData..string.char(response[startIndex+i-1])
end
-- print("the datalen is "..(startIndex+rest).." the size is "..size)
-- print("restData "..restData)
partData = partData..restData
partData的数据就是最后的结果。
性能分析:
在windows上面,40000字节的数据需要5秒的时间,而使用unpack之后,就几乎不需要时间。顺利通过了。