【发布时间】:2014-09-10 08:56:11
【问题描述】:
我目前正在开发一款模拟可变形 3D 对象的 3D 游戏。对于可变形,我的意思是 3D 对象的几何形状在逐帧变化。游戏中有一个渲染循环,应该尽可能频繁地执行(至少 30 次/秒)以获得下降的帧速率。但我还在这个渲染循环中做了另外两件事:计算新几何和计算轴对齐边界框层次结构 (AABVH)。我需要 AABVH 进行碰撞检测。在渲染 3D 对象之前完成几何和 AABVH 计算非常重要。计算新几何和 AABVH 是一项耗时的任务,因此我的帧速率迅速下降。因此,我的想法是在单独的线程中计算 AABVH。 这看起来像这样:
Thread t;
public void Render(Object3D o) // renders 3D object
{
if (t != null) // wait until the new geometry got calculated
{
t.Join();
}
o.RenderGeometry();
t = new Thread(() => o.CalcAABVH());
t.Start();
}
我不是 C# 并行编程方面的专家,但我确信这不是一个好的解决方案。每一帧,都会创建、执行和销毁一个新线程,这会导致很大的开销。在我的情况下,一个好的解决方案会是什么样子?
【问题讨论】:
-
这是在什么平台上的? OpenGL?直连 11?你能在 GPU 上的着色器中进行几何修改吗?您能否简化变形网格以使其更合理并与 GPU 合作,例如使用蒙皮网格?多线程非常复杂,你真的想避免它,直到它绝对必要。现代 DX 使这更容易一些,因为您可以从多个线程等访问 DX 资源,但它仍然相当困难。如果您确实需要多线程,Gusdor 的建议是避免大部分复杂性的好方法。
-
小心;多线程不一定会提高应用程序的性能。只有当您有多个 CPU 内核并确保您的线程被安排在不同的内核上时,才能实现显着的性能提升。显然,硬件图形加速器是实现这一目标的好方法。 :-)
-
@Luaan:它在 Windows 上的 OpenGL。你说得对,要做到这一点既昂贵又复杂。问题是我不仅要计算新几何,还要计算新几何的轴对齐边界框层次结构。我不能为此使用几何着色器。
-
@MikeofSST:绝对正确!硬件图形加速器?从来没有听说过。这是什么?
-
对不起,我不够精确。我实际上在计算两件事:新几何和包围体层次结构。我已经编辑了我的问题。
标签: c# multithreading