Я пишу простой raycaster в C#, используя OpenTK. Я хочу, чтобы мое представление обновлялось 60 раз в секунду, поэтому у меня есть таймер, вызывающий мою функцию Render(), которая показывает текстуру на экране.фоновая резьба рендеринга текстуры
Я хочу использовать рекурсивную функцию для рендеринга моей сцены, разделив ее на более мелкие прямоугольники и визуализируя каждый до тех пор, пока размер прямоугольника не станет равным 1px. Моя рекурсия записывает цвета пикселей в байтовый массив, которые мне нужно преобразовать в текстуру. Рекурсия довольно медленная, поэтому я хочу запускать ее в потоке backgroud всякий раз, когда меняется моя сцена.
Каков правильный способ синхронизации потоков, так что один записывает в массив текстур (занимает около секунды), но другой поток читает его каждые 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);
}
}
в другом потоке:
raycasting_texture = TexUtil.CreateRGBTexture(width, height, texture);
Показать свою работу здесь .. –