blast算法原理(blast分析原理)

http://www.itjxue.com  2023-02-25 04:05  来源:未知  点击次数: 

BlastBufferQueue 原理解读

Google针对新的同步机制,在BBQ对象JAVA层面设计了一系列功能接口,列举功能更新较大几个接口:

提供用于下一次缓冲区要更新的事务。 BBQ 不会立即提交此事务,通过该接口将下一帧的提交控制在调用者手中,调用者可以将其用于更高级别的同步。

将传入的事务合并到 BBQ 中的下一个事务。 当具有指定帧号的下一帧可用时,将直接与含有Buffer的事务进行合并并提交。

客户端可以监听Buffer的合成状态,在 SurfaceFlinger 中已应用包含带有 framenumber 的缓冲区的事务时触发回调,通知客户端合成完成。

与之前Android版本不同的是,Surface对象的创建、Buffer size与Surface size的更新也支持直接通过BBQ进行操作。

Android 12 Google将BufferQueue(简称BQ)组件从SF端移动到了客户端,BQ组件的初始化也放在BBQ的初始化中。通过类名可以看出BBQ更像是BQ的装饰者,在BQ本来功能特性的基础上添加了同步的功能。

通过官图大概了解,整个生产消费模型都在客户端,图形缓冲区的出队、入队、获取等操作都在客户端完成,预示着生产着模型从远程通讯变成了本地通讯, 消费者监听器也从SF端的 ContentsChangedListener 。带来的改变就是客户端需要通过事务Transaction来向SF端提交Buffer与图层的属性。

接下来以应用显示流程为例,梳理下BBQ的初始化流程:

应用端通过方法 relayoutWindow 向WMS服务申请窗口布局,创建应用对应SurfaceControl,随后根据SurfaceControl创建BlastBufferQueue:

frameworks / base / core / java / android / view / ViewRootImpl.java

BBQ主要核心逻辑的初始化都放在了Native对象的构造函数,做了以下几件事:

frameworks / native / libs / gui / BLASTBufferQueue.cpp

frameworks / native / libs / gui / BLASTBufferQueue.cpp

BLASTBufferItemConsumer (简称BBIC)继承自 ConsumerBase ,创建BBIC的同时,消费者模型与消费者监听器建立起了连接:

frameworks / native / libs / gui / ConsumerBase.cpp

frameworks / native / libs / gui / BufferQueueConsumer.cpp

这一步也就让 BBIC 建立了对Buffer状态的监听。接下来看BBQ如何有选择性的监听Buffer的状态。

BBIC 拥有监听Buffer所有状态的能力,BBQ对Buffer特定状态的监听离不开 BBIC,因此,BBQ 继承了两个抽象类 ConsumerBase 与 BufferItemConsumer ,分别针对 Buffer 消费状态与生产状态进行监听。

frameworks / native / libs / gui / BufferQueueConsumer.cpp

BBQ初始化完成,消费者模型建立完成,由于BBQ动态监听缓冲区的状态,如果有可消费的缓冲区,BBQ会触发缓冲区的事务提交:

通过梳理BBQ的初始化,对消费者端的大概流程有了一定的认识,接下来梳理下生产者方的代表,也就是Surface。Android 显示的的内容来源于各种绘制模块,而这些绘制模块需要与BQ建立连接,获取Buffer用以绘制,这样才能将绘制的画像通过BBQ提交给SF合成。Surface作为生产者模型与绘制模块之间桥梁,相关的流程掌握显得尤为重要。

绘制模块指的是那些图像生产者,如以使用SurfaceView、GlSurfaceView、TextureView控件为代表的Video模块、Camera模块、游戏应用等,以及使用软件绘制、硬件加速绘制为代表的普通控件。

回到创建BBQ的流程,在ViewRootImpl.getOrCreateBLASTSurface方法中,创建完BBQ,紧接着会创建Surface对象,直接看Native 对象的构造函数:

首先Surface的创建会传入生产者模型 GraphicBufferProducer ,这样Surface对象拥有了操作缓冲区的能力,同时在构造函数中Surface提供了一系列hook为首的函数,连接到 ANativeWindow 的函数指针,为的是给EGL模块提供对缓冲区操作的入口。而hook函数会直接调用内部的本地函数,以 hook_queueBuffer 为例:

同时软件绘制不需要通过hook函数来中转,当上层通过Surface.lockCanvas方法获取画布时会直接调用本地函数函数 Surface::dequeueBuffer 。

Surface只是绘制的中介,还需要与绘制模块进行连接后,绘制模块才能获取缓冲区和绘制图像数据,关于绘制模块如何连接到Surface,这里不做记录。

结合第一节的关于BBQ 重点API功能介绍与BBQ的初始化流程,回过头看下这三个API功能是如何实现的。

首先看 setNextTransaction 函数,调用者通过该接口可以实现将当前帧 Buffer 的提交权利控制在自己手中,同时可以加入其他图层想要的更新,然后提交,放在同一帧生效。可以思考下,如果当前帧的控制权交给了调用者,是否会导致下一帧的紊乱呢?看下这块流程:

这里BBQ做了线程阻塞的机制,当绘制模块绘制完成下一帧,并将Buffer放回了缓冲区队列,触发BBQ的 onFrameAvailable 回调,如果调用者使用了 setNextTransaction 函数传入了自定义事务,那么就会在 onFrameAvailable 函数中阻塞住线程, 暂停执行下一帧的 processNextBufferLocked 。而唤醒线程的任务交给了 releaseBufferCallback 函数。

当前帧会执行绘制提交函数 processNextBufferLocked ,但是不会立即提交,会将事务控制在自己手中。可以看到, releaseBufferCallback 的回调函数会通过 t-setBuffer传递到SF端。

也就是说当调用者主动提交事务后,SF端合成完成后会回调该通知,唤醒线程。否则会一直阻塞等待调用者提交。

大概流程如图示:

根据BBQ相关文档提示:

该机制在同步单个帧时阻塞在 UI 线程中很好,但在尝试同步多个帧时效果不佳。 它最终会减慢渲染速度。 相反,在 RenderThread 级别处理同步以允许 UI 线程继续处理帧

因此多帧同步还是有优化空间。

将调用者传入的事务合并到 BBQ 中的下一个事务。 当具有指定帧号的下一帧可用时,将直接与含有Buffer的事务进行合并并提交。也就是说将调用者事务所包含的其他对图层属性的更新合入到BBQ的事务中,与BBQ的事务在指定帧数一同生效。这个怎么实现的呢?

这个函数会将调用者传入的事务都保存在 mPendingTransactions 集合中,当执行到下一帧的

processNextBufferLocked 函数时,将集合中的事务都合入到BBQ事务中,然后直接提交:

大概流程如图示:

客户端可以监听Buffer的合成状态,在 SurfaceFlinger 中已应用包含带有 frameNumber 的缓冲区的事务时触发回调,通知调用者合成完成。

通过 t-addTransactionCompletedCallback 将 transactionCallbackThunk 回调函数传给了SF,当合成完成会触发回调,并通知调用者状态。

根据上面流程的梳理,用一张图总结下BBQ与相关模块之间的结构关系:

blast算法难点

内容复杂度高。blast算法是一种常用序列对比算法,其在进行计算时,由于其内容复杂度高,导致其容错率较低,在进行运算时较难。blast算法又名基本局部相似性比对搜索工具,是1990年所出现的。

详细介绍双序列比对、blast 以及多序列比对的区别,以及均适用于哪些场 景

序列比对是将两个或多个序列排列在一起,标明其相似之处。使用间隔表示未比对上,比对上的相同或相似的符号排列在同一列上。序列比对是生物信息学以及基因组学与进化的基础之一,其基本思想是:在生物学中普遍存在的序列决定结构、结构决定功能的规律,通过将核酸序列或者蛋白质序列的一级结构看成由基本字符构成的字符串,通过序列比对我们可以找到相似的序列并由此发现生物序列中的功能、结构和进化信息。

全局比对:全局比对是指将参与比对的两条序列里面的所有字符进行比对。全局比对在全局范围内对两条序列进行比对打分,找出最佳比对,主要被用来寻找关系密切的序列。其可以用来鉴别或证明新序列与已知序列家族的同源性,是进行分子进化分析的重要前提。其代表是Needleman-Wunsch算法。

局部比对:与全局比对不同,局部比对不必对两个完整的序列进行比对,而是在每个序列中使用某些局部区域片段进行比对。其产生的需求在于、人们发现有的蛋白序列虽然在序列整体上表现出较大的差异性,但是在某些局部区域能独立的发挥相同的功能,序列相当保守。这时候依靠全局比对明显不能得到这些局部相似序列的。其次,在真核生物的基因中,内含子片段表现出了极大变异性,外显子区域却较为保守,这时候全局比对表现出了其局限性,无法找出这些局部相似性序列。其代表是Smith-Waterman局部比对算法。

双重序列比对:双序列比对是指对两条序列M和N进行比对,找到其相似性关系,这种寻找生物序列相似性关系的过程被称为双序列比对。其算法可以主要分成基于全局比对的Needleman-Wunsch算法和基于局部比对的Smith-Waterman局部比对算法

多重序列比对:多序列比对是双序列比对推广,即把两个以上字符序列对齐,逐列比较其字符的异同,使得每一列字符尽可能一致,以发现其共同的结构特征的方法称为多序列比对。多序列比对算法可以分成渐进法和同步法。其可以发现不同的序列之间的相似部分,从而推断它们在结构和功能上的相似关系,主要用于分子进化关系,预测蛋白质的二级结构和三级结构、估计蛋白质折叠类型的总数,基因组序列分析等。

基因组比对:是多序列比对的一种特例,指对基因组范围内的序列信息进行比对的过程。通过对不同亲缘关系物种的基因组序列进行比较,能够鉴定出编码序列、非编码调控序列及给定物种独有的序列。而基因组范围之内的序列比对,可以了解不同物在核苷酸组成、同线性关系和基因顺序方面的异同,进而得到基因分析预测与定位、生物系统发生进化关系等方面的信息。

BLAST:BLAST[1](Basic Local Alignment Search Tool)是在在1990年由Altschul等人提出的双序列局部比对算法,是一套在蛋白质数据库或DNA数据库中进行相似性比较的分析工具。BLAST是一种启发式算法,用于在大型数据库中寻找比对序列,是一种在局部比对基础上的近似比对算法,可以在保持较高精度的情况下大大减少程序运行的时间。

算法思想描述:

双重序列比对主要分成以Needleman-Wunsch算法为代表的全局比对和以Smith-Waterman局部比对算法为代表的局部比对,BLAST是局部比对的一种推广。多重比对算法可以主要分成动态规划算法、随机算法、迭代法和渐进比对算法。

(1)双重序列比对:

Needleman-Wunsch算法:该算法是基于动态规划思想的全局比对的基本算法,动态规划的比对算法的比对过程可以用一个以序列S为列,T为行的(m+1)×(n+1)的二维矩阵来表示,用

sigma表示置换矩阵。

在计算完矩阵后,从矩阵的右下角单元到左上单元回溯最佳路径(用箭头表示),根据最佳路径给出两序列的比对结果。其中,斜箭头表示2个残基匹配,水平箭头表示在序列S的相应位置插入一个空位,垂直方向的箭头表示在序列T的相应位置插入一个空位。

Smith-Waterman算法:该算法是一种用来寻找并比较具有局部相似性区域的动态规划算法,这种算法适用于亲缘关系较远、整体上不具有相似性而在一些较小的区域上存在局部相似性的两个序列。该算法的基本思想是:使用迭代方法计算出两个序列的相似分值,存在一个得分矩阵M中,然后根据这个得分矩阵,通过动态规划的方法回溯找到最优的比对序列。与全局比对相比,这种算法的改变是把矩阵单元值为负者一律取为0,这是因为分值为负的比对丧失了比对的生物学意义,因此把得分为负值的子序列丢弃。

BLAST: BLAST算法的基本思想是通过产生数量更少的但质量更好的增强点来提高比对的速度。算法的原理主要分为以下五步:(1)过滤:首先过滤掉低复杂度区域,即含有大量重复的序列;(2)Seeding:将Query序列中每k个字组合成一个表,即将一个序列拆分成多个连续的‘seed words’(通常蛋白质k=3,核酸k=11);(3)比对:列出我们所关心的所有可能的字组,再配合置换矩阵给出高分值的字组并组织成快速搜索树结构或者哈希索引,因此此步骤可以快速搜索出大数据集中的所有匹配序列,找到每个seed words在参考序列中的位置;(4)延伸:当找到seed words的位置后,接下来需要将seed word延伸成长片段,延伸过程中,得分值也在变化,当得分值小于阈值时即停止延伸,最后得到的片段成为高分片段对,HSP(High-scoring segment pair);(5)显著性分析,最后我们使用如下公式计算E值,E值衡量了在随机情况下,数据库存在的比当前匹配分数更好的比对的数目,因此可以用该值作为指标评价HSP比对序列的可信度。

其中,m是数据库长度,n是query的长度,S是HSP分数,其他两个参数是修正系数。

(2)多重序列比对

动态规划算法:其基本思想是将一个二维的动态规划矩阵扩展到三维或者多维,多序列比对的积分是n个序列中两两进行比对所得积分之和。矩阵的维度反映了参与比对的序列数。这种方法对计算资源要求比较高[6]。

随机算法:主要包括遗传算法和模拟退火算法,遗传算法是一类借鉴生物界进化规律演化来的全局意义上的自适应随机搜索方法。当用遗传算法进行生物序列分析时,每一代包含固定数量的个体,这些个体用他们的适应度来评价。变异则模拟了生物进化过程中的偶然残基突变现象。对产生的新一代群体进行重新评价、选择、交叉、变异,如此循环往复,使群体中最优个体的适应度不断提高,直到达到一个阈值,算法结束。模拟退火的基本思想是用一物质系统的退火过程来模拟优化问题的寻优方法,当物质系统达到最小能量状态时,优化问题的目标函数也相应地达到了全局最优解。这两种方法都是对构造好的目标函数进行最优解搜索,但实际比对效果并不好[6,7]。

迭代法:迭代法的代表是Muscle[8], Muscle是一个新的渐进比对和迭代比对的综合算法,主要由两部分构成,第一部分是迭代渐进比对:第一次渐进比对的目的是快速产生一个多序列比对而不强调准确率,以此为基础再对渐进比对进行改良。经过两次渐进比对,形成一个相对准确的多序列比对;第二部分是迭代比对:该过程类似于Prrp算法[9],即通过不断的迭代,逐步优化最终比对结果。其主要特点包括:使用kmer counting进行快速的距离测量,使用一个新的图谱比对打分函数进行渐进比对,使用依赖于数的有限分隔进行细化。

渐进比对算法:该算法以Feng和Doolittle提出的最为经典[10]。渐进比对算法的基本思想是迭代地利用两序列动态规划比对算法,先由两个序列的比对开始,逐渐添加新序列,直到所有序列都加入为止。但是不同的添加顺序会产生不同的比对结果。确定合适的比对顺序是渐进比对算法的一个关键问题。通常,整个序列的比对应该从最相似的两个序列开始,由近至远逐步完成。作为全局多序列比对的渐进比对算法有个基本的前提假设:所有要比对的序列是同源的,即由共同的祖先序列经过一系列的突变积累,并经自然选择遗传下来的,分化越晚的序列之间相似程度就越高。因此,在渐进比对过程中,应该对近期的进化事件比远期的进化事件给予更大的关注。由于同源序列是进化相关的,因此可以按着序列的进化顺序,即沿着系统发育树(指导树)的分支,由近至远将序列或已比对序列按双序列比对算法逐步进行比对,重复这一过程直到所有序列都己添加到这个比对中为止[10]。其三个步骤为:(1)利用双序列比对方法对所有的序列进行两两比对,得到相似性分值;(2)利用相似性矩阵(或距离矩阵)产生辅助导向树;(3)根据导向树进行渐进比对。渐进比对算法是最常用、简单又有效的启发式多序列比对方法,它所需时间较短、所占内存较小,其算法很多,主要有CLUSTAL W, T-Coffee和DiAlign等,其中 CLUSTAL W应用最广泛。

应用:

类型+应用

双重序列对比:判断两个序列的同源性和一致性。(1)全局多序列比对可以鉴别或证明新序列与己有序列家族的同源性;帮助预测新蛋白质序列的二级和二级结构,是进行分子进化分析的重要前提。适合序列相似性较高,序列长度近似时的比对;(2)局部比对考虑序列部分区域的相似性。局部多序列比对可以用来刻画蛋白质家族和超家族。适合于未知两个序列相似程度的,可能存在一些片段极其相似而另一些片段相异的序列比对情况。

多重序列比对:多重比对经常用来研究序列间的进化关系,构建进化树;探究序列间的保守性。主要用于分子进化关系,预测蛋白质的二级结构和三级结构、估计蛋白质折叠类型的总数,基因组序列分析等。

基因组比对:通过对不同亲缘关系物种的基因组序列进行比较,能够鉴定出编码序列、非编码调控序列及给定物种独有的序列。而基因组范围之内的序列比对,可以了解不同物在核苷酸组成、同线性关系和基因顺序方面的异同,进而得到基因分析预测与定位、生物系统发生进化关系等方面的信息。

其中,BLAST作为最重要的比对工具,意义特殊,拿出来单独讨论。BLAST可以分成Basic BLAST和 Specialized BLAST, BLAST包括常规的nucleotide blast, Protein blast和Translating blast;Specialize blast可以对特殊生物或特殊研究领域的序列数据库进行检索。

(责任编辑:IT教学网)

更多

推荐windows vista文章