zoukankan      html  css  js  c++  java
  • U3D协程Coroutine之WWW与Update()的并行测试

    using System.Collections;
    using UnityEditor;
    using UnityEngine;
    using UnityEngine.UI;
    
    /************************************************************************/
    /* UnityEngine.WWW 下载与Update()的并行测试,UNITY5.35f                  */
    /************************************************************************/
    public class wwwTest : MonoBehaviour {
    
        WWW www;
        IEnumerator Start () {
    
    
            //下载文件是一个RAR,比较大,要下载几分钟才能完成,
            //运行发现,下载和Update()并行,游戏正常运行,调试发现创建并使用WWW对象并不会开启新线程
            //这说明WWW也是利用协程来实现下载的,如果是这样,下载速度应该会受Update()函数调用频率的影响,经测试发现下载速度并不受影响,不明觉厉
            //【补记】在协程函数中使用Thread.sleep(1000)将会卡住主线程,不要在下载时这样用,这样只是在为其它进程节省时间,降低下载速度。
         www = new WWW ("http://psoft.33lc.com:801/small/directxruntimes_x86.rar"); yield return www;//下载开始,直到下载完成才会执行本函数剩余的代码。      
    // Load the object asynchronously
         AssetBundleRequest request = bundle.LoadAssetAsync ("myObject", typeof(GameObject));
         // Wait for completion
         yield return request;//加载完成后才会执行后面的代码
    if(www == null){ EditorUtility.DisplayDialog ("", "download stoped", "ok"); yield break;//协程将抛弃后面所有代码 //yield return null; //协程返回后下次回来会执行下面的代码,由于下载失败,下面的操作将出错 } if(www.isDone){ string info = "download complete"; if (!string.IsNullOrEmpty (www.error))//有些平台上不允许string为null,则这时返回空串""; //yield return null; //协程返回后下次回来会执行下面的代码,由于下载失败,下面的操作将出错 yield break; EditorUtility.DisplayDialog ("info", info, "ok"); } else{ EditorUtility.DisplayDialog ("error", "download error", "ok"); yield return null; } EditorUtility.DisplayDialog ("finally", "end", "ok"); RawImage img = GetComponent<RawImage> (); img.texture = www.texture; } void Update () { if(Input.GetKeyDown (KeyCode.Space)){ Debug.Log ("is done: " + www.progress); //显示下载进度 } else if(Input.GetKeyDown (KeyCode.LeftControl)){ if(Input.GetKey (KeyCode.W)){//组合键测试 CTRL + W // 诡异现象,注意:先按CTRL再W无法进入到这里,先W再CTRL则可以进入到这里。 //GetKeyDown在按键期间只触发一次,且不能再触发其它按键;GetKey在按键期间一直不断触发,且可以同时再触发其它键 //因此两个GetKeyDown(A)&&GetKeyDown(B)不能实现组合键。 //GetKey(A) && GetKey(B)可以实现组合键,对游戏效率影响较大 //GetKeyDown(A) && GetKey(B)也可以实现组合键,对游戏效率影响较小 //相机漫游类的操作需要按键每帧或每几帧触发,因此必须使用getkey if(EditorUtility.DisplayDialog ("", "你确定要终止下载吗", "ok", "cancel")){ www.Dispose (); www = null; } } } if(Input.GetKey (KeyCode.A) && Input.GetKey(KeyCode.B)){ Debug.Log ("A AND B ==============="); } transform.Rotate (0, 2, 0); } }
  • 相关阅读:
    多线程程序设计学习(10)Future pattern
    Stack编程队列
    JS操作JSON总结
    java并发之TimeUnit理解
    java并发之DelayQueue实际运用示例
    netty的编解码器理解(转)
    spring中@Resource和@Autowired理解
    Netty中解码基于分隔符的协议和基于长度的协议
    构建基于Netty 的HTTP/HTTPS 应用程序
    对于spring中事务@Transactional注解的理解
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/5985891.html
Copyright © 2011-2022 走看看