Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 背景线程渲染纹理_C#_Multithreading_Opentk_Raycasting - Fatal编程技术网

C# 背景线程渲染纹理

C# 背景线程渲染纹理,c#,multithreading,opentk,raycasting,C#,Multithreading,Opentk,Raycasting,我正在用C#编写一个简单的raycaster,使用OpenTK。 我希望我的视图每秒刷新60次,所以我有一个计时器调用我的Render()函数,它在屏幕上显示纹理 我想使用一个递归函数来渲染我的场景,方法是将场景分割成更小的矩形,并渲染每个矩形,直到矩形大小为1px。我的递归将像素的颜色写入字节数组,我需要将其转换为纹理。递归非常慢,所以每当场景发生变化时,我都希望在后台线程中运行它 同步线程的正确方法是什么,一个线程写入纹理数组(大约需要一秒钟),而另一个线程每1/60秒读取一次,然后在屏幕上

我正在用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
    设置为更新的缓冲区索引来发出信号

  • 让另一个线程定期读取
    更新\u buffer
    ,并保留其最新值的副本。当该副本和int不同步时,更新副本并将纹理上载到内存

请注意,此解决方案依赖于以下几点:

  • 只有两个线程处理字节数组缓冲区

  • updated_buffer
    仅由(纹理)使用者线程读取,由生产者线程写入

  • 最重要的是,纹理上传速度明显快于计算速度

  • 如果#2或#3被破坏,则必须对纹理缓冲区(如互斥)使用更严格的同步方法,以确保纹理缓冲区在仍被上载时不会被覆盖


    最后,您的递归计算可以通过移动到低于某个阈值(例如8*8像素块)的迭代来获得轻微的提升,而不是一直向下移动到1px。事实上,以迭代的方式完成这一切应该会更快(如果在单个核心上的单个线程中完成),尽管这在很大程度上取决于计算像素的算法。

    您有几个选项可以尝试,但是我会这样做:

    • 有两个缓冲区用于将纹理存储为字节数组,例如
      0
      1

    • 在一个缓冲区中进行纹理计算

    • 完成后,通过将
      volatile int updated_buffer
      设置为更新的缓冲区索引来发出信号

    • 让另一个线程定期读取
      更新\u buffer
      ,并保留其最新值的副本。当该副本和int不同步时,更新副本并将纹理上载到内存

    请注意,此解决方案依赖于以下几点:

  • 只有两个线程处理字节数组缓冲区

  • updated_buffer
    仅由(纹理)使用者线程读取,由生产者线程写入

  • 最重要的是,纹理上传速度明显快于计算速度

  • 如果#2或#3被破坏,则必须对纹理缓冲区(如互斥)使用更严格的同步方法,以确保纹理缓冲区在仍被上载时不会被覆盖


    最后,您的递归计算可以通过移动到低于某个阈值(例如8*8像素块)的迭代来获得轻微的提升,而不是一直向下移动到1px。事实上,以迭代的方式完成这一切应该会更快(如果在单个核心上的单个线程中完成),尽管这在很大程度上取决于计算像素的算法。

    在此处显示您的工作。.在此处显示您的工作。。
        raycasting_texture = TexUtil.CreateRGBTexture(width, height, texture);