赞 | 0 |
VIP | 0 |
好人卡 | 1 |
积分 | 0 |
经验 | 3404 |
最后登录 | 2017-9-13 |
在线时间 | 784 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 48
- 在线时间
- 784 小时
- 注册时间
- 2013-1-4
- 帖子
- 1102
|
3楼
楼主 |
发表于 2015-10-23 01:37:28
|
只看该作者
- #--------------------------------------------------------------------------
- # ● 核心部分,bitmap的快速Marshal
- #--------------------------------------------------------------------------
-
- class Font
- def marshal_dump;end
- def marshal_load(obj);end
- end
- class Bitmap
- # 传送到内存的API函数
- RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
- RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
- def _dump(limit)
- data = "rgba" * width * height
- RtlMoveMemory_pi.call(data, address, data.length)
- [width, height, Zlib::Deflate.deflate(data,0)].pack("LLa*") # 压缩
- end
- def self._load(str)
- w, h, zdata = str.unpack("LLa*"); b = new(w, h)
- RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4); b
- end
- # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
- #
- def address
- buffer, ad = "xxxx", object_id * 2 + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
- end
- end
- #--------------------------------------------------------------------------
- # ● pack模块
- #--------------------------------------------------------------------------
- module Pack
- class << self
-
- def pack(name,table)
- File.open("#{name}.pak", "wb"){|f| Marshal.dump(table,f);f.close}
- end
-
- def read(name)
- File.open("#{name}.pak","rb"){|f| return Marshal.load(f);f.close}
- end
- end
- end
复制代码 代码很简单。。。打开文件dump就行
打算设计一个包的格式,一个包本质上是个数组。然后存储bitmap和一些其他信息。。。。RM那种序列图考分割来实现对于大小不规整的来说不好处理【可以附个配置文件之类的记录坐标之类的】如果是一个pak包的话可能会比较好处理一些。
嗯,配合下面的脚本,会把一整个文件夹内的png图片全部打包成一个pak包- path = #文件路径
- packname = #pack包名
- pak = []
- Dir.entries(path).each do |i|
- if i[/.png/] then
- bitmap = Bitmap.new("#{path}/"+i)
- pak.push([i,bitmap])
- end
- end
- Pack.pack(name,pak)
复制代码 现在有两个方面的问题。一个是生成的pak包的大小,基本就是原文件的两倍。。。ORZ还有就是读取速度。还是太慢了,而且好像也不稳定的样子【同一个包多次读取时间浮动比较大
@MeowSnow 貌似你要的东西也不用等那么久的样子QAQ
@寒冷魔王 你这个坑货让你帮我处理的那个dll为何完全没有音信的样子。。。orz |
|