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

扫一扫,访问微社区

开发者专栏

关注:1764

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

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

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

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

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

58

主题

212

帖子

1167

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
9
蛮牛币
10373
威望
0
注册时间
2014-11-12
在线时间
339 小时
最后登录
2017-7-21

专栏作家

发表于 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次。。。心累。。。。)





评分

参与人数 11鲜花 +34 收起 理由
岁月7013 + 2 很好的东西,学习到了
sadnimeia + 1 赞一个!
Stephanie + 5 赞一个!
cqyszwo + 2 很给力!
chenghuai11yuan + 5 很给力!
xunbo8866 + 5
zuig + 5 很给力!
ykl0617 + 3 很给力!
只为伊人 + 2
安安分分 + 2 接地气的文章 喜欢
lixiaobai + 2 赞一个!

查看全部评分


回复

使用道具 举报

排名
2835
昨日变化

58

主题

212

帖子

1167

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
9
蛮牛币
10373
威望
0
注册时间
2014-11-12
在线时间
339 小时
最后登录
2017-7-21

专栏作家

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

回复

使用道具 举报

排名
2835
昨日变化

58

主题

212

帖子

1167

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
9
蛮牛币
10373
威望
0
注册时间
2014-11-12
在线时间
339 小时
最后登录
2017-7-21

专栏作家

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

回复

使用道具 举报

4四处流浪
328/500
排名
6308
昨日变化
2

4

主题

43

帖子

328

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

排名
2835
昨日变化

58

主题

212

帖子

1167

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
9
蛮牛币
10373
威望
0
注册时间
2014-11-12
在线时间
339 小时
最后登录
2017-7-21

专栏作家

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
706/1000
排名
4153
昨日变化
1

0

主题

310

帖子

706

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

3偶尔光临
165/300
排名
14421
昨日变化
6

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读取么?








回复 支持 反对

使用道具 举报

4四处流浪
415/500
排名
7874
昨日变化
3

4

主题

208

帖子

415

积分

Rank: 4

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

回复

使用道具 举报

排名
2835
昨日变化

58

主题

212

帖子

1167

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
9
蛮牛币
10373
威望
0
注册时间
2014-11-12
在线时间
339 小时
最后登录
2017-7-21

专栏作家

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

of course

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1149/1500
排名
1912
昨日变化
1

1

主题

346

帖子

1149

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

4四处流浪
362/500
排名
11984
昨日变化
1

2

主题

77

帖子

362

积分

Rank: 4

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

回复 支持 1 反对 0

使用道具 举报

7日久生情
4753/5000
排名
259
昨日变化
2

0

主题

2150

帖子

4753

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
875/1000
排名
4153
昨日变化
1

6

主题

401

帖子

875

积分

Rank: 5Rank: 5

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

应该是隔帧执行的

回复 支持 反对

使用道具 举报

4四处流浪
306/500
排名
6925
昨日变化
4

3

主题

84

帖子

306

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

7日久生情
1862/5000
排名
861
昨日变化

2

主题

138

帖子

1862

积分

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

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

回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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