首页 > 其他分享 >OpengGL 中的同步及资源共享

OpengGL 中的同步及资源共享

时间:2023-10-21 15:11:06浏览次数:29  
标签:资源共享 同步 OpenGL API OpengGL context GPU GL

1. 为什么需要同步

由于 OpenGL API的执行是异步的,所以需要同步,如果是这些API是同步的就没有这个话题了。异步API可以进行缓存,从而可以在合适的时机批量的将这些API调用(称为API命令)发送给GPU执行,避免应用过于频繁的在内核态和用户态切换。

这里的异步指的是一个GL API调用结束并不表示它已经被GPU执行了。GL命令会先被GPU驱动程序缓存在内存中,然后在某一个时机驱动程序再把GL命令发送到GPU硬件中,GPU硬件中有个命令队列,GPU会从这个队列中取出命令进行执行。所以一个GL命令会经过2次缓存,一次在GPU驱动程序中,一次在GPU硬件中。

 

2. OpenGL 提供的GL同步机制

正常情况下处于缓存中的命令什么时候被实际执行应用是不知道的,但是如果应用需要使用这些GL命令执行的结果,比如把渲染的结果作为位图读到内存,这个时候就必须要保证所有的GL绘制命令都被执行完成才可以,否则读到的位图就是不完整的,这里就需要同步机制,在单个GL Context中,OpenGL会保证这里需要的同步,这种同步属于隐式同步(Implicit synchronization),也就是说这个同步不需要应用主动发起,而是OpenGL内部帮我们实现的。在单个GL Context中一般来讲应用都不需要主动使用同步机制,GL内部会在需要的时候进行隐式同步。

在多GL Context的时候情况就不一样了,比如进程中有两个GL Context,称为 ContextA 和 ContextB,ContextA 负责生成Texture,ContextB负责使用Texture,此时就需要保证在ContextB使用Texture之前Texture是完整的,如果此时用于生成Texture的GL命令还没有执行完毕,那么应用就需要主动调用同步机制来保证这些GL命令已经执行完毕。这种同步机制就是显式同步(Explicit synchronization)

在OpenGL中显式同步使用Sync Object机制实现。涉及的API包括:

 这些API在 OpenGL3.2 或者 OpenGLES3.0 以上才支持,而chromium中要兼容 OpenGLES2.0,因此 chromium 使用类似的扩展,比如GL_ARB_syncGL_APPLE_fenceEGL_KHR_fence_syncGL_NV_fence等来解决这个问题。

3. OpenGL 资源共享

在一个应用中可以有多个线程,每个线程都可以创建自己的GL Context,所以可以实现让一些线程来专门生成资源,另一些线程来使用资源从而提高性能,这种资源的使用方式称为资源共享。

在 OpenGL 中可以使用 share group 来实现资源在不同Context之间的共享。创建share group的的API如下:

 使用演示:

 

这里创建了三个 context,第一个context不需要指定share_context参数,后面两个context指定之前创建的context为share_context,这样这三个context之间就可以共享texture等资源了,我们称这三个 context 在同一个 share group 中。

此时资源可以共享了,但由于资源处于不同的线程(不同的Context)中,因此需要对资源的访问进行显式的同步控制。

 

标签:资源共享,同步,OpenGL,API,OpengGL,context,GPU,GL
From: https://www.cnblogs.com/rmb999/p/17779004.html

相关文章

  • android 友盟SNS_SDK为Android应用加入SNS分享、同步功能
    使用友盟SNS_SDK为Android应用加入SNS分享、同步功能很多朋友在开发Android应用的过程中,都想加入社会化的分享功能,如将自己的应用使用状态或心得同步到新浪微博、人人网或腾讯微博等。这些社交网络或微博都已经发布了针对开发者的开放平台(关于开放平台的相关信息,请参考《说说微......
  • 多线程编程同步:Posix信号量
    信号量的定义IPC是进程间通信(interprocesscommunication)的简称。狭义上,IPC主要用于进程间;广义上,IPC可用于进程间或线程间。Posix消息队列、Posix信号量和Posix共享内存区合称为“PosixIPC”.信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段。......
  • 00-开源离线同步工具DataX3.0重磅详解!
    1概览DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。1.1设计理念为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传......
  • Canal实现缓存同步策略
    Canal介绍个人在学习Redis的过程中,遇到多级缓存的处理方法,我本人的多级缓存分类里面提到过个人学习中的项目构成。简单来说就是OpenResty集群负责缓存一些静态性比较强的数据,比如说这个网页上的分类信息等基本不变化的数据,而Redis和JVM进程缓存(使用Caffeine实现)负责缓存变化性......
  • 使用SyncFavor进行文件同步
    SyncFavor是基于C#开发的免费文件同步工具,运行在windows上,下载链接:https://github.com/bsmith-zhao/sync同步管理界面:批量运行界面: 主从同步示例 下载压缩包解压,双击sync.exe启动同步管理器,可以看到空白的管理界面:点击工具栏的[添加工作区]创建工作区,工作区是一系列......
  • MySQL主从复制无法同步删除操作吗?【转】
    简介在MySQL主从复制中,当主库执行删除操作时,从库并不会同步删除对应的数据。这是由于MySQL的复制机制决定的。为了解决这个问题,我们可以通过在主库上创建触发器来实现删除操作的同步。解决方案概览下面是解决方案的整体流程图: 创建触发器首先,我们需要在主库上创建一个触发......
  • 多线程编程同步:读写锁
    读写锁的定义互斥锁锁住后,保证仅有一个线程处理数据(多线程共享的)。要是数据的读取比写入更频繁,且读取操作不涉及共享变量的修改,应允许多个线程读取操作对共享变量的读取。直接使用互斥锁效率太低,若使用读写锁,可以大大提高效率。读写锁的分配规则:1)只要没有线程持有某个特定的读......
  • kettle同步mysql到mysql
    上传mysql驱动包到lib目录下创建表连接表输入表输出(没有创建表)执行表创建表sql ......
  • vue中同步方法的实现
    这篇文章主要介绍了vue中同步方法的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教目录vue同步方法实现有三种实现方式vue中的同步和异步问题同步异步总结vue同步方法实现有三种实现方式1、axios本身属于Promise利用函数式的then获取请求返回结......
  • java批量执行atax同步MySQL表时出现卡住问题处理
    中断问题和datax中自带的MySQLjar包版本有关,更换后即可。背景:有个需求需要把服务器上的mysql业务库数据同步到另一台服务器上,我选择了datax来做批量同步操作。现象:java批量执行的代码写好后,在自己电脑(win10)执行没问题,换了一台电脑(也是windowsserver2019),报以下错误://执行以......