首页 > 代码库 > JSBinding+Bridge:逻辑代码中操作二进制数据

JSBinding+Bridge:逻辑代码中操作二进制数据

以这2个函数为例

class File
{
    public static byte[] ReadAllBytes(string path);
    public static void WriteAllBytes(string path, byte[] data);
}

 

如果不做特殊处理,ReadAllBytes在返回数据给Js时,是一个字节一个字节拷贝给Js的数组。这样性能是极差的。并且,大多数情况下,逻辑代码中不需要直接修改2进制数据,而只是拿着而已。

因此,不要直接使用上面的2个函数。

 

以下是一个可选方案。

1. 首先在框架代码中实现一个 byte[] 的包装类:

public class ByteArray
{
    public ByteArray(int length = 0)
    {
        bytes = new byte[length];
    }
    public ByteArray(byte[] bytes_)
    {
        bytes = bytes_;
    }

    public byte[] bytes;
    public int Length
    {
        get
        {
        return bytes != null ? bytes.Length : 0;
        }
    }
    public static void Copy(ByteArray src, ByteArray dst, int len)
    {
        Array.Copy(src.bytes, dst.bytes, len);
    }
    public static void Copy(ByteArray src, int spos, ByteArray dst, int dpos, int len)
    {
        Array.Copy(src.bytes, spos, dst.bytes, dpos, len);
    }
}

 

2. 把 ByteArray 填写到 JSBindingSettings.classes 数组里导出

3. 针对带 byte[] 参数,以及返回值为 byte[] 的函数,手写出另一个版本,把 byte[] 都改为 ByteArray ,例如上面的2个函数手写后,变成:

class FileEx // 类名改一下
{
    public static ByteArray ReadAllBytes(string path)
    {
        byte[] data =http://www.mamicode.com/ File.ReadAllBytes(path);
        return new ByteArray(){bytes = data};
    }
    public static void WriteAllBytes(string path, ByteArray byteArray)
    {
        File.WriteAllBytes(path, byteArray.bytes);
    }
}

 

4. 把 FileEx 填写到 JSBindingSettings.classes 数组里导出

5. 在逻辑代码中,涉及到 byte[] 的,一律使用 ByteArray 的版本。例如,下面的代码读出一个文件的2进制数据,再写到另一个文件中去(逻辑代码对byte[]的使用就是典型的中转作用而已)

ByteArray data = http://www.mamicode.com/FileEx.ReadAllBytes("D:/1.png");
FileEx.WriteAllBytes("D:/2.png", data);

 

返回:JSBinding+Bridge.NET:Unity游戏热更新方案

JSBinding+Bridge:逻辑代码中操作二进制数据