作者:Miliardo
为了加速数据存取,Kirikiri内部使用了缓存机制。
AutoPath、图片、ks等资源都在缓存的范围内。
很可惜的,因为对于AVG来说文件名对应的文件一般是唯一的,所以这个缓存的机制为此进行了优化。
拥有一个高效的缓存机制本来应该是好的事情,为什么说很可惜呢?
这种优化造成的负面效果是,如果文件在运行期间改动的话,可能无法正常读取到新的文件……Orz
如果你用Storages.removeAutoPath删除了一个包的自动访问,也许你下次访问资源的时候还是会自动检索到那个包中。
因为Kirikiri优先检索缓存中的包片段信息,而不是当前系统的Autopath。
如果你读取了一边图片,然后在没有关闭Krkr的时候修改这幅图片。重新打开的时候你会发现现实的图片还是修改前的。
那么,怎么解决这个问题呢?
解决方法自然一定是存在的。
如果说缓存不能够手工清除,那么这个就不是不方便,而可以被判为Bug了。
Krkr的System类中,有一个用来压缩内存使用量,释放不需要的缓存的函数。这就是我们在外部文件修改了之后必须进行的操作。
下面是现场翻译的文档,from Kirikiri2 Doc(参考:
TJS2 ドキュメント ):
------------------------------------------------------
System.doCompact
机能/意义
压缩内存使用量
类型
System类的方法
原型
doCompact(level=clAll)
参数
level:指定压缩等级
指定clIdle的话,将进行和系统空闲的时候进行的内存整理同样的操作。即进行TJS内部的垃圾收集(GC)。
指定clDeactivate的话,将进行和吉里吉里不是活动窗口的时候进行的内存整理一样的操作。现版本将清空层计算用的临时图像缓存、层缓存、xp3压缩包的片段缓存、自动检索路径的缓存。
指定clMinimize 的话,将进行和吉里吉里最小化的时候进行的内存整理一样的操作。对于现版本,将清除图像缓存、文字描绘的缓存、
指定clAll 的话,将执行上面的所有操作。
内存压缩的层次按照clIdle
------------------------------------------------------
如同文档所说,因为通常吉里吉里会自动进行这类操作,所以一般不必要在这方面特别注意。但是吉里吉里并不是为了外部数据会经常被更改的情况设计的,所以遇到需要处理经常变化的数据的状况的话就可以使用这种“非常规”手段。