加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 线程缓慢且难以预测?

发布时间:2020-12-15 05:36:52 所属栏目:百科 来源:网络整理
导读:我已经创建了光线跟踪器的基础,这是我绘制场景的测试函数: public void Trace(int start,int jump,Sphere testSphere){ for (int x = start; x scene.SceneWidth; x += jump) { for (int y = 0; y scene.SceneHeight; y++) { Ray fired = Ray.FireThroughPi
我已经创建了光线跟踪器的基础,这是我绘制场景的测试函数:
public void Trace(int start,int jump,Sphere testSphere)
{
    for (int x = start; x < scene.SceneWidth; x += jump)
    {
        for (int y = 0; y < scene.SceneHeight; y++)
        {
            Ray fired = Ray.FireThroughPixel(scene,x,y);

            if (testSphere.Intersects(fired))
                sceneRenderer.SetPixel(x,y,Color.Red);
            else sceneRenderer.SetPixel(x,Color.Black);
        }
    }
}

SetPixel只是在一维颜色数组中设置一个值.如果我通过直接调用它来正常调用函数它以恒定的55fps运行.如果我做:

Thread t1 = new Thread(() => Trace(0,1,testSphere));
t1.Start();
t1.Join();

它以50fps的速度运行,这很好并且可以理解,但是当我这样做时:

Thread t1 = new Thread(() => Trace(0,2,testSphere));
Thread t2 = new Thread(() => Trace(1,testSphere));

t1.Start();
t2.Start();

t1.Join();
t2.Join();

它遍布整个地方,在30-40 fps之间快速移动,有时超出50或者降到20,它根本不是恒定的.为什么它比在单个线程上运行整个事情时运行速度慢?我正在运行四核i5 2500k.

解决方法

如果没有分析您的应用程序,这很难回答,但我会怀疑虚假分享.

两个线程都写入共享内存结构,这将导致CPU缓存保持无效.

测试的简便方法是为每个线程创建一个单独的输出数组.

它不必工作 – 只需看看帧速率.

我前段时间写了一篇关于此的文章:“Concurrency Hazards: False Sharing”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读