我以Java为爱好项目创建了一个简单的光线追踪器,但是它很慢。虽然不是非常慢,但还是慢。我想知道是否可以使用更底层的语言,例如C或C ++,来获得性能提升,或者差异会微不足道,我应该继续改进"我的"算法?
我以Java为爱好项目创建了一个简单的光线追踪器,但是它很慢。虽然不是非常慢,但还是慢。我想知道是否可以使用更底层的语言,例如C或C ++,来获得性能提升,或者差异会微不足道,我应该继续改进"我的"算法?
这要看情况。使用C/C++将使您能够访问Java无法实现的一些功能,例如SIMD(单指令多数据流)。
换句话说,我认为通常情况下,在C/C++中能够达到更好的效果,但需要付出一定的努力。首先进行所有基本的(数学/算法)优化。然后再进行微观优化。
然后(这里只是我在光线追踪中看到的一些例子):
AMD刚刚发布了一个名为Aparapi的开源项目,它可以在运行时将Java字节码转换为OpenCL。如果您的代码无法转换为OpenCL(存在限制),或者您没有可用的OpenCL,则代码将在线程池中运行。
可能非常适合您的需求。
由于你只了解你的实现细节,这个问题很难回答。如果你的方法主要是数学计算,那么Java在幕后进行各种优化,我认为切换到C++不会带来太多改进。
如果你使用了大量外部库,并且根据显示光线追踪结果的方法,可能会通过移动到基于C的实现而得到改进。
如果您使用低效算法,并且学习新语言会带来很多麻烦,那么转换到C/C++只会给您带来微小的收益。适当编写的Java可以实现与类似的C/C++代码大致相同的速度,达到非商业用途光线追踪器的要求。我假设光线追踪器现在已经功能完备,因此建议您学习如何使用分析工具来检测代码中的瓶颈。请记住80/20规则(或者是90/10、75/25之类的规则),即程序80%的时间在运行其20%的代码。
优化算法通常比更换编程语言能提供更好的性能提升。
几年前我用Java做了一个简单的光线追踪器。对于非常简单的网格(著名的茶壶3D网格和兔子3D网格),我可以使用实时渲染进行计算。所以我想你也可以做到=)
如果这只是业余爱好,请坚持使用Java,没有必要转向C ++。而且,不要着眼于更改语言,而是考虑如何改进您的代码(例如在log(n)时间内查找被光线击中的三角形,多线程编程等等)。
我猜你会发现使用C或C++可以获得显著的性能提升。你可以尝试使用像this这样的工具来转换你的代码。