#光线追踪 #CGI #渲染

bin+lib rtrace

一个用于测试整体伪性能和多线程的宠物光线追踪器

3个版本 (1个稳定版)

使用旧的Rust 2015

1.0.0 2017年1月2日
0.2.0 2015年5月18日
0.1.0 2015年2月11日

#948 in 图形API

BSD-3-Clause

340KB
1.5K SLoC

Rust 1K SLoC // 0.0% comments Go 363 SLoC // 0.0% comments C++ 113 SLoC

title

追踪之旅 5:帝国的崛起

在《SHA1性能之旅》等电影成功故事的之后,又有一场性能之旅,寻求前所未有的基准测试结果!

这是星历20.15.01.31,在一个由敏捷的Gofer和古老的Ceepeporg统治的宇宙中,在这里,RaySpheres™的生产是唯一的目标,越快越好。遇见Rustaceans,一个年轻的物种,跟随他们好奇的独立之旅和在宇宙中生产最多的RaySpheres。

如何运行

在相应的源文件夹中运行make就可以生成图像。我们假设您已安装了rust、go和gcc,并已添加到您的PATH中。

# rust
make image
# go
make -C src/go image
# c++
make -C src/cpp image

# Use more cores with go implementation to witness speedup
GOMAXPROCS=4 make src/go image
# Same with rust
RTRACEMAXPROCS=4 make image

第一季季终

rtrace-image

尽管Rustacean的RaySpheres由于改进的着色算法而非常漂亮,但在单核上我们并不是最快的。由于某种原因,C++比它创建20,000个以上球体场景时的效率低,并且即使它使用虚方法调用,速度也快了7%

只有在Rust进入多线程渲染模式时,它才是镇上最快的,因为C++在这种情况下没有实现多线程。

不要忘记,Go,无论什么情况,都要慢大约三倍。

第二季预告

第二季要做的...

  • 让多个线程共享单个图像缓冲区,并相应地处理生成的危险代码。
  • 目前,我们使用的内存比所需的更多,因为每个线程都拥有自己的64x64x4 u8字节缓冲区,然后写入一个类似最终帧的全尺寸缓冲区。
  • 使用piston窗口进行实时渲染可视化(除图像输出外)
  • 实现带有欠采样和简单相机控制的交互式渲染。
  • 使用鼠标指针将渲染焦点放在下面的桶上

经验教训

  • 不要在泛型中参数化原始数字类型,而应使用类型别名。这样,代码整体更简单,您可以在代码中使用数字字面量。如果您只是想测试不同的数字类型如何影响您的运行时性能,这是可行的。
  • 在使用多线程时,线程使用的所有内容都需要有静态生命周期。为了确保这一点,您可以在
    • 线程内创建资源,处理它们,并通过通道发送特定结果。
    • 通过 Arc 传入只读共享资源。后者是堆上的引用计数项。
    • 通过 Arc<Mutex<R>> 传递可写资源以允许同步访问。
    • 是的,目前无法在资源在栈上分配并由保证资源在线程运行期间保持活跃的守卫保护的情况下,发出资源可用于使用的信号。

原始出处

基于 go 的光线追踪器最初由 Jack Palevich 编写。更多信息,请参见 http://grammerjack.blogspot.com/2009/11/multi-threaded-go-raytracer.html

依赖项

~1MB