开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1702

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1821|回复: 37

[alayeshi] unity读取图片方法及加载速度对比

[复制链接]  [移动端链接]
排名
2942
昨日变化
2

57

主题

207

帖子

1103

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
8
蛮牛币
9995
威望
0
注册时间
2014-11-12
在线时间
319 小时
最后登录
2017-5-26

专栏作家

发表于 2017-4-10 17:00:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 alayeshi 于 2017-4-10 17:22 编辑

因需求要从外部加载一些图片到UGUI里。程序员的要求很简单:短小快。。。哈哈哈,别想歪
噢,对了,本文参考网上一篇文章,原文链接http://blog.csdn.net/qinyuanpei/article/details/49000907

下面我们对比一下传统的c#的IO读取加载速度快还是unity的WWW方式哪个更快。
首先看一下c#的IO方式:
[C#] 纯文本查看 复制代码
//创建文件读取流
FileStream fileStream = new FileStream(screen, FileMode.Open, FileAccess.Read);
fileStream.Seek(0, SeekOrigin.Begin);
//创建文件长度缓冲区
byte[] bytes = new byte[fileStream.Length]; 
//读取文件
fileStream.Read(bytes, 0, (int)fileStream.Length);
//释放文件读取流
fileStream.Close();
fileStream.Dispose();
fileStream = null;

//创建Texture
int width=800;
int height=640;
Texture2D texture = new Texture2D(width, height);
texture.LoadImage(bytes);


然后我们实际操作一下;
1、我建一个image在UGUI里面;然后在image上加个脚本readpictures
如下图:

11.png

然后在Asset下的StreamingAssets文件夹(该文件夹属于unity内部要求命名,文件名必须是StreamingAssets)里放入一张jpg的图片
如图:
22.png


2、我用两种方法来写readpictures内部的加载方法。先看全部源码:

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;
public class readpictures : MonoBehaviour
{

    private Image image;
    private string loadpath = "H:/projects/test/Assets/StreamingAssets/Desert.jpg";//IO方法加载的路径
    string picpathwww = "Desert.jpg";//WWW的加载路径
    void Start()
    {
        image = this.GetComponent<Image>();

        //两种不同  的加载方法

        LoadByIO();//这个方法加载速度快

        // LoadByWWW();//此方法加载速度慢

    }

    /// <summary>
    /// 以IO方式进行加载
    /// </summary>
    private void LoadByIO()
    {
        double startTime = (double)Time.time;
        //创建文件读取流
        FileStream fileStream = new FileStream(loadpath, FileMode.Open, FileAccess.Read);
        fileStream.Seek(0, SeekOrigin.Begin);
        //创建文件长度缓冲区
        byte[] bytes = new byte[fileStream.Length];
        //读取文件
        fileStream.Read(bytes, 0, (int)fileStream.Length);
        //释放文件读取流
        fileStream.Close();
        fileStream.Dispose();
        fileStream = null;

        //创建Texture
        int width = 300;
        int height = 372;
        Texture2D texture = new Texture2D(width, height);
        texture.LoadImage(bytes);

        //创建Sprite--把Texture转成sprite
        Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        image.sprite = sprite;

        startTime = (double)Time.time - startTime;
        Debug.Log("IO加载用时:" + startTime);
    }

    /// <summary>
    /// 以WWW方式进行加载
    /// </summary>
    private void LoadByWWW()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        double startTime = (double)Time.time;
        //请求WWW

        WWW www = new WWW("file://H:/projects/test/Assets/StreamingAssets/" + picpathwww);//只能放URL
        yield return www;
        if (www != null && string.IsNullOrEmpty(www.error))
        {
            //获取Texture
            Texture2D texture = www.texture;

            //创建Sprite
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
            image.sprite = sprite;

            startTime = (double)Time.time - startTime;
            Debug.Log("WWW加载用时:" + startTime);
        }
    }

}


上面代码的具体解释已经在代码里做了详细的注释。我在两种方法里都写了测试加载时间的代码在start方法里我调用第一个方法,也就是IO的方法(代码里的LoadByIO()这个方法)看结果

33.png

然后调用第二个方法也就是WWW的方法(代码里的LoadByWWW();方法
看结果:

44.png

结果很明显传统的IO方法加载速度要比WWW的方法快。
(我好想吐槽蛮牛的编辑格式啊,每次写完文章发表后的格式和编辑的不一样,要调整N次。。。心累。。。。)





评分

参与人数 7鲜花 +24 收起 理由
chenghuai11yuan + 5 很给力!
xunbo8866 + 5
zuig + 5 很给力!
ykl0617 + 3 很给力!
只为伊人 + 2
安安分分 + 2 接地气的文章 喜欢
lixiaobai + 2 赞一个!

查看全部评分


回复

使用道具 举报

排名
2942
昨日变化
2

57

主题

207

帖子

1103

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
8
蛮牛币
9995
威望
0
注册时间
2014-11-12
在线时间
319 小时
最后登录
2017-5-26

专栏作家

 楼主| 发表于 2017-4-10 17:10:48 | 显示全部楼层
我就是来吐槽的

回复

使用道具 举报

排名
2942
昨日变化
2

57

主题

207

帖子

1103

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
8
蛮牛币
9995
威望
0
注册时间
2014-11-12
在线时间
319 小时
最后登录
2017-5-26

专栏作家

 楼主| 发表于 2017-4-10 17:10:57 | 显示全部楼层
二楼依旧吐槽

回复

使用道具 举报

3偶尔光临
281/300
排名
7079
昨日变化
1

4

主题

38

帖子

281

积分

Rank: 3Rank: 3Rank: 3

UID
158939
好友
0
蛮牛币
221
威望
0
注册时间
2016-7-26
在线时间
121 小时
最后登录
2017-5-26
发表于 2017-4-10 17:21:42 | 显示全部楼层
那如果需要把图片放到服务器上呢?还能使用IO读取么?

回复 支持 反对

使用道具 举报

排名
2942
昨日变化
2

57

主题

207

帖子

1103

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
8
蛮牛币
9995
威望
0
注册时间
2014-11-12
在线时间
319 小时
最后登录
2017-5-26

专栏作家

 楼主| 发表于 2017-4-10 17:30:59 | 显示全部楼层
qaz6889845 发表于 2017-4-10 17:21
那如果需要把图片放到服务器上呢?还能使用IO读取么?

服务器最后还不是下载下来到本地看么

回复 支持 反对

使用道具 举报

5熟悉之中
636/1000
排名
4578
昨日变化
1

0

主题

292

帖子

636

积分

Rank: 5Rank: 5

UID
3796
好友
0
蛮牛币
775
威望
0
注册时间
2013-9-13
在线时间
130 小时
最后登录
2017-5-27
发表于 2017-4-10 17:45:53 | 显示全部楼层
不错,学习一下

回复

使用道具 举报

3偶尔光临
165/300
排名
13973
昨日变化
2

0

主题

123

帖子

165

积分

Rank: 3Rank: 3Rank: 3

UID
209789
好友
0
蛮牛币
333
威望
0
注册时间
2017-3-3
在线时间
11 小时
最后登录
2017-4-14
发表于 2017-4-10 20:35:37 | 显示全部楼层

还能使用IO读取么?








回复 支持 反对

使用道具 举报

3偶尔光临
293/300
排名
10809
昨日变化
3

4

主题

172

帖子

293

积分

Rank: 3Rank: 3Rank: 3

UID
211167
好友
1
蛮牛币
522
威望
0
注册时间
2017-3-10
在线时间
63 小时
最后登录
2017-5-12
发表于 2017-4-11 09:53:35 | 显示全部楼层
很不错,学到了
[发帖际遇]: 糊糊 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

回复

使用道具 举报

排名
2942
昨日变化
2

57

主题

207

帖子

1103

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
8
蛮牛币
9995
威望
0
注册时间
2014-11-12
在线时间
319 小时
最后登录
2017-5-26

专栏作家

 楼主| 发表于 2017-4-13 09:40:28 | 显示全部楼层
yuyu5255 发表于 2017-4-10 20:35
还能使用IO读取么?

of course

回复 支持 反对

使用道具 举报

5熟悉之中
961/1000
排名
2187
昨日变化
1

1

主题

266

帖子

961

积分

Rank: 5Rank: 5

UID
56496
好友
0
蛮牛币
2532
威望
0
注册时间
2014-11-19
在线时间
232 小时
最后登录
2017-5-27
发表于 2017-4-14 10:19:23 | 显示全部楼层
感谢  前辈!!

回复 支持 反对

使用道具 举报

3偶尔光临
281/300
排名
12935
昨日变化
3

2

主题

68

帖子

281

积分

Rank: 3Rank: 3Rank: 3

UID
138025
好友
1
蛮牛币
79
威望
0
注册时间
2016-3-1
在线时间
169 小时
最后登录
2017-5-28
发表于 2017-4-14 11:03:44 | 显示全部楼层
个人感觉,www的方式加载用了接近0.02秒,也就是默认的一帧的时间,而IO读取是0,说明了说明?

回复 支持 反对

使用道具 举报

7日久生情
4220/5000
排名
266
昨日变化

0

主题

1783

帖子

4220

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
3215
好友
0
蛮牛币
177
威望
0
注册时间
2013-9-4
在线时间
1039 小时
最后登录
2017-5-27
发表于 2017-4-14 20:51:04 | 显示全部楼层
的顶顶顶顶顶顶顶顶顶顶
[发帖际遇]: zhaoXH 乐于助人,奖励 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
528/1000
排名
5204
昨日变化
3

6

主题

208

帖子

528

积分

Rank: 5Rank: 5

UID
83438
好友
1
蛮牛币
406
威望
0
注册时间
2015-3-23
在线时间
130 小时
最后登录
2017-5-27
发表于 2017-4-18 11:06:30 | 显示全部楼层
Eagle---3 发表于 2017-4-14 11:03
个人感觉,www的方式加载用了接近0.02秒,也就是默认的一帧的时间,而IO读取是0,说明了说明? ...

应该是隔帧执行的

回复 支持 反对

使用道具 举报

3偶尔光临
254/300
排名
7481
昨日变化
1

3

主题

66

帖子

254

积分

Rank: 3Rank: 3Rank: 3

UID
104455
好友
0
蛮牛币
501
威望
0
注册时间
2015-5-30
在线时间
77 小时
最后登录
2017-5-27
QQ
发表于 2017-4-19 12:34:26 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶

回复 支持 反对

使用道具 举报

7日久生情
1737/5000
排名
891
昨日变化

2

主题

116

帖子

1737

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
64697
好友
0
蛮牛币
4835
威望
0
注册时间
2014-12-30
在线时间
745 小时
最后登录
2017-5-27
发表于 2017-4-20 09:55:58 | 显示全部楼层
我喜欢www,,,,,,,,,,不加载完就能跑,可以用默认图先运行着,一点点加载,有yield不会卡,,,,,,,,,,,,,,IO的就要自己写线程了,要么卡住等

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表