使用RenderWare如何加密解密已经放出去的贴图
2006-06-18 13:52
856 查看
我们目前这个项目,因为某些原因,不能使用SFS,Single File System,单文件系统。如果用SFS的话就不需要担心资源加密了。对于一般用户来说,放出去的资源,比如dff,anm,rws,用户都不知道如何查看这些东西,但是贴图呢,如果没有加密,用ACDSee就可以看了,这样,有些不太想让用户知道的东西,比如过几天要推的新商品,就被他们提前知道长什么样了。
要解密一张加密过贴图,一般的做法是从磁盘中读进来,以二进制方式,然后解密,再把结果写回磁盘,然后使用RwTextureRead,因为这时候RenderWare才认得贴图文件的格式,Read进来以后再把结果删掉,防止被用户看见。整个过程需要2次磁盘读,1次磁盘写,1次文件删除,忒慢了,将load资源的过程整整加长了大约2倍,玩家会忍受不了的。
我从RenderWare Support找过相关的咨询,最后决定使用文件系统,就是挂接一个新的内存文件系统进去,专门加密解密贴图。整个过程是这样:一般example运行的时候会先做一件事情,就是调用RwImageRegisterImageFormat来注册贴图的RW函数,对于png格式来说,一般是RtPNGImageRead和RtPNGImageWrite 。先把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。这么说是因为我们在项目中使用了RWA(RenderWare Audio),RWA的一些程序需要调用RtFSManagerSyncAllFiles,这个函数会sync所有文件系统上的所有函数,通过调用各个FileSystem的sync函数,如果sync函数为NULL,就挂了。
PS:我们用的贴图一般都是png格式,png是无损压缩的,放出去的时候一般都是减色至256色,用的工具是pngquant。还有一个工具叫pngcrush,可以减小png文件的大小,好像也是减色的,具体我忘了:(,可以去sourceforge上下到。如果程序减色的结果不好,可以让美术手动减色。
要解密一张加密过贴图,一般的做法是从磁盘中读进来,以二进制方式,然后解密,再把结果写回磁盘,然后使用RwTextureRead,因为这时候RenderWare才认得贴图文件的格式,Read进来以后再把结果删掉,防止被用户看见。整个过程需要2次磁盘读,1次磁盘写,1次文件删除,忒慢了,将load资源的过程整整加长了大约2倍,玩家会忍受不了的。
我从RenderWare Support找过相关的咨询,最后决定使用文件系统,就是挂接一个新的内存文件系统进去,专门加密解密贴图。整个过程是这样:一般example运行的时候会先做一件事情,就是调用RwImageRegisterImageFormat来注册贴图的RW函数,对于png格式来说,一般是RtPNGImageRead和RtPNGImageWrite 。先把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。这么说是因为我们在项目中使用了RWA(RenderWare Audio),RWA的一些程序需要调用RtFSManagerSyncAllFiles,这个函数会sync所有文件系统上的所有函数,通过调用各个FileSystem的sync函数,如果sync函数为NULL,就挂了。
PS:我们用的贴图一般都是png格式,png是无损压缩的,放出去的时候一般都是减色至256色,用的工具是pngquant。还有一个工具叫pngcrush,可以减小png文件的大小,好像也是减色的,具体我忘了:(,可以去sourceforge上下到。如果程序减色的结果不好,可以让美术手动减色。
相关文章推荐
- 如何使用Base64进行加密和解密
- Linux如何使用GPG(GNU Privacy Guard)对信息/文件进行加密和解密
- 如何在浏览器端加密——使用Javascript加密解密
- 如何使用C#加密解密XML文档
- Java:如何使用Cipher类对字符串进行加密解密
- 如何使用CryptoJS配合Java进行AES加密和解密
- 如何使用Base64进行加密和解密
- 在Nginx已经配置ssl加密后如何使用tomcat
- 如何使用Qt加密解密类库 QCA (Qt Cryptographic Architecture)
- 如何使用 Visual C# 加密和解密文件
- 如何使用 Visual C# 加密和解密文件
- 如何使用 Visual C# 加密和解密文件
- 如何在Linux下使用GPG(GnuPG)加密及解密
- sql server中如何对已经加密的数据进行解密?谢谢回答!!
- [愚翁专栏]如何使用Base64进行加密和解密
- 如何使用 Visual C# 加密和解密文件
- 如何使用 Visual C# 加密和解密文件
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 如何使用 Visual C# 加密和解密文件
- 如何使用C#加密解密XML文档