在Unity中每10帧创建一个新线程是一个好主意吗?

时间:2018-02-22 12:00:08

标签: c# multithreading unity3d

private void RunEveryTenFrames(Color32[] pixels, int width, int height)
    {
        var thread = new Thread(() =>
        {
            Perform super = new HeavyOperation();
            if (super != null)
            {
                Debug.Log("Result: " + super);
                ResultHandler.handle(super);
            }
        });
        thread.Start();
    }

我在Unity中每10帧运行一次此功能。这是一个坏主意吗。此外,当我尝试在线程中添加thread.Abort()时,它表示thread未定义,并且在定义错误之前无法使用局部变量。

1 个答案:

答案 0 :(得分:2)

  

在Unity中每10帧创建一个新线程是个好主意吗?

即可。 10帧太小,无法重复创建新线程。

每次创建新的Thread都会导致开销。偶尔做一次也不错。它是每10帧完成的。记住这不是每10秒钟。这是每10帧。

使用ThreadPool。通过将ThreadPool与ThreadPool.QueueUserWorkItem一起使用,您将重新使用已存在于系统中的Thread,而不是每次都创建新的。

RunEveryTenFrames ThreadPool新功能应该如下所示:

private void RunEveryTenFrames(Color32[] pixels, int width, int height)
{
    //Prepare parameter to send to the ThreadPool
    Data data = new Data();
    data.pixels = pixels;
    data.width = width;
    data.height = height;

    ThreadPool.QueueUserWorkItem(new WaitCallback(ExtractFile), data);
}

private void ExtractFile(object a)
{
    //Retrive the parameters
    Data data = (Data)a;

    Perform super = new HeavyOperation();
    if (super != null)
    {
        Debug.Log("Result: " + super);
        ResultHandler.handle(super);
    }
}

public struct Data
{
    public Color32[] pixels;
    public int width;
    public int height;
}

我需要调用Unity的API或使用此线程中的Unity API,请参阅我的other帖子或如何操作。