21.3完全异步的多线程模型


## 21.3 完全异步的多线程模型 当我沿用上一节的多线程模型继续往下开发时,遇到了一个无法解决的问题。 为了性能,需要尽可能的将渲染任务设置为非阻塞的,非阻塞任务意味着我无法从渲染线程获得反馈。 以创建VAO为例,主线程发出创建VAO非阻塞任务,然后我没办法使用它,因为想使用它就需要VAO的ID。 这就是GPU资源管理问题。 这让我想起了以前在游戏中写的资源异步加载,每个加载任务都会创建一个Handle与之对应,这种设计模式也可以照搬到多线程渲染。 下面看下基于Handle的多线程同步模式。 基于Handle的同步模型原理 仍然以创建VAO为例,主线程发出创建VAO非阻塞任务时,先创建一个VAO Handle。渲染线程创建VAO后,将Handle与VAO ID映射起来,存放到HashM...

## 21.3 完全异步的多线程模型 当我沿用上一节的多线程模型继续往下开发时,遇到了一个无法解决的问题。 为了性能,需要尽可能的将渲染任务设置为非阻塞的,非阻塞任务意味着我无法从渲染线程获得反馈。 以创建VAO为例,主线程发出创建VAO非阻塞任务,然后我没办法使用它,因为想使用它就需要VAO的ID。 这就是GPU资源管理问题。 这让我想起了以前在游戏中写的资源异步加载,每个加载任务都会创建一个Handle与之对应,这种设计模式也可以照搬到多线程渲染。 下面看下基于Handle的多线程同步模式。 基于Handle的同步模型原理 仍然以创建VAO为例,主线程发出创建VAO非阻塞任务时,先创建一个VAO Handle。渲染线程创建VAO后,将Handle与VAO ID映射起来,存放到HashMap中。 主线程发出使用VAO非阻塞任务时,携带Handle作为参数。渲染线程拿到Handle,从HashMap找到对应的VAO ID,去使用。 映射关系管理 我这里使用自增的Index来作为Handle,每一种GPU资源都分配单独的Index。 生成Handle 对创建VAO任务结构进行改造,删除...

发布者: 作者: 转发
评论区 (0)
U