Java:多线程和二维线程
Java: Multi-Threading and 2D threads
我正在制作一个可以工作但还没有照明的光线追踪器。对于那些不知道的人,光线追踪器的工作原理是通过屏幕的每个像素从相机(观察者)发出光线,测试 3D 对象的碰撞 space,如果光线发生,则为像素着色撞到一个物体。
你必须运行计算每个像素,这是很多计算。所以我为每一列像素都有一个线程。目前,我正在实施 Runnable。这提高了程序的速度,并且对外部进程的整体处理速度没有明显影响(这很好)。
对于照明,我将采用 3D 中的点 space 相机光线与物体相交的位置,并确保应该点亮该点(考虑到所有存在的光源,这有可能足以保证多线程)。
我认为让线程创建更多线程(2D 线程)是一种糟糕的做法,但是是否有一些库或实现它的方法可以提高效率?我知道这不会导致无限递归,但我也不想超载我的 CPU。从本质上讲,我如何安全地处理需要“2D 线程”的过程?
您可以只使用 ExecutorService
来管理您的线程。也许尝试使用 Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
.
您的 Runnable
实施可以创建更多 Runnable
个实例并将它们提交给同一个 ExecutorService
。如果您确定它不会创建无限递归,它应该 运行 完成并且不会使用超过硬件可用线程的线程。唯一需要注意的是,不要创建太多 Runnable
个实例,以免 运行 内存不足。您还需要跟踪所有 Runnable
实例何时完成,但该服务提供了执行此操作的机制(请参阅 Java API 中的 Future
)。
如果您对每个线程执行一列,那么您将失去平铺的优势之一——光线相干性。虽然,老实说,我从来没有发现它有什么特别的优势,但话又说回来,我不在 Arnold 或 Mental Ray 上工作......我会尝试从单一光线开始并提高你的质量和 pps尽可能高,然后将图像的正方形分给不同的线程...
我正在制作一个可以工作但还没有照明的光线追踪器。对于那些不知道的人,光线追踪器的工作原理是通过屏幕的每个像素从相机(观察者)发出光线,测试 3D 对象的碰撞 space,如果光线发生,则为像素着色撞到一个物体。
你必须运行计算每个像素,这是很多计算。所以我为每一列像素都有一个线程。目前,我正在实施 Runnable。这提高了程序的速度,并且对外部进程的整体处理速度没有明显影响(这很好)。
对于照明,我将采用 3D 中的点 space 相机光线与物体相交的位置,并确保应该点亮该点(考虑到所有存在的光源,这有可能足以保证多线程)。
我认为让线程创建更多线程(2D 线程)是一种糟糕的做法,但是是否有一些库或实现它的方法可以提高效率?我知道这不会导致无限递归,但我也不想超载我的 CPU。从本质上讲,我如何安全地处理需要“2D 线程”的过程?
您可以只使用 ExecutorService
来管理您的线程。也许尝试使用 Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())
.
您的 Runnable
实施可以创建更多 Runnable
个实例并将它们提交给同一个 ExecutorService
。如果您确定它不会创建无限递归,它应该 运行 完成并且不会使用超过硬件可用线程的线程。唯一需要注意的是,不要创建太多 Runnable
个实例,以免 运行 内存不足。您还需要跟踪所有 Runnable
实例何时完成,但该服务提供了执行此操作的机制(请参阅 Java API 中的 Future
)。
如果您对每个线程执行一列,那么您将失去平铺的优势之一——光线相干性。虽然,老实说,我从来没有发现它有什么特别的优势,但话又说回来,我不在 Arnold 或 Mental Ray 上工作......我会尝试从单一光线开始并提高你的质量和 pps尽可能高,然后将图像的正方形分给不同的线程...