一个新建项目,做了两个多月才发现忘记写多线程获取数据导致卡顿,然后尝试去改动,但是不想把主动被动的部分的结构打乱,使用了Loom解决子线程完成后向主线程广播。
Messenger本身用在子线程会出现 get_isActiveAndEnabled can only be called from the main thread.
的报错,但是如果改成主线程主动获取数据,却会卡在静态不静态的问题上面,由于我学艺不精无法解决static不static的问题,最后找到用Loom实现在子线程使用Messenger的Broadcast。
Loom代码,挂在SceneManager上面,如果有几个Scene的话则挂在DoNotDestroy类的GameObject上面。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq;
/// <summary>
/// Loom 用以在主线程和子线程间传递。
/// https://blog.csdn.net/luoyikun/article/details/78650904
/// http://www.voidcn.com/article/p-slikogln-da.html
/// </summary>
public class Loom : MonoBehaviour
{
public static int maxThreads = 8;
static int numThreads;
private static Loom _current;
private int _count;
public static Loom Current
{
get
{
Initialize();
return _current;
}
}
void Awake()
{
_current = this;
initialized = true;
}
static bool initialized;
static void Initialize()
{
if (!initialized)
{
if (!Application.isPlaying)
return;
initialized