需要统一多线程的策略

时间:2016-01-20 01:51:11

标签: c# multithreading unity3d

我的团结项目是 Android 上的程序环境,并在运行时创建地形和内容。我使用的整个工作流程是计算工作线程中的任何非统一,并且在计算数据时,我在主线程中调用Unity API。

问题是有时(就像每200帧一样)工作线程会影响主线程的性能。这可能会在渲染时间上出现令人讨厌的飙升。

那么如何处理统一中的多线程?

编辑: Android设备是四核。

编辑2:我相信Sam在评论中所说的正是正在发生的事情。

  

我想知道你是否可以确定运行代码的核心,或者是否   你可以设置线程亲和力?我找到了一些人的链接   描述了类似的情况:herehere。听起来好像   它偶尔选择与主线程相同的核心。

所以也许这不是关于统一而是每个实时交互式多线程应用程序。我相信可以在某些平台的某些版本上设置线程关联,但这会破坏系统的跨平台状态。

PS:不完全是主要问题,但为了使问题更具体,我将包括工作线程实现。它是this post中建议的工作线程实现的修改版本。修改后的版本是这样的:

public static class JobScheduler
{
private static Queue<Job> Jobs = new Queue<Job>();
private static volatile bool isBusy;
private static ManualResetEvent _workAvailable = new ManualResetEvent(false);
static JobScheduler()
{
    var backgroundWorkThread = new Thread(BackgroundThread)
    {
        IsBackground = true,
        Priority = ThreadPriority.Lowest,
        Name = "BasicBackgroundWorker Thread"
    };
    backgroundWorkThread.Start();
}

private static void BackgroundThread()
{
    int jobCnt;
    while (true)
    {
        Job? workItem=null;
        lock (Jobs)
        {
            jobCnt = Jobs.Count;
            if (jobCnt != 0 && !isBusy)
            {
                workItem = Jobs.Dequeue();
            }
        }
        if (workItem!=null)
        {
            isBusy = true;
            workItem.Value.callback(workItem.Value.param);
        }
        else
        {
            _workAvailable.WaitOne();
            _workAvailable.Reset();
        }
    }
}
public static void AddJob(Job Job)
{
    lock (Jobs)
    {
            Jobs.Enqueue(Job);
    }
        _workAvailable.Set();
}

public static void JobDone()
{
    isBusy = false;
    _workAvailable.Set();
}

}

Job struct:

public struct Job
{
public object param;
public WaitCallback callback;
public Job(WaitCallback callBackP
    , object parameter)
{
    callback = callBackP;
    param = parameter;
}
}

无论何时需要,我都会调用JobScheduler.AddJob将作业排队并在作业完成后调用JobScheduler.JobDone以允许下一个作业运行。

ThreadPool也不是一个选项,因为它会产生不必要的垃圾,而且使用起来不是很灵活。

0 个答案:

没有答案