Project1

标题: 求帮测试ORZ [打印本页]

作者: 墨凌羽    时间: 2015-10-22 21:35
标题: 求帮测试ORZ
https://rpg.blue/forum.php?mod=viewthread&tid=87968
不知为何这个bitmap的Marshal,dump/load没问题。但是先dump,再写入外部文件,然后再读取load就会报错。。。。【dump format error for symbol(0x45)
OEZ
作者: 英顺的马甲    时间: 2015-10-23 00:43
我是来消除零回复的

虽然我没试过,但是会不会是因为文件打开的方式不是wb或者rb?==
作者: 墨凌羽    时间: 2015-10-23 01:37
  1. #--------------------------------------------------------------------------
  2. # ● 核心部分,bitmap的快速Marshal
  3. #--------------------------------------------------------------------------

  4. class Font
  5. def marshal_dump;end
  6. def marshal_load(obj);end
  7. end

  8. class Bitmap
  9. # 传送到内存的API函数
  10. RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  11. RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  12. def _dump(limit)
  13. data = "rgba" * width * height
  14. RtlMoveMemory_pi.call(data, address, data.length)
  15. [width, height, Zlib::Deflate.deflate(data,0)].pack("LLa*") # 压缩
  16. end
  17. def self._load(str)
  18. w, h, zdata = str.unpack("LLa*"); b = new(w, h)
  19. RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4); b
  20. end
  21. # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  22. #
  23. def address
  24. buffer, ad = "xxxx", object_id * 2 + 16
  25. RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
  26. RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
  27. RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
  28. end
  29. end
  30. #--------------------------------------------------------------------------
  31. # ● pack模块
  32. #--------------------------------------------------------------------------
  33. module Pack
  34.   class << self
  35.    
  36.     def pack(name,table)
  37.       File.open("#{name}.pak", "wb"){|f| Marshal.dump(table,f);f.close}
  38.     end
  39.   
  40.     def read(name)
  41.       File.open("#{name}.pak","rb"){|f| return Marshal.load(f);f.close}
  42.     end

  43.   end
  44. end
复制代码
代码很简单。。。打开文件dump就行
打算设计一个包的格式,一个包本质上是个数组。然后存储bitmap和一些其他信息。。。。RM那种序列图考分割来实现对于大小不规整的来说不好处理【可以附个配置文件之类的记录坐标之类的】如果是一个pak包的话可能会比较好处理一些。
嗯,配合下面的脚本,会把一整个文件夹内的png图片全部打包成一个pak包
  1. path = #文件路径
  2. packname = #pack包名
  3. pak = []
  4. Dir.entries(path).each do |i|
  5.   if i[/.png/] then
  6.     bitmap = Bitmap.new("#{path}/"+i)
  7.     pak.push([i,bitmap])
  8.   end
  9. end
  10. Pack.pack(name,pak)
复制代码
现在有两个方面的问题。一个是生成的pak包的大小,基本就是原文件的两倍。。。ORZ还有就是读取速度。还是太慢了,而且好像也不稳定的样子【同一个包多次读取时间浮动比较大
@MeowSnow 貌似你要的东西也不用等那么久的样子QAQ
@寒冷魔王 你这个坑货让你帮我处理的那个dll为何完全没有音信的样子。。。orz
作者: MeowSnow    时间: 2015-10-23 12:39
墨凌羽 发表于 2015-10-23 01:37
代码很简单。。。打开文件dump就行
打算设计一个包的格式,一个包本质上是个数组。然后存储bitmap和一些其 ...

(っ´ω`c) 噫,为啥会涉及大小不规整的部分,都说了平均分割就可以了~
作者: MeowSnow    时间: 2015-11-28 14:03
话说突然发现,VIP菊苣已经写过自动识别行走图帧数的脚本了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1