繁体   English   中英

Java与C ++ - 光线跟踪

[英]Java vs. C++ - Raytracing

我在Java中创建了简单的光线跟踪器作为业余爱好项目,而且它很慢。 虽然不是很慢,但速度很慢。 我想知道我是否可以使用C或C ++等低级语言获得任何性能提升,或者差异是否可以忽略不计,我应该坚持改进“我的”算法?

这将取决于。 使用C / C ++将允许您访问Java中无法执行的操作。 (如SIMD)

换句话说,我会说是的,它通常可能在C / C ++中做得更好,但它需要一些工作。 首先进行所有基本(数学/算法)优化。 然后进行微优化。

AMD刚刚发布了一个名为Aparapi的开源项目,该项目在运行时将Java字节码转换为OpenCL。 如果您的代码无法转换为OpenCL(有限制)或者如果您没有OpenCL可用,则代码将在线程池中运行。

可能是您的需求的理想选择。

http://aparapi.googlecode.com

由于您只知道实施背后的细节,因此很难回答。 如果你的方法主要是数学方法,那么Java会在幕后进行各种优化,我认为你不会通过切换到C ++来看到改进的方式。

如果您使用了大量外部库,并且根据您将光线跟踪结果显示到屏幕的方法,可能会有一些改进转移到基于C的实现。

如果您使用效率低下的算法以及学习新语言的一大堆头痛,那么切换到C / C ++会给您带来边际收益。 正确编写的Java可以实现大约70-80%的类似C / C ++代码的速度,并且对于非商业光线跟踪器应该足够好。 我假设光线跟踪器现在功能完整,所以我的建议是学习如何使用分析器来检测代码中的瓶颈。 还记得80/20规则(或者是90 / 10,75 / 25左右?),你的程序花80%的时间运行20%的代码。

更好的算法通常比语言切换提供更好的性能提升。

我认为这个问题已被回答为是一个非解释性语言,99.99%的案例比VM下的相同算法运行得更快。 这说(在java和c / c ++中你的图像处理工作很多,内存和时间都很重要)我认为你应该首先尝试优化你的代码,这里是我的建议:

  • 尝试使用分析器找到代码的瓶颈。 我们有时会省略很多东西可以通过这些工具来解决(比如类型转换,不必要的对象创建,最初应该优化的大多数关键功能)探查器必须是你的朋友。

然后(我只能看到几个关于光线追踪的例子):

  • 用查找表替换tan / sin / cos(只要你可以)或近似函数
  • 尝试处理每个数组的数据而不是每个样本
  • 尝试使用多个线程
  • ...

现在这些东西“很好”,但如果速度对你来说真的很重要,我不会建议使用ac或c ++语言(即使你可以)但更有可能专注于OpenCL。 这可能是最好的工具,最适合建立射线追踪引擎。 想象一下你不是在谈论30%的改进,但更可能是10'000%(快100倍)这是一个java界面: http//jogamp.org/jocl/www/祝你好运:-)

光线跟踪的效率取决于您的加速结构。 使用C ++而不是Java肯定会有所帮助。 但是,如果缺少BVH或Kd-tree等高效结构,则您使用的任何语言的光线跟踪器都会很慢。

如果这只是一个爱好,我建议继续使用Java。 如果你想加载像Stanford Buddha或Thai这样的复杂模型,你肯定应该转向C ++并开始阅读“基于物理的渲染”: http//www.pbrt.org/你可以在http下载第4章免费://pbrt.org/pbrt-2ed-chap4.pdf

简而言之,您可以根据项目的目标回答您的问题。 简单的爱好=留在Java上。 具有复杂模型的实时RT = C ++

几年前我用Java做过一个简单的光线跟踪器。 对于非常简单的网格(着名的茶壶3D网格和兔子3D网格),我可以使用实时渲染进行计算。 所以我想你也可以这样做=)

如果它是业余爱好,坚持使用Java,那么转向C ++是不值得的。 而不是改变语言,想想你可以在哪里改进你的代码(找到在log(n)时间内被光线击中的三角形,多线程编程等......)

我的猜测是你会看到c或c ++的显着性能提升。 您可以尝试使用类似的工具转换代码这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM