设置同步

对于没学过操作系统的同学,可能不是特别清楚信号量和内存屏障大概是干什么用的

什么是信号量呢?

信号量是一个用来同步不同线程之间的操作的一个值,保持在0至指定最大值之间(这里我们用1就行,也就是说atom bool其实是我们的最好的选择) 当一个线程等待一个信号量的时候就-1,释放一次信号量的时候就+1,这里因为我们使用的一个bool所以就false true就行了. 信号量的计数值大于0(true),为signaled(有信号)状态;计数值等于0(false),为nonsignaled(Iphone没信号)状态. 给大家付个图片帮助大家理解 信号量

那什么又是内存屏障呢?

其实这个东西的出现跟我们现在使用的垃圾CPU有关系 我们的垃圾CPU为了提升运行速度多半采取了乱序执行,而某些操作我们必须让他进行同步执行,设置内存屏障就保证了这个内存的访问是严格按照顺序执行的.要注意的一点是内存屏障的实现上在Windows系统上和类Unix系统上都是不太一样的,常见的垃圾x86会在linux下编译出这种傻逼的代码,给大家当笑话,缓解一下学习计算机图形学的枯燥

准备好了吗

addl $0,0 (%esp)

哈哈哈哈哈...你们觉得不好笑吗

// image_available_semaphores 图片可用的信号量  render... 渲染结束的信号量  in... 正在传输的墙(内存屏障)
// 这个实现虽然有点捞但是比较容易看懂
let (image_available_semaphores, render_finished_semaphores, in_flight_fences) = {
    let mut image_available_semaphores: Vec<<back::Backend as Backend>::Semaphore> = vec![];
    let mut render_finished_semaphores: Vec<<back::Backend as Backend>::Semaphore> = vec![];
    let mut in_flight_fences: Vec<<back::Backend as Backend>::Fence> = vec![];
    for _ in 0..frames_in_flight {
        in_flight_fences
            .push(device.create_fence(true).map_err(|_| "创建内存屏障失败")?);
        image_available_semaphores
            .push(device.create_semaphore().map_err(|_| "创建信号量失败")?);
        render_finished_semaphores
            .push(device.create_semaphore().map_err(|_| "创建信号量失败")?);
    }
    (
        image_available_semaphores,
        render_finished_semaphores,
        in_flight_fences,
    )
};

results matching ""

    No results matching ""