几年的Unity学习总结

本文是关于Unity游戏开发的学习总结,主要涵盖了文件读写、序列化、内存优化、多线程、资源管理等多个方面。重点讨论了如何安全地处理网络文件,使用FileStream进行文件操作,序列化数据结构,以及如何利用IsolatedStorage处理网络文件。文章还提到了内存优化策略,包括避免直接对网络文件操作,使用IsolatedStorage,以及在游戏开发中如何有效管理资源,如释放不再使用的对象,使用AssetBundle和Resources.UnloadUnusedAssets()。此外,还分享了Unity中处理多线程、日志调试、性能分析、版本更新和平台适配的技巧。
摘要由CSDN通过智能技术生成
stream:其中类Stream为抽象类。由此有三个派生类。 需要引入命名空间:using System.IO
MemoryStream:对内存进行读取与写入 


BufferedStream:对缓冲器进行读取/写入 


FileStream:对文件执行读取与写入 


TextReader/Writer为抽象类。由此派生类: 


StreamReader/StreamWirter 分别用于对流的读取与写入。


public abstract int Read(byte[] buffer, int offset, int count)


buffer: 字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 offset 和 (offset + count -1) 之间的值由从当前源中读取的字节替换。
offset: buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。
count: 要从当前流中最多读取的字节数。
返回值:读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。此方法的实现从当前流中读取最多的 count 个字节,并将它们存储在从 offset 开始的 buffer 中。流中的当前位置提升已读取的字节数;




FileStream stream=new FileStream(url,FileMode.Open);
stream.Seek(offset,SeekOrigin.Begin);//本句相当于stream.position=offset;//stream的position默认是0,读一次后position会对应加到读的位置。
//每次读之前最好都先设置一下流的读取位置。SeekOrigin.Begin表示从0开始偏移offset个数开始读,还有SeekOrigin.End和Current表示从结尾和当前位置开始偏移offset个数指定给Position。
int ret =stream.Read(data,offset,count);//这里的offset是data数组的偏移和大小,
stream.Close();//本句必须要加 不要忘记
    //代码意思是从流偏移量为offset的地方开始读,一共读count个字节,存在data数组的offset偏移处,该数组的 offset 和 (offset + count -1) 之间的值由从当前源中读取的字节替换。




Stream.Write(byte[] buffer, int offset, int count)




FileStream stream= new FileStream(url,FileMode.Create);
if(stream!=null){
stream.position=0;
stream.write(data,offset,count);//从stream的0开始写入 一共写count字节。data从offset开始写到stream。
stream.Flush();//如果暂时不close  默认是暂时不写数据的,那么flush是立刻写入数据。
stream.Close();//关闭后 也是立刻写入数据。
}
------------------------------------------------------------------序列化-------------------------------------------------------------------
FileStream stream= new FileStream(url,FileMode.Create);
sdFormater.Write(stream,(int)1);//int
sdFormater.Write(stream,"name");//string
stream.close();
//read:
sdBinaryReader stream=new sdBinaryReader(data,length);//test
int a;string b;
sdFormater.Read(stream,ref a);//a=1
sdFormater.Read(stream,ref b);//b="name"
//只要满足读取和写入的顺序完全一样,数据的序列化和反序列就可以完成,因为每次读取和写入的数据类型所占的字节数是固定的。比如byte1个字节,int占4个字节。
//另外文件的读写分2种,一种是整个数据结构的读写 比如一个大的string 写到byte文件文件里,那么读出来直接转换string就可以获取到数据;另外一种就是上边的 多个数据写到一个文件里边,那么读取也要按照分部读取再来转换(string)类型。直接转换肯定是错误的,读取顺序乱了 也是错误的。


一. 二进制转换成图片
MemoryStream ms = new MemoryStream(bytes);
ms.Position = 0;
Image img = Image.FromStream(ms);
ms.Close();
this.pictureBox1.Image


二. C#中byte[]与string的转换代码


1、System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
  byte[] inputBytes =converter.GetBytes(inputString);
  string inputString = converter.GetString(inputBytes);


2、string inputString = System.Convert.ToBase64String(inputBytes);
  byte[] inputBytes = System.Convert.FromBase64String(inputString);
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);


三. C# Stream 和 byte[] 之间的转换


/// 将 Stream 转成 byte[]


public byte[] StreamToBytes(Stream stream)
{
    byte[] bytes = new byte[stream.Length];
    stream.Read(bytes, 0, bytes.Length);
    // 设置当前流的位置为流的开始
    stream.Seek(0, SeekOrigin.Begin);
    return bytes;
}


/// 将 byte[] 转成 Stream


public Stream BytesToStream(byte[] bytes)
{
    Stream stream = new MemoryStream(bytes);
    return stream;
}


四. Stream 和 文件之间的转换


将 Stream 写入文件


public void StreamToFile(Stream stream,string fileName)
{
    // 把 Stream 转换成 byte[]
    byte[] bytes = new byte[stream.Length];
    stream.Read(bytes, 0, bytes.Length);
    // 设置当前流的位置为流的开始
    stream.Seek(0, SeekOrigin.Begin);
    // 把 byte[] 写入文件
    FileStream fs = new FileStream(fileName, FileMode.Create);
    BinaryWriter bw = new BinaryWriter(fs);
    bw.Write(bytes);
    bw.Close();
    fs.Close();
}


五. 从文件读取 Stream


public Stream FileToStream(string fileName)
{            
    // 打开文件
    FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
    // 读取文件的 byte[]
    byte[] bytes = new byte[fileStream.Length];
    fileStream.Read(bytes, 0, bytes.Length);
    fileStream.Close();
    // 把 byte[] 转换成 Stream
    Stream stream = new MemoryStream(bytes);
    return stream;
}
六.FileStream 读文件
byte[] byData = new byte[100];//用stream读到byte数组里边
char[] charData = new char[1000];
FileStream sFile = new FileStream("文件路径",FileMode.Open);
sFile.Seek(55, SeekOrigin.Begin);
sFile.Read(byData, 0, 100); //第一个参数是被传进来的字节数组,用以接受FileStream对象中的数据,第2个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的 开端文件中向数组写数据,最后一个参数规定从文件读多少字符.


七.StreamReader读取文件:
 
StreamReader objReader = new StreamReader(文件路径);
      string sLine="";
      ArrayList LineList = new ArrayList();    
      while (sLine != null)
      {
        sLine = objReader.ReadLine();
        if (sLine != null&&!sLine.Equals(""))
          LineList.Add(sLine);
      }
            objReader.Close();
            return LineList;


八.StreamWriter写文件:
 
  FileStream fs = new FileStream(文件路径, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
//开始写入
sw.Write(String);
 //清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs.Close();
九.读byte[]








File和Directory
File类支持对文件的基本操作,包括创建、拷贝、移动、删除和打开一个文件。Directory类则用于执行常见的各种目录操作,如创建、移动、浏览目录及其子目录。
File类和Directory类都是密封类。不象抽象类Stream,File类和Directory类可以被实例化,但它们不能被其它类继承。
File类和Directory类的基类都是抽象类FileSystemEntry。本文发表于http://bianceng.cn(编程入门)
Stream
File类的静态方法主要是用于创建FileStream类。一个FileStream类的实 例实际上代表一个磁盘文件,它通过Seek()方法进行对文件的随机访问,也同时包含了流的标准输入、标准输出、标准错误等。FileStream默认对 文件的打开方式是同步的,但它同样很好地支持异步操作。
TextReader和TextWriter
TextReader和TextWriter类都是抽象类。和Stream类的字节形式的输入和输出不同,它们用于Unicode字符的输入和输出。
StringReader和StringWriter
StringReader和StringWriter在字符串中读写字符。
StreamReader和StreamWriter
StreamReader和StreamWriter在流中读写字符。
BufferedStream
BufferedStream是为诸如网络流 的其它流添加缓冲的一种流类型。其实,FileStream流自身内部含有缓冲,而MemorySteam流则不需要缓冲。一个BufferStream 类的实例可以由多个其它类型的流复合而成,以达到提高性能的目的。缓冲实际上是内存中的一个字节块,利用缓冲可以避免操作系统频繁地到磁盘上读取数据,从 而减轻了操作系统的负担。
MemoryStream
MemoryStream是一个无缓冲流,它所封装的数据直接放在内存中,因此可以用于快速临时存储、进程间传递信息等。
NetworkSteam
Networksteam表示在互联网络上传递的流。
当使用名字空间System.IO中提供的类时,对存储数据的访问权限必须符合操作系统的安全性要求。

注意:不要使用这些类来编写应用程序对网络文件进行的操作。因为Internet默认的安全政策是不允许对文件直接访问。可以使用IsolatedStroage类来处理网络文件。




---------------------------------------------

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值