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

原创 2006年06月18日 13:52:00

  我们目前这个项目,因为某些原因,不能使用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上下到。如果程序减色的结果不好,可以让美术手动减色。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

AES-128,192,256位加密解密,其中128位已经测试过

package com.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu...

Golang1.7.3使用标准库的AES加密解密不实用扩展协议

package mainimport ( "crypto/aes" "crypto/cipher" "fmt" )type tobytes struct { cip ...

iOS中使用RSA对数据进行加密解密

RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl...

关于Android中使用AES加密解密的问题

当你百度java怎么进行aes加密、解密时,会百度到很多这样的代码 代码一(部分): public static String encode(String key, String src) thr...

使用windows crypto API加密解密

本文转自: http://ticktick.blog.51cto.com/823160/168538      最近在学习使用windows crypto API 对数据进行加密和解密,有些收获和经验...

使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码

使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码   Oracle数据库系统自带的PL/SQL对象(包,存储过程,函数等)的代码绝大部分都是使用了wrap程...

使用JAVA对字符串进行DES加密解密

总的来说,代码大部分是从网上抄的,网上一搜就有很多类似的版本,但是没有一个是可以直接用的,所以做了一些改进,现在是比较完善的版本了。 网上的代码里,在密码加密那块,代码写错了,所以有严重的问题: ...

Java使用RSA加密解密签名及校验

由于项目要用到非对称加密解密签名校验什么的,于是参考《Java加密解密的艺术》写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享!RSA加密解密类:package com.ihep; ...

在Windows系统使用Gpg4win进行加密解密

GPG,又称为GnuPG,全称是Gnu Private Guard,即GNU隐私卫士。GPG是以PGP算法为核心的强大的加密软件。但GPG项目是一套命令行程序,而且是为 Linux 等开源操作系统设计...

使用DES加密解密的工具类

一个工具类,很常用,不做深入研究了,那来可直接用   DesUtil.java   package lsy; import java.security.Key; import jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)