• Unity中关于多线程的一些事


    一.线程中不允许调用unity组件api

    解决方法:可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API.

    二.打印并且将信息输出到list列表中

    多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。

    三.启用socket连接server

    在主线程中直接连接server,如果网络通信正常,程序运行也正常。但是如果网络中断或者连接较慢,就会出现程序卡顿。所以要在启动一个线程来连接server。并在连接server成功后启动一个新的线程来接听server给客户端发送的消息。

    即 thread1启动连接socket。thread2启动监听。

    1. thread1 = new Thread(Connect);
    2. thread1.IsBackground = true;
    3. thread1.Start();
    1. socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    2. IPAddress iPAddress = IPAddress.Parse(ip);
    3. IPEndPoint point = new IPEndPoint(iPAddress, port);
    4. socketSend.Connect(point);
    5. LogManager.Instance.ShowLog("连接成功 , " + " ip = " + ip + " port = " + port);
    6. thread2= new Thread(Received);
    7. thread2.IsBackground = true;
    8. thread2.Start();

    但是当我们stop run unity,然后再次run unity的时候我们会发现编辑器在不断加载脚本,会卡很久。经过多次测试我发现是线程没有结束。所以要在OnDisable时将线程中断。

    1. void CloseAll()
    2. {
    3. //这里要先终止线程 在终止socket
    4. //不然会报错 SocketException: 一个封锁操作被对 WSACancelBlockingCall 的调用中断
    5. if (thread2!= null)
    6. {
    7. try
    8. {
    9. thread2.Abort();
    10. }
    11. catch (Exception e)
    12. {
    13. Debug.Log(e.Message);
    14. }
    15. }
    16. if (thread1!= null)
    17. {
    18. try
    19. {
    20. thread1.Abort();
    21. }
    22. catch (Exception e)
    23. {
    24. Debug.Log(e.Message);
    25. }
    26. }
    27. if (socketSend!=null&&socketSend.Connected)
    28. {
    29. try
    30. {
    31. socketSend.Shutdown(SocketShutdown.Both);
    32. socketSend.Close();
    33. }
    34. catch (Exception e)
    35. {
    36. Debug.Log(e.Message);
    37. }
    38. }
    39. }

    注意一定要先中断thread2,在中断thread1.不然unity还是会不断reload scrip,使编辑器卡在那里。

  • 相关阅读:
    谁还不爱吃肉?现在就教你采集一座城市里的烤肉店数据(附完整代码)
    Activiti7笔记
    KDD 2023 | WHEN异构时间序列分析模型:当Wavelet和DTW遇上Attention
    DHCP原理和配置
    中国RISC-V机遇与变革下,赛昉科技发布两款高性能新品
    Linux 基础-新手必备命令
    【Python】利用tkinter与图灵机器人制作智能聊天系统
    硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战
    SDK动态设置自定义属性
    美妆行业的痛点问题以及解决办法
  • 原文地址:https://blog.csdn.net/qq_33994566/article/details/133121852