调试最长的一帧(第27天)

2023-10-26

对于几个多线程渲染中的成员变量

 

继续抄一抄,

 

Block阻塞器

BlockCount;计数器类。它与阻塞器类的使用方法基本相同。block()阻塞线程

release()释放线程

不过除此之外,BlockCount的构造函数还可以设置一个阻塞计数值。

计数的作用是,每当阻塞器的completed()函数被执行一次,计数器就减1,直至减到0就释放被阻塞的线程。

Barrier类,线程栅栏类。这是一个对于线程颇为重要的阻塞器接口。

它的构造函数与BlockCount类似,可以设置为一个整数值,我们可以把这个值理解为栅栏的强度。

每个执行了Barrier::block()函数的线程都将被阻塞。当被阻塞在栅栏处的线程达到指定的数目时,就好比栅栏无法支撑那么大的强度一样,展览将被冲开,所有的线程将被释放。重要的是,这些线程是几乎同时释放的,也就保证了线程执行的同步性。

从代码中,也很容易看到。BlockCount是由其他任意线程执行指定次数的completed()函数,即可释放被阻塞的线程;而Barrier则是必须阻塞指定个数的线程之后,所有的线程才会同时被释放。

其实这些都不用死记硬背,看看源码就一目了然了。

OSG多线程渲染实现的关键在于以下三个变量,用与对线程阻塞与同步的操作,

 

osg::BarrierOperation类在定义时会传入两个参数。整型参数定义了这个栅栏可阻塞的线程数,或者说它的强度(达到这一数值时将自动释放所有线程),另一个则定义是否需要在阻塞前执行固定的操作(通常不用,即BarrierOperation::NO_OPERATION)

osg::EndOfDynamicDrawBlock在定义时会传入一个参数,表示阻塞的最大计数值。当阻塞器对象的completed()函数执行次数达到这一数值时,才会释放被阻塞的线程。

 

这边都+1,是因为在主进程中block一下,以便释放所有block的线程。如不需要等待所有线程完成即可下一帧,则只需要主进程的这1个block即可。在渲染开始时,需要同步其他线程,设定为contexts.size()+1或者camera.size()+1即可。主线程的为1,其他线程为context.size()或者camera.size();

 

 

上面两个开启线程的方法,会在后面的电子书介绍,所以暂时放在这里,不扩展。

 

在这两者之间,其实就是单线程渲染方式顺序执行各个图形设备的筛选和绘制工作,概括起来就是

在CullDrawThreadPerContext和DrawThreadContext方式下,由于gc->getGraphicsThread()为真,因此不再执行GraphicsContext::runOperations(),也就是不再从主进程的renderingTraversals函数中执行场景绘制;而在更加高效也更加复杂的cullThreadPercameraDrawThreadPercontext方式下,不只场景绘制不再由主进程来进行,由于camera->getCameraThread()也为真,因此筛选动作也是由摄像机线程来完成的。

这点可以验证下,看看走哪里

 

 

 

可见绘制是摄像机线程完成的。具体不展开,因为电子书后面还有,到时候再根据电子书内容慢慢调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试最长的一帧(第27天) 的相关文章

  • 调试最长的一帧(第27天)

    对于几个多线程渲染中的成员变量 继续抄一抄 Block阻塞器 BlockCount 计数器类 它与阻塞器类的使用方法基本相同 block 阻塞线程 release 释放线程 不过除此之外 BlockCount的构造函数还可以设置一个阻塞计数
  • 调试最长的一帧(第19天)

    这个主要是理论了 抄一抄 最常用到场景管理方式时场景节点树结构 场景树顶点的叶节点osg Geode包含了各种需要渲染的几何体的顶点和渲染状态信息 而组节点osg Group及其派生出的各种特殊功能节点则作为场景树的各个枝节节点 它们也可以
  • osgFBO(十四)PrerenderOrder的使用

    由于前面是简单的demo 所以不用管渲染次序 然而 实际项目中 会出现多种渲染方式 这时候就要用到 camera gt setRenderOrder osg Camera PRE RENDER 还要加上具体次序 比如 采样摄像机设为2 处理
  • osg传递数组到shader,(以qedl为例)

    一 对float类型的数组 osg ref ptrosg FloatArray m dampingPixelDist 赋值 void ccBilateralFilter updateDampingTable m dampingPixelDi
  • osgFBO(十)多pass-3,pass3,shader将背景从绿色变为蓝色

    pass3和pass2类似 只是再熟悉下 这个Pass设定为最后一步 可以不再输出纹理 即 1 pass3摄像机输入tex2 osg ref ptr
  • qedl中的fixDepth()简化

    如果将PerspectiveMode的设置为1 则会传递zNear和Zfar 在fixDepth 中 而将perspectiveMode 0 则大大简化fixDepth float fixDepth float depth return c
  • osg fbo(一),生成颜色缓冲区图片

    由于工作需要 重新捡了下shader 很明显 fbo是重中之重 好记性不如烂笔头 先记录下 1 生成一个颜色纹理 为了省事 可以将纹理宽高 屏幕宽高 osg ref ptr
  • 调试最长的一帧(第七天)

    先看看总体进展 eventTraversal函数的任务 在每帧仿真过程中 取出已经发生的所有事件 摒弃哪些对场景不会有助益的 比如 在视口外的鼠标事件 依次交付给各个事件处理器 最后清空现有的事件队列 等待下一帧的到来 在View的几个成员
  • osg fbo(三),将颜色缓冲区图片通过shader变绿

    这个其实很简单 一 写顶点着色器和片元着色器 static const char vertexShader void main void n n gl Position ftransform n n static const char ps
  • 调试最长的一帧(第17天)

    先看看流程 电子书上介绍了渲染器osgViewer Renderer类 osgViewer Renderer为摄像机渲染场景的工作提供了一个公共接口 当我们向视景器viewer添加了一个新的摄像机camera时 一个与摄像机相关联的渲染器R
  • 调试最长的一帧(第22天)

    先看看全流程 先抄一抄节点访问器NodeVisitor的工作原理 当我们执行节点的accept NodeVisitor nv 函数时 当前节点自动调哟个NodeVisitor apply方法 将自身的信息传递给节点访问器nv 由它负责执行相
  • 调试最长的一帧(第12天)

    先看看总体 流程走到了更新分页数据库 分页数据库的数据流图 先找上图的4个成员变量 上图中 左侧的图框表示数据的检索和输入 中间的白色图框表示用于数据存储的内存空间 而右边的图框表示存储数据的输出 此外 蓝绿色图框表示可以在DataBase
  • osgFBO(九)多pass---2,pass2,shader将背景从红色变为绿色

    二 pass2是比较完整的 同时有输入纹理和输出纹理 与pass1类似 这里只列出不同的地方 1 pass2摄像机输入tex1 osg ref ptr
  • 分页数据库其实就是两个生产者与消费者

    再次看osg 最长的一帧 因为分页数据库适合于PagedLod和ProxyNode 一般调试还得准备数据 比较麻烦 突然想起 和我以前封装的引擎类似 分页数据库就是几个生产者与消费者 回过头来看这个图 看似复杂 实际上并不复杂 如果简化 只
  • 调试最长的一帧(第14天)

    看看流程 可见分页数据库的更新也是和场景的筛选绘制是同时进行的 再看看大图 第14天要进行左下角的 依照惯例 跟过去 现在开始步入正轨 发现第0个fileName为空 这是有问题的 创建pagelod时修正为 这次进来了 在这里删除 放入r
  • 第二天(八)osg::Object* readObjectFile(const std::string& filename,const ReaderWriter::Options* options)

    目前流程是 osgViewer viewBase frame viewerInit 创建帧事件 并将漫游器与事件和视口相关联 gt osgViewer Viewer ViewerInit gt osgViewer View Init gt
  • 调试最长的一帧(第三天)

    先看看整体 以及进度 第三天的内容 主要讲根据窗口参数建立图形上下文设备 建立一个全屏显示的图形设备 这个WindowingSystemInterface是纯虚基类 也就是下一步就要父类调用子类了 获取或新建显示设置 各成员变量 成员变量的
  • osg+shader光照半透明

    先记录下 免得时间久了忘了 对于光照 光源有点光源 聚光灯 方向光 每种光源又有ambient diffuse specular emission几个属性 这里用点光源 不考虑衰减 1 diffuse是入射光与物体法线之间的余弦起作用 2
  • 调试最长的一帧(第21天)

    看看全流程 主要讲sceneview cull 跟过去 重点在cullstage 状态树与渲染树的构建都是在pushStateSet和popStateSet函数中完成的 而CullVisitor apply函数 在遍历节点时调用 则负责根据
  • 调试最长的一帧(第23天)

    看看总体进度 第22天通过CUllvisitor创建了渲染树和状态树 并进行必要的剔除 接下来进行排序和优化 RenderStage sort函数时按照前序渲染台 当前渲染台和后续渲染台的顺序进行 其中前序渲染台和后续渲染台通过Camera

随机推荐

  • 原生ajax 设置get请求参数和请求头信息和发送 post请求

    get请求发送参数直接在路径后面加问号即可 xhr open GET http 127 0 0 1 8000 server a 100 b 50 设置请求头信息 1 请求头中本来就有这个属性 只是修改该属性的值 xhr setRequest
  • ElasticSearch 查询语法

    环境 ElasticSearch6 4 2 以下查询请求方式均为Post 索引名 book 索引结构 mappings novel properties word count type interger author type keywor
  • Vue基础之指令与过滤器

    vue 简介 1 什么是 vue 官方给出的概念 Vue 读音 vju 类似于 view 是一套用于构建用户界面的前端框架 2 vue 的特性 vue 框架的特性 主要体现在如下两方面 数据驱动视图 双向数据绑定 2 1 数据驱动视图 在使
  • unity第一人称射击游戏,枪击游戏,功能完整可以当大作业或者毕设

    unity第一人称射击游戏 枪击游戏 含源码和exe导出文件 下载链接在文末 unity第一人称枪击游戏 分为海岛地图和沙漠地图 可以开镜射击 敌人可以移动 菜单页面有开始游戏 游戏说明 退出三个按钮 游戏有音效 可以通过ASDW移动人物
  • 查看jks证书内容

    keytool list v keystore xxx jks 输入密钥库口令
  • C++进阶必读书籍

    结合一些我的学习经历 希望对于想学C 的人有些帮助 大家有什么好想法望提出 我老师最初是从C语言教起的 用的是潭浩强的 lt
  • ajax day3

    3 将普通对象转为查询参数字符串形式 创建URLSearchParams参数 再用toString方法转为字符串 4 xhr对象 请求参数 body参数 5 promise promise对象一旦被兑现或拒绝 就是已敲定了 状态无法再被改变
  • Python模块之操作数据库MySQL篇

    目录 一 安装PyMySQL模块 二 操作数据库 1 连接数据库 2 执行sql语句 execute和executemany 3 创建数据表 三 操作MySQL数据表 1 新增数据 2 查询数据 3 修改数据 4 删除数据 5 踩到的坑 一
  • python批量读取Excel文件

    将同一个文件夹下的xlsx文件读取 import os import pandas as pd path r path of file for i in os listdir path df pd read excel os path jo
  • [读论文]CAAD-2018 Targeted Attack方向季军技术报告

    这次分享的是CAAD 2018比赛中Northwest Security团队的技术报告 该团队在此次比赛中取得了了targeted Attack 方向第三名 non targeted Attack方向第四名的成绩 题目 Leverage O
  • 构建 fluentd 镜像与部署应用

    本文将具体介绍如何在基础镜像 ubuntu 20 04 上搭建 fluentd 镜像 并且实现监控指定目录的日志文件 构建镜像 首先 从 docker hub 中挑选一个合适的基础镜像 例如 ubuntu 20 04 docker pull
  • 区块链+物联网=?

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 区块链与物联网 IoT 的交叉应用已成为最有前途的区块链用例之一 在过去的几个月里 IoTeX一直与我们的战略合作伙伴合作 并进行了独立的研究 为了能够在短期内采用
  • 新闻

    4月 中国科技产业智库甲子光年发布 AIGC应用与实践研究展望报告 及AIGC产业图谱 面向AIGC技术创新者 产业参与者 资本机构和政府等各方展现AIGC产业的整体生态环境和行业发展 华院数智人凭借其在生成式AI技术 人机交互能力和市场应
  • esp32+vscode环境搭建速记

    esp32idf vscode环境搭建速记 建议按照入下步骤进行 在vscode插件里安装esp32idf 或者用在线的下载器安装会出现一些莫名奇妙的问题 第一步 安装esp32idf 官方网址 https dl espressif cn
  • gridlayout java_Swing-布局管理器之GridLayout(网格布局)-入门

    网格布局特点 l 使容器中的各组件呈M行 N列的网格状分布 l 网格每列宽度相同 等于容器的宽度除以网格的列数 l 网格每行高度相同 等于容器的高度除以网格的行数 l 各组件的排列方式为 从上到下 从左到右 l 组件放入容器的次序决定了它在
  • idea中thymeleaf语法不提示的所有原因

    首先pom xml里面要导入thymeleaf的依赖 然后在html中加入 xmlns th http www thymeleaf org 最后点击file gt settings 查看插件是否使用 未使用点击打勾重启
  • AMS1117典型电路

    AMS1117 3 3V 5V 封装 常见应用连接 1 输入旁路电容Input Bypass Capacitor A 10uF tantalum on the input is a suitable input bypassing fora
  • 解决 SyntaxError:Unexpected end of JSON input 或 Unexpected token u in JSON at position 0 问题

    1 报错原因 JSON 接收的数据不完整 或者数据格式不符合要求 如 undefined 2 JSON 数据格式要求 1 JSON文件都是被包裹在一个大括号中 通过key value的方式来表达数据 2 JSON的Key必须包裹在一个双引号
  • Python 魔法方法(三) __getattr__,__setattr__, __delattr__

    1 getattr 当我们访问一个不存在的属性的时候 会抛出异常 提示我们不存在这个属性 而这个异常就是 getattr 方法抛出的 其原因在于他是访问一个不存在的属性的最后落脚点 作为异常抛出的地方提示出错再适合不过了 看例子 我们找一个
  • 调试最长的一帧(第27天)

    对于几个多线程渲染中的成员变量 继续抄一抄 Block阻塞器 BlockCount 计数器类 它与阻塞器类的使用方法基本相同 block 阻塞线程 release 释放线程 不过除此之外 BlockCount的构造函数还可以设置一个阻塞计数