1.UGUI源码阅读之Mask
2.history 源码分析
3.SonarQube和Fortify的阻断阻断区别对比
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的页面源码页面源码模版测试。
Unity Shader中的设置模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,阻断阻断但是页面源码页面源码现在又出现了Early Fragment Test,可以在片元着色器之前进行。设置kvm源码维护
Mask直接继承了UIBehaviour类,阻断阻断同时继承了ICanvasRaycastFilter和IMaterialModifier接口。页面源码页面源码
Mask主要通过GetModifiedMaterial修改graphic的设置Material。大致流程:
1.获取当前Mask的阻断阻断层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,页面源码页面源码用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的设置Mask层数,然后StencilMaterial.Add修改模板测试的阻断阻断配置。
通过Frame Debugger看看具体每个batch都做了什么。页面源码页面源码先看第一个,设置是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的网站源码教程帝国源码stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,单片机源码源码一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
history 源码分析
history库与源码分析
history库基于html5的history接口,专门用于管理和监控浏览器地址栏的博客源码网站源码变化。本文将分为两部分进行探讨:html5的history接口;以及history库的实现。html5的history接口
通过使用html的history.pushState(state, title, url)方法,可以实现浏览器地址栏的变更,同时避免页面的刷新。配合ajax请求,这种操作可以实现局部刷新的效果。详细操作方法可以参考MANIPULATING HISTORY FOR FUN & PROFIT这篇文章。此外,若要确保回退按钮也能实现局部刷新,需要监听popstate事件。history库的实现
history库构建了一个虚拟的history对象,它可以用于操作浏览器地址栏的变更、hash路径的变更或管理内存中的虚拟历史堆栈。各history对象都包含以下属性或方法:push(path, state)、replace(path, state)、go、goBack、均线 模型源码 源码goForward、block(prompt)和listen((location, action) => { })。 listen函数会在地址栏变更后执行。实现上,history会先收集历史堆栈入口的变更数据并写入虚拟的history对象中,然后再执行listen函数。这种机制涉及createBrowserHistory、createHashHistory和createMemoryHistory模块中的setState函数。因此,通过pushState、replaceState、go方法,或通过改变location对象来更新地址栏,都可以调用setState执行监听函数。监听函数与阻断地址栏变更
history提供了两种阻断地址栏变更的方法:在变更前拦截和在变更后回滚。对于变更地址栏的三种方式:直接改变location对象、调用pushState或replaceState方法、或使用go方法,前两种我们能知道变更后的值,所以history选择在变更前拦截;后一种我们无法得知变更后的值,因此history选择在变更后回滚。实现上,history使用transitionManager.confirmTransitionTo包裹前两种方法的调用过程,并通过监听popstate和hashchange事件获得变更后的location数据,进一步使用transitionManager.confirmTransitionTo判断是否需要回滚或维持现状。transitionManager的机制
transitionManager由createTransitionManager模块创建,提供四种方法:appendListener(fn)、notifyListeners(...args)、setPrompt(nextPrompt)和confirmTransitionTo(location, action, getUserConfirmation, callback)。这些方法共同协作触发监听函数、阻断地址栏变更。不同历史库实现
本文将详细分析createBrowserHistory、createHashHistory和createMemoryHistory模块。createBrowserHistory
createBrowserHistory基于html5中的pushState和replaceState来变更地址栏。它支持html5 history接口的浏览器,并在不支持时直接修改location.href或使用location.replace方法。此外,它接受props参数,如forceRefresh、getUserConfirmation、keyLength和basename,以控制地址栏变更的细节。createHashHistory
createHashHistory专注于hash路径的变更,实现逻辑与createBrowserHistory类似,但针对hash路径进行专门处理。它接受basename、getUserConfirmation和hashType等属性,以定制hash路径的编码和解码策略。createMemoryHistory
createMemoryHistory在内存中创建一个完全虚拟的历史堆栈,不与真实的地址栏交互,也与popstate、hashchange事件无关。它通过props参数控制初始历史堆栈内容、索引值和路径长度,实现对历史记录的管理。工具函数
文章还介绍了PathUtils、LocationUtils和DOMUtils等工具函数,它们分别用于路径操作、location对象操作以及判断DOM环境。SonarQube和Fortify的区别对比
在寻找可靠的源代码扫描工具时,SonarQube和Fortify经常被提及。作为这两个产品的中国核心合作伙伴,苏州华克斯信息科技有限公司在此为您揭示它们之间的区别。
SonarQube是一个全面的代码质量分析平台,其核心在于提升代码质量,它能检测出项目中的漏洞和逻辑问题,支持多语言的插件。其价值主要体现在对代码的深度分析和管理上,包括可靠性、安全性、可维护性等七个维度。
相比之下,Fortify SCA是一款专门针对软件源代码安全的静态分析工具。它通过五大核心分析引擎来检测漏洞,并与内置的安全规则集进行匹配,突出安全问题。在测试用例WebGoat的对比中,Fortify在安全级别上显示出更强的扫描能力,发现条Critical和High级别的漏洞。
SonarQube则更侧重于代码质量问题,如重复代码、复杂度等,扫描出条阻断和严重级别漏洞,以及2K+条软件质量问题。然而,当涉及到深度安全漏洞,如跨文件处理和数据处理逻辑时,SonarQube的分析能力相较于Fortify有所不足,特别是对于复杂的污点传播问题。
总的来说,如果主要关注代码质量和一般性漏洞,SonarQube是个不错的选择。而如果你特别关注软件安全,尤其是高级别的安全漏洞,那么Fortify SCA可能是更为精准的工具。两者各有侧重,用户应根据项目需求进行选择。