【发布时间】:2011-11-18 21:29:59
【问题描述】:
作为一个业余项目,我在 Java 中创建了简单的光线追踪器,但是速度很慢。不是很慢,但仍然很慢。我想知道我是否可以使用 C 或 C++ 等低级语言获得任何性能提升,或者差异可以忽略不计,我应该坚持改进“我的”算法?
【问题讨论】:
标签: java c++ performance raytracing
作为一个业余项目,我在 Java 中创建了简单的光线追踪器,但是速度很慢。不是很慢,但仍然很慢。我想知道我是否可以使用 C 或 C++ 等低级语言获得任何性能提升,或者差异可以忽略不计,我应该坚持改进“我的”算法?
【问题讨论】:
标签: java c++ performance raytracing
由于您只知道实现背后的细节,因此很难回答。如果您的方法主要是数学方法,那么 Java 会在幕后进行各种优化,我认为您不会在切换到 C++ 后看到很多改进。
如果您使用大量外部库,并且根据您在屏幕上显示光线追踪结果的方法,可能会在转向基于 C 的实现方面有所改进。
【讨论】:
这将取决于。使用 C/C++ 将允许您访问在 Java 中无法完成的事情。 (如 SIMD)
换句话说,我会说是的,通常可能在 C/C++ 中做得更好,但这需要一些工作。首先进行所有基本(数学/算法)优化。稍后再进行微优化。
【讨论】:
我的猜测是您会看到使用 c 或 c++ 显着提高性能。您可以尝试使用this 之类的工具转换您的代码。
【讨论】:
几年前我用 Java 做了一个简单的光线追踪器。对于非常简单的网格(著名的茶壶 3D 网格和兔子 3D 网格),我可以通过实时渲染进行计算。所以我想你也可以做到 =)
如果是爱好,坚持使用 Java,不值得转向 C++。而不是改变语言,想想你可以在哪里改进你的代码(找到在 log(n) 时间内被射线击中的三角形,多线程编程等......)
【讨论】:
如果您使用效率低下的算法,除了学习新语言的一大堆头痛之外,切换到 C/C++ 会给您带来边际收益。正确编写的 Java 可以实现类似 C/C++ 代码的大约 70-80% 的速度,并且对于非商业光线追踪器来说应该足够好。我假设光线追踪器现在功能完整,所以我的建议是学习如何使用分析器来检测代码中的瓶颈。记住 80/20 规则(或者是 90/10、75/25 左右?),您的程序将 80% 的时间花费在运行 20% 的代码上。
更好的算法通常比语言切换提供更好的性能提升。
【讨论】:
我认为这个问题的答案是肯定的,在 99.99% 的情况下,非解释语言将比 VM 下的相同算法运行得更快。 这就是说(在内存和时间很重要的 java 和 c/c++ 中的图像处理方面做了很多工作)我认为你应该首先尝试优化你的代码,这是我的建议:
然后(我可以看到几个光线追踪的例子):
现在这些东西“很好”,但如果速度对你来说真的很重要,我不建议使用 c 或 c++ 语言(即使你可以),但更有可能专注于 OpenCL。这可能是最好的工具,最适合构建光线追踪引擎。想象一下,您不是在谈论 30% 的改进,但更有可能是 10'000%(快 100 倍)这是一个 java 接口:http://jogamp.org/jocl/www/ 祝你好运:-)
【讨论】:
光线追踪的效率取决于您的加速结构。使用 C++ 而不是 Java 肯定会有所帮助。但是,如果您缺乏有效的结构,例如 BVH 或 Kd-tree,您的光线追踪器在您使用的任何语言中都会很慢。
如果只是爱好,我建议留在 Java 上。如果你想加载复杂的模型,例如斯坦福佛或泰语,那么你绝对应该转向 C++ 并开始阅读“基于物理的渲染”:http://www.pbrt.org/你可以在http://pbrt.org/pbrt-2ed-chap4.pdf免费下载第 4 章
简而言之,您可以根据项目目标回答您的问题。简单的爱好=留在 Java 上。复杂模型的实时 RT=C++
【讨论】:
AMD 刚刚发布了一个名为 Aparapi 的开源项目,它在运行时将 Java 字节码转换为 OpenCL。如果您的代码无法转换为 OpenCL(存在限制)或者您没有可用的 OpenCL,则代码将在线程池中运行。
可能非常适合您的需求。
【讨论】: