内存加密结构

JEngine针对特定情况制作了内存加密结构

内存加密结构能干什么?

  • 防止内存修改(例如GG修改器)
  • 内存加密结构进行数学运算时:
    • 10次计算,加密结构耗时与原生无区别
    • 100次计算,加密结构耗时是原生1~3倍;
    • 1000次计算,加密结构耗时是原生18~20倍;
    • 10000次计算,加密结构耗时是原生19~21倍;
    • 100000次计算,加密结构耗时是原生19~21

compare

命名空间

  • using JEngine.AntiCheat;
    

API

  • AntiCheatHelper.OnMemoryCheatDetected(Action toDo); //如果被发现玩家有修改内存,执行toDo
    

请勿调用

  • AntiCheatHelper.OnDetected(); //该方法是内部方法,请勿调用!
    

支持类型

  • JBool 对应 bool
    
  • JChar 对应 char
    
  • JString 对应 string
    
  • JByte 对应 byte
    
  • JSByte 对应 sbyte
    
  • JShort 对应 short
    
  • JUShort 对应 ushort
    
  • JInt 对应 int
    
  • JUInt 对应 uint
    
  • JLong 对应 long
    
  • JULong 对应 ulong
    
  • JFloat 对应 float
    
  • JDecimal 对应 decimal
    
  • JDouble 对应 double
    

如何使用

和正常数值结构一样,直接使用

int a = 0;
JInt b = 1;
b++; //b会是2
b *= a; //b会是0
a++; //a会是1
b = a; //b也会是1

从上面的示范里,可以看到,内存加密数据结构会自动转换为正常结构,进行运算时也是如此

推荐写法

最简化JSON和Protobuf序列化的长度

    [ProtoBuf.ProtoContract]
    public class SafeData
    {
        //Use this format to serialize and deserialize safe data
        [global::ProtoBuf.ProtoMember(1)]
        private float realA;
        [global::ProtoBuf.ProtoMember(2)]
        private long realB;

        //Use this format to declare safe data
        public JFloat a;
        public JLong b;

        public SafeData()
        {
            a = realA;
            b = realB;
        }

        public void BeforeSerialize()
        {
            realA = a;
            realB = b;
        }
    }

需要在序列化前,调用BeforeSerialize(),这样一来可以最简化序列化长度。