使用RenderWare如何加密解密已经放出去的贴图

  我们目前这个项目,因为某些原因,不能使用SFSSingle File System,单文件系统。如果用SFS的话就不需要担心资源加密了。对于一般用户来说,放出去的资源,比如dffanmrws,用户都不知道如何查看这些东西,但是贴图呢,如果没有加密,用ACDSee就可以看了,这样,有些不太想让用户知道的东西,比如过几天要推的新商品,就被他们提前知道长什么样了。

    要解密一张加密过贴图,一般的做法是从磁盘中读进来,以二进制方式,然后解密,再把结果写回磁盘,然后使用RwTextureRead,因为这时候RenderWare才认得贴图文件的格式,Read进来以后再把结果删掉,防止被用户看见。整个过程需要2次磁盘读,1次磁盘写,1次文件删除,忒慢了,将load资源的过程整整加长了大约2倍,玩家会忍受不了的。

    我从RenderWare Support找过相关的咨询,最后决定使用文件系统,就是挂接一个新的内存文件系统进去,专门加密解密贴图。整个过程是这样:一般example运行的时候会先做一件事情,就是调用RwImageRegisterImageFormat来注册贴图的RW函数,对于png格式来说,一般是RtPNGImageReadRtPNGImageWrite 。先把Read的函数替换掉,换成自己的函数,这样使用RwTextureRead的时候就会进自己的函数,这时候会传进来一个filename,把filename加上前缀,这个前缀就是新的文件系统的deviceName,可以把它叫做"Mem:"。举个例子,比如要读的贴图叫"data/GUI/aa.png",我们现在让它变成"Mem:/data/GUI/aa.png",再调用RtPNGImageRead,把新的文件名传给它,这个时候,新的内存文件系统就起作用了。在这个Mem FileSystem中,Open函数先把贴图以二进制格式读进来,判断它有没有被加密过,如果没有,则加密,否则在内存中解密,接下来图片解析过程都是Memory Read,因为属于这个FileSystem的文件都是通过这个FileSystem中的函数来RW的。这样没有被加密过的贴图会在第一次读到的时候被加密,以后再也不会加密,而加密过的贴图只需要一次磁盘Read

    文件系统的例子可以参考example下的pakfile,挂接一个文件系统需要程序提供很多函数,一些不用的函数最好也提供一下,函数体是空的就可以,比如sync,不要让它是NULL。这么说是因为我们在项目中使用了RWARenderWare Audio),RWA的一些程序需要调用RtFSManagerSyncAllFiles,这个函数会sync所有文件系统上的所有函数,通过调用各个FileSystemsync函数,如果sync函数为NULL,就挂了。

 PS:我们用的贴图一般都是png格式,png是无损压缩的,放出去的时候一般都是减色至256色,用的工具是pngquant。还有一个工具叫pngcrush,可以减小png文件的大小,好像也是减色的,具体我忘了:(,可以去sourceforge上下到。如果程序减色的结果不好,可以让美术手动减色。




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Unknowm/article/details/809918
个人分类: RenderWare
上一篇如何在RenderWare中复制Clump
下一篇关于《黑客反汇编揭密》一书中的一些错误
想对作者说点什么? 我来说一句

ce3如何使用PS输出贴图

2015年11月03日 24.76MB 下载

没有更多推荐了,返回首页

关闭
关闭