如何使用多线程图形作业优化?
我有一个项目(少了一个游戏,更多的应用程序),它在一个场景中使用了数十个摄像头,所有这些都是一次渲染。 (不要问为什么,必须这样!)
毋庸置疑,在运行应用程序时,由于渲染管道是单线程的,因此几乎可以实现一个CPU内核。结果,它降低了帧速率。 (GPU,内存等远低于100%负载 - CPU是这里的瓶颈)
我很高兴看到Unity有一个名为“图形作业(实验)”的选项,它专门用于跨多个线程分割渲染,因此,多个核心。
但是,启用此选项并将DirectX12设置在图形API列表的顶部,我希望现在可以充分利用CPU,即所有CPU内核都可以进行主动渲染。然而,似乎仍然是应用程序仍然只利用我的CPU潜力的40%,同时提供低帧速率。当然,它应该只有在最大化CPU时才会降低帧速率?似乎并没有以不同的方式使用各个核心。为什么我不能通过利用我CPU上近100%的核心来最大化输出帧速率(总共包括正在运行的任何其他程序)?
基本上我想知道如何让Unity充分利用我所有的CPU核心,以便尽可能高的帧速率,同时在我的场景中同时拥有尽可能多的摄像头...... ..我认为图形工作会解决这个问题吗? ...除非我错误地使用它们或没有使用正确的设置组合?
另外,我的CPU是i7-4790 @ 3.6ghz,我的GPU是使用DX12的980Ti。 32GB的RAM。
答案 0 :(得分:0)
在相机渲染过程中,您的CPU必须与GPU通信,即所谓的drawcall。在幕后,Unity已经使用多线程方法(ctrl+f "threads")来让CPU与GPU通信,并且将任务交给工作线程的过程在黑盒子中进行。请注意,“并非所有平台都支持多线程渲染;在编写本文时,WebGL不支持此功能。在不支持多线程渲染的平台上,所有CPU任务都在同一线程上执行。”
因此,如果您的应用程序受到CPU的约束,那么可能您的平台不受支持,或者任务根本无法分解为足够小的块以填满所有内核或其他“黑匣子”原因,就像CPU可以按顺序迭代每个摄像头而不是批处理(这对我来说很有意义,因为mainthread必须是以线程安全的方式与Unity API接口以确定必须绘制的内容)。
似乎您唯一的选择是阅读此处提供的链接并尝试优化您的场景以尽量减少绘制调用,但话虽如此,我认为尝试渲染“数十个摄像头”是一个非常糟糕的主意特别是如果它们都是以大分辨率渲染复杂的场景并进行后期处理等等 - 尽管我从来没有尝试过类似的东西。