我的团结项目是 Android 上的程序环境,并在运行时创建地形和内容。我使用的整个工作流程是计算工作线程中的任何非统一,并且在计算数据时,我在主线程中调用Unity API。
问题是有时(就像每200帧一样)工作线程会影响主线程的性能。这可能会在渲染时间上出现令人讨厌的飙升。
那么如何处理统一中的多线程?
编辑: Android设备是四核。
编辑2:我相信Sam在评论中所说的正是正在发生的事情。
我想知道你是否可以确定运行代码的核心,或者是否 你可以设置线程亲和力?我找到了一些人的链接 描述了类似的情况:here和here。听起来好像 它偶尔选择与主线程相同的核心。
所以也许这不是关于统一而是每个实时交互式多线程应用程序。我相信可以在某些平台的某些版本上设置线程关联,但这会破坏系统的跨平台状态。
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也不是一个选项,因为它会产生不必要的垃圾,而且使用起来不是很灵活。