multithreading - Unity : How to use all CPU cores for Camera. 使用多线程图形作业渲染?优化 - 不起作用?

标签 multithreading performance unity3d rendering cpu

如何使用多线程图形作业优化?

我有一个项目(更少的游戏,更多的应用程序),它在一个场景中使用了数十个摄像机,一次全部渲染。 (不要问为什么,一定是这样!)

不用说,在运行应用程序时,由于渲染管道是单线程的,这几乎会耗尽一个 CPU 内核。结果,它会将帧速率降低到非常低的水平。 (GPU、内存等远低于 100% 负载 - CPU 是这里的瓶颈)

看到 Unity 有一个名为“Graphics Jobs (experimental)”的选项,我感到非常欣慰,该选项专门用于将渲染拆分到多个线程,因此,多个内核。

但是,启用此选项并将 DirectX12 设置在图形 API 列表的顶部,我希望现在可以充分利用 CPU,即所有 CPU 内核都可以进行主动渲染。但是,该应用程序似乎仍然只利用了我的 CPU 大约 40% 的潜力,同时提供了低帧速率。当然,它应该只在 CPU 用完后才降低帧速率?似乎各个核心的使用方式没有任何不同。为什么我不能通过利用 CPU 上接近 100% 的所有内核(总共包括正在运行的任何其他程序)来最大化输出帧速率?

本质上,我想知道如何让 Unity 充分利用我所有的 CPU 内核,以便在同时在我的场景中拥有尽可能多的摄像机的同时获得尽可能高的帧速率...... ...我认为 Graphics Jobs 会解决这个问题吗? ...除非我使用不正确或没有使用正确的设置组合?

顺便说一句,我的 CPU 是 i7-4790 @3.6ghz,我的 GPU 是使用 DX12 的 980Ti。 32GB 内存。

最佳答案

在相机渲染期间,您的 CPU 必须与 GPU 通信,即所谓的 drawcall。 .在幕后,Unity 已经在使用多线程方法 (ctrl+f "threads") 来让 CPU 与 GPU 通信,而这个将任务分配给工作线程的过程发生在一个黑匣子中。请注意,“并非所有平台都支持多线程渲染;在撰写本文时,WebGL 不支持此功能。在不支持多线程渲染的平台上,所有 CPU 任务都在同一个线程上执行。”

因此,如果您的应用程序受 CPU 约束,那么您的平台可能不受支持,或者任务根本无法分解成足够小的 block 来填满您的所有内核,或者其他一些“黑匣子”原因,例如也许 CPU 正在按顺序迭代每个相机,而不是批量处理(这对我来说很有意义,因为主线程必须是以线程安全的方式与 Unity API 交互以确定必须绘制的内容)。

似乎您唯一的选择是阅读此处提供的链接并尝试优化您的场景以最小化绘制调用,但话虽如此,我认为尝试渲染“数十个摄像机”是一个非常糟糕的主意,尤其是如果他们都通过后期处理等以高分辨率渲染复杂场景 - 尽管我从未尝试过类似的事情。

关于multithreading - Unity : How to use all CPU cores for Camera. 使用多线程图形作业渲染?优化 - 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43143329/

相关文章:

c - 为什么 TI-Basic 这么慢?

unity3d - 在 Unity 中更改场景或具有不同的 ui 屏幕更有效吗?

c# - 是否可以在 OSX 上的 Mono 或 .NET 中从 Unity C# 运行 R 代码?

python - 如何使用线程在文本文件中每行发布请求

java - LinkedBlockingQueue 无法等待线程执行

javascript - 我不知道为什么在我的案例中 JS 和 Go 之间没有很大的性能差异

c++ - Visual Studio 2008 糟糕的性能

c# - 为屏幕分辨率传递命令行参数

c++ - nodejs 原生插件多线程

并发 BST 插入功能不起作用