大牛专栏 收藏本版 已有21人收藏 +发表新主题
查看: 13635|回复: 0
打印 上一主题 下一主题

Capricorn|Unity3d中协同程序那点事儿(3)

[复制链接]

Capricorn|Unity3d中协同程序那点事儿(3)

zzlple 发表于 2016-5-3 22:16:40 浏览:  13635 回复:  0 只看该作者 复制链接
本帖最后由 zzlple 于 2016-5-20 21:59 编辑

上两篇教程中我们观察了在协同程序中普通数值运算对于线程数目的影响,这一篇教程我们将观察协同程序中请求网络时线程数目的变化,我们同样选择一个稍低版本unity,即unity4.x。
1.实验脚本:
using UnityEngine;
using System.Collections;
namespace com.arinchina.demo
{
    public class CoroutineTest : MonoBehaviour
    {

        // Use this for initialization
        void Start ()
        {

            for (int i=0; i<128; i++) {
        
                StartCoroutine ("RequestNetwork");
        
            }
   
        }

        IEnumerator RequestNetwork ()
        {
            WWW www = new WWW ("http://www.baidu.com");

            yield return www;

            yield return new  WaitForSeconds (10);

        }
   

    }
}


2.实验环境:unity4.6.3
3.实验猜测:在本环境中协同程序是与线程无关的一种实现,但是可以在协同程序中开启线程
4.实验结果:(1).unity编辑器未在运行模式下线程总数示意:我们所见在未运行模式下线程总数为31,

(2).unity编辑器在运行模式下线程总数:

我们所见在运行模式下线程总数是160,由于本次试验我们在协同程序中访问了网络,那么这个线程数目的增加我们初步猜想是访问网络所产生,因为无论在传统桌面应用开发,移动手机应用开发,主线程访问网络会造成阻塞,为了进一步验证我们的猜想,接下来我们将对www的底层实现进行分析,我们来观察位于命名空间UnityEngine下WWW的构造函数:
1.构造函数以及构造内调用



我们发现InitWWW是一个native实现,那有朋友就问了,何为native实现,如果不明白,自行百度,笼统的讲就是就是一个语言调用非这种语言代码的接口,unity3d作为一个跨平台的游戏引擎,为了性能效率采用native也是不得已而为之,由于目前无法对editor模式下的动态链接库进行反编译查看,所以我们选择android ios平台进行一个大致的观察,我们先对android平台进行分析,我们将用到JD-GUI(一款可以反编译jar包的工具)对unity的classes.jar进行查看
如图:

我们所见在android平台www实现类是直接继承于线程类的,在构造函数中直接开启子线程,如图:

我们所知在java中,线程开启是调用线程的start方法,那么就android平台来讲的话,访问网络会造成线程数目的增加,而这个增加是毁灭性的,如果没有适当的技巧处理势必会造成阻塞,内存爆掉等一系列问题,当然在今后的教程中我们将一步一步教大家如何安全的使用协同程序,以及协同程序中使用www类请求网络,以及unity5.x对于网络请求的升级版实现分析。谢谢,如果有兴趣的话,大家也可以找找www在ios平台的native实现,在这里我们就不再进行累述。今天的教程到这里就结束了,如果有什么疑问,欢迎提出来



分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中级会员

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.