C# 背景线程渲染纹理
我正在用C#编写一个简单的raycaster,使用OpenTK。 我希望我的视图每秒刷新60次,所以我有一个计时器调用我的Render()函数,它在屏幕上显示纹理 我想使用一个递归函数来渲染我的场景,方法是将场景分割成更小的矩形,并渲染每个矩形,直到矩形大小为1px。我的递归将像素的颜色写入字节数组,我需要将其转换为纹理。递归非常慢,所以每当场景发生变化时,我都希望在后台线程中运行它 同步线程的正确方法是什么,一个线程写入纹理数组(大约需要一秒钟),而另一个线程每1/60秒读取一次,然后在屏幕上打印C# 背景线程渲染纹理,c#,multithreading,opentk,raycasting,C#,Multithreading,Opentk,Raycasting,我正在用C#编写一个简单的raycaster,使用OpenTK。 我希望我的视图每秒刷新60次,所以我有一个计时器调用我的Render()函数,它在屏幕上显示纹理 我想使用一个递归函数来渲染我的场景,方法是将场景分割成更小的矩形,并渲染每个矩形,直到矩形大小为1px。我的递归将像素的颜色写入字节数组,我需要将其转换为纹理。递归非常慢,所以每当场景发生变化时,我都希望在后台线程中运行它 同步线程的正确方法是什么,一个线程写入纹理数组(大约需要一秒钟),而另一个线程每1/60秒读取一次,然后在屏幕上
byte[, ,] texture;
递归:
public void RenderAdaptively(int top, int left, int width, int height)
{
Color color = getColor(top, left);
for (int i = top; i < top + width + 1; i++)
{
for (int j = left; j < left + height; j++)
{
texture[i, j, 0] = color.R;
texture[i, j, 1] = color.G;
texture[i, j, 2] = color.B;
}
}
int halfw = width / 2;
int halfh = height / 2;
int newwidth = width - halfw;
int newheight = height - halfh;
if (width > 1 && height > 1)
{
RenderAdaptively(top, left, halfw, halfh, false);
RenderAdaptively(top + halfw, left + halfh, newwidth, newheight, false);
RenderAdaptively(top, left + halfh, halfw, newheight, false);
RenderAdaptively(top + halfw, left, newwidth, halfh, false);
}
}
您可以尝试多种选择,但我会这样做:
- 有两个缓冲区用于将纹理存储为字节数组,例如
和0
1
- 在一个缓冲区中进行纹理计算
- 完成后,通过将
设置为更新的缓冲区索引来发出信号volatile int updated_buffer
- 让另一个线程定期读取
,并保留其最新值的副本。当该副本和int不同步时,更新副本并将纹理上载到内存更新\u buffer
updated_buffer
仅由(纹理)使用者线程读取,由生产者线程写入最后,您的递归计算可以通过移动到低于某个阈值(例如8*8像素块)的迭代来获得轻微的提升,而不是一直向下移动到1px。事实上,以迭代的方式完成这一切应该会更快(如果在单个核心上的单个线程中完成),尽管这在很大程度上取决于计算像素的算法。您有几个选项可以尝试,但是我会这样做:
- 有两个缓冲区用于将纹理存储为字节数组,例如
和0
1
- 在一个缓冲区中进行纹理计算
- 完成后,通过将
设置为更新的缓冲区索引来发出信号volatile int updated_buffer
- 让另一个线程定期读取
,并保留其最新值的副本。当该副本和int不同步时,更新副本并将纹理上载到内存更新\u buffer
updated_buffer
仅由(纹理)使用者线程读取,由生产者线程写入最后,您的递归计算可以通过移动到低于某个阈值(例如8*8像素块)的迭代来获得轻微的提升,而不是一直向下移动到1px。事实上,以迭代的方式完成这一切应该会更快(如果在单个核心上的单个线程中完成),尽管这在很大程度上取决于计算像素的算法。在此处显示您的工作。.在此处显示您的工作。。
raycasting_texture = TexUtil.CreateRGBTexture(width, height, texture);