设置同步
对于没学过操作系统的同学,可能不是特别清楚信号量和内存屏障大概是干什么用的
什么是信号量呢?
信号量是一个用来同步不同线程之间的操作的一个值,保持在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,
)
};