Project1

标题: 所谓RPG::Cache [打印本页]

作者: 面粉    时间: 2009-7-15 04:28
标题: 所谓RPG::Cache
本帖最后由 面粉 于 2009-7-15 10:44 编辑

默认@cache.class == Hash,key.class == String
默认脚本的毛病:
1、键值大小写敏感,但File和Filetest模块大小写不敏感
2、键值包含文件扩展名

这两个毛病会导致同样一个类型的缺憾:文件名不同,但是内容完全相同的位图,可能会在内存中生成完全一样,但是地址不同的两个拷贝,导致内存资源浪费,比如 ABCDEFG.png和Abcdefg.png。

解决办法
1、文件名称统一downcase或者upcase
2、利用File模块的方法剔除扩展名

具体怎么改我就不贴了,能看明白以上内容的自己就能改出来。 - -b
当然,如果你游戏开发的全程能够保持一致的文件名称标准,那么也可以不用修改。

另外发现一点,我归纳的可能不是很准确:
对于封装的类和模块,如果用alias对其方法进行修改,一定要加入方法是否已被定义的判断,否则alias被执行第二次的时候会产生一个无效的loop,致使堆栈过深,从而程序异常退出。

完毕。
作者: IamI    时间: 2009-7-15 08:10
其一,Cache本来就是哈希表,释放资源由GC完成,通常单人作业不会出现图片重复的现象
其二,不一定要加入。只要你把名字写的够稀奇古怪够长没人想得到就行,这也是发布脚本时最后常常干的事情
作者: 紫苏    时间: 2009-7-15 10:47
本帖最后由 紫苏 于 2009-7-15 10:48 编辑

1、Windows 环境下,路径也是大小写不敏感的,ABCDEFG.png 和 Abcdefg.png 不可能同时存在于一个目录下

2、确实需要,面粉说的是在不同的脚本定义了相同函数别名时的解决方法,但这并不是唯一导致问题的可能~当按下 F12 后,alias 语句再次被执行,仍然可能引起栈过深异常,详见:
http://szsu.spaces.live.com/blog/cns!D57D0E50BE1820CF!156.entry
作者: 面粉    时间: 2009-7-15 10:53
本帖最后由 面粉 于 2009-7-15 11:04 编辑

2# IamI

其一,Cache本来就是哈希表,释放资源由GC完成,通常单人作业不会出现图片重复的现象
其二,不一定要加入。只要你把名字写的够稀奇古怪够长没人想得到就行,这也是发布脚本时最后常常干的事情 ...
IamI 发表于 2009-7-15 08:10



Ruby的GC效率不高,而且GC只有在Cache被重新指向一个空哈希的时候才会开始,否则只有结束游戏进程或者单独对图片调用dispose才可以将资源释放。位图在内存中展开是相当占用空间的,所以还是应当从结构上来避免因为大小写或扩展名导致的资源浪费,毕竟不是所有人都能够把文件命名的标准做得很好。另外,把名字起得古怪稀奇,实际从编程的角度来讲是相当不利于程序的可读性。而且这也不是我所说的问题 - -b
所以还是应当起的通俗明白。
作者: IamI    时间: 2009-7-15 11:01
难到你不dispose吗?(惊讶状)
另外我喜欢old_函数名_脚本名_附加字符,应该不会有重的吧= =
F12 aliasBug,确实。
作者: 面粉    时间: 2009-7-15 11:12
本帖最后由 面粉 于 2009-7-15 11:14 编辑
1、Windows 环境下,路径也是大小写不敏感的,ABCDEFG.png 和 Abcdefg.png 不可能同时存在于一个目录下

2、确实需要,面粉说的是在不同的脚本定义了相同函数别名时的解决方法,但这并不是唯一导致问题的可能~当按下 ...
紫苏 发表于 2009-7-15 10:47


1、脑子有点那啥了 - -b  把这点忘记了OTZ
2、早点看到就好了,也不至于自己忙活半天…… - -bbbbbbbb  部落格什么的……最……最讨厌了 匿……我这里就是因为按下F12的时候会出错才忙活的…… - -bbbbbbbbbbbbbb
作者: 后知后觉    时间: 2009-7-15 13:45
把F12屏蔽掉……
作者: 面粉    时间: 2009-7-15 14:33
本帖最后由 面粉 于 2009-7-15 14:42 编辑
难到你不dispose吗?(惊讶状)
另外我喜欢old_函数名_脚本名_附加字符,应该不会有重的吧= =
F12 aliasBug,确实。
IamI 发表于 2009-7-15 11:01


1、你根本没看明白我在说什么。sigh,假设你犯糊涂,向文件夹内拷贝了两个名字都为a的文件,但扩展名不同。然后你分别加载了这两个a.png和a.bmp,两者内容一样,那么你在事件中只能dispose一个,而写脚本的时候你只记得加载了一个a.png。那么内存中仍然留有一个拷贝。我所说的就是从程序的结构上防止出现这种错误。应当保证缓存内容的唯一性。
2、alias所谓的F12问题只有在另命名一个封装的方法时才会频繁发生(比如Bitmap类的dispose方法),如果你重命名的只是一个在脚本内有定义的方法(一次),那么是不会出现这种错误的。(我怀疑是F12不会重建封装类模块的结构)另外一个出现这种错误的情况就如紫苏的Blog所言,其他情况下你再怎么按F12也是不会出错的。而且这也不能说是Bug,毕竟不是程序本身的问题,而是你自定义的结构问题。

另外楼上说屏蔽F12就有点那啥了……有点掩耳盗铃的味道 - -bbbbbbb




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