【发布时间】:2014-09-29 22:05:50
【问题描述】:
所以我一直在使用纯 Java 开发一个简单的实时光线追踪器,现在我的大部分东西都能正常工作,从漫射照明和镜面高光到光线反射和折射,我开始想知道我是否可以制作一款简约的冒险游戏使用我的这个新引擎。唯一阻止我这样做的是在高于 512x512 的分辨率下表现不佳。
因此,我决定阅读一些有关 Java 中的多线程的知识,因为我以前的项目从来不需要多个线程,所以我以前没有关于该主题的经验。因此,在那之后,我尝试了各种实现多线程渲染的方法,最终达到了 4 个线程分别渲染屏幕的给定部分并将其传递给代表屏幕的缓冲图像的像素数据的地步。我对此很满意,现在唯一真正的问题是将渲染与更新整个图像同步,我尝试了多种方法来做到这一点,但无法提出任何好的建议,它总是闪烁或有一些噪音或者是块状的,因为即使刷新屏幕,也一直在渲染内容。
这是我在github上的项目源代码,渲染在Engine.java中完成:https://github.com/Harha/JRay
我试图通过谷歌和直接从stackoverflow寻找答案,但没有运气,过去似乎没有人真正公开做过这样的事情,或者我只是不擅长搜索东西。无论如何,我没有想法,想知道这里是否有人可以提出一些明智的答案,可用于将所有渲染线程与更新位图的主线程同步。
在此先感谢,我绝不想被人喂食,但正如我所说,我真的对此一无所知...
编辑:这是我的固定运行循环。
/*
* Main run method.
* Handles the update and render methods.
*/
public void run() {
for (int i = 0; i < THREAD_COUNT; i++) {
updateDelta(i);
lastFPS[i] = getTime();
}
requestFocus();
while (running) {
updateDelta(0);
update(delta[0]);
runRenderThreads();
try {
e.awaitTermination(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
render();
}
stop();
}
渲染线程等待 10 毫秒来完成给定的任务,如果超过了这个时间,它只会将图像渲染到 render() 中的缓冲区并重新开始,而不关心任务是否堆积。
【问题讨论】:
标签: java rendering real-time raytracing