Android 重学系列 GraphicBuffer的诞生

Android 重学系列 GraphicBuffer的诞生,第1张

经过上一篇对OpenGL es的解析,我们引出了在eglSwapBuffer时候会调用会调用两个关键的方法:

从上一篇openGL es分析可以得出,每一次当我们绘制完一次图元之后,surface做为生产者一方会在一个循环中一般依次完成如下内容:

对于生产者来说关键的是这四个步骤。不过openGL es把整个过程颠倒,每一次绘制上一帧,对于更加好理解,我把整个过程设置回Android常用的方式。我们分别来研究这几个函数做了什么。

遇到什么问题,欢迎来本文进行讨论 https://wwwjianshucom/p/3bfc0053d254

首先我们先不去深究细节,先对整个流程的源码流程有一个大体印象。因为图元的诞生不清楚,也看不懂其他原理。

文件:/ frameworks / native / opengl / libagl / eglcpp

在lock函数实际上是把ANativeWindowBuffer的handle传进去进行锁定,同时传入了一个vaddr的地址,这个地址是做什么的呢?其实就是共享buffer中的图元存储的地址。

实际上上在lock的时候,并不是直接把buffer传下去,而是传递一个handle,一个ANativeWindowBuffer的句柄。

文件:/ frameworks / native / libs / gui / Surfacecpp

先介绍Surface的核心对象之一mSlot,这个对象是数组BufferSlot:

在这里面保存着几个很重要对象:

在这里先介绍一个重要的概念,每一个GraphicBuffer图元在不同的流程会分为5个状态都会在BufferState记录状态:

根据这些状态,在SF中对应的计数个数不一样,这些计数影响着SF是否需要调整整个mSlot的使用策略。

因此当我们需要进行调整,需要对mDequeueCount+mAcquireCount加入调整计算,这样才能知道一共有多少图元在缓冲队伍之外,才能正确的计算,是否应该调整BufferQueuemSlot的策略。在图元缓冲队列初始化那一章中,能看到会计算mMaxAcquiredBufferCount和mMaxDequeuedBufferCount的数量,来控制每一个Layer的图元生产者的是否需要调整slot为新的GraphicBuffer腾出位置。

流程如下:

让我们重点关注SF的dequeueBuffer。

文件:/ frameworks / native / libs / gui / BufferQueueProducercpp

在这个过程中其实很简单,就是找到合适的空位,添加到活跃区间,设置标志位,最后发现为空则会新生成一个,最后返回的是mSlot对应位置的下标。而不会直接返回一个完整的GraphicBuffer,因为一个图元太大了,根本不可能通过Binder进行通信。

我们来看看waitForFreeSlotThenRelock是怎么从mSlot找到合适位置的图元插槽。

在这个过程中,很简单,直接返回一个GraphicBuffer对象。不是说GraphicBuffer很大,Binder没有办法传输吗?为什么这里又能返回到app进程呢?稍后解析。这里就能Surface就记录了对应index的GraphicBuffer。

流程如下:

核心有四个:

其实在这个阶段判断mQueue如果为空,直接加到mQueue的末尾。不为空,需要判断最后一个图元是否已经不需要显示了,如果是共享模式的图元,则关闭。不是,则会从Active区域移除,放到Free区域中,并且代替mQueue最后一个图元。否则还是放到mQueue末尾。

此时就是回调到消费者中的监听回调,具体做了什么之后再说。

文件:/ frameworks / native / opengl / libagl / eglcpp

能看到GraphicBufferMapper调用以ANativeWindowBuffer的handle为线索unlock解锁图元映射。

在整个流程中,我们能够看到生产者生产涉及到的主要角色如下:

Surface是面向应用客户端的图元生产者,BufferQueueProducer是面向SF服务端的图元生产者。其核心涉及实际是查找mSlot中有没有空闲的位置,让图元占用。但是真正进行消费的时候,需要设置到BufferItem的Vector中。

但是思考过没有,一个图元代表一帧的数据。一个屏幕常见的占用的内存1080 1920 4 早就超过了应用传输Binder的极限1040k那么系统是怎么规避这个问题呢?

我们从dequeue步骤中能看到,每一次dequeue之后先回返回一个mSlot的下标,即使在这个步骤已经new了一个GraphicBuffer,他也不会返回GraphicBuffer。但是到了requestBuffer就能GraphicBuffer对象。为什么这么设计?就算是返回了GraphicBuffer对象,Binder会因为这个对象占用太大而报错。

系统是怎么办到的?而且在OpenGL es中eglSwapBuffers中,把framebuffer_t和ANativeWindowBuffer的bit属性关联起来,ANativeWindowBuffer又是怎么在跨进程通信初始化bit字段的?

接下来让我们专门来解析GraphicBuffer类。

文件:/ frameworks / native / include / ui / GraphicBufferh

先来看看其继承关系:

GraphicBuffer继承于ANativeWindowBuffer和Flattenable,前者是在ANativeWindow中的图元缓冲,后者是Binder 传输时候的Parcel封装IBinder。但是这里里面的flattern和unflattern方法被重写了为自己的保存所有参数的方法。我们稍后再看。

文件:/ frameworks / native / libs / ui / GraphicBuffercpp

在初始化中有一个十分核心的类GraphicBufferAllocator,图元申请器。这个类真正在一个GraphicBuffer的壳内,通过allocate真正生成一个核心内存块。接着会调用GraphicBufferMapper getTransportSize在Mapper中记录大小。请注意,allocate方法中有一个十分核心的参数handle。他是来自ANativeWindowBuffer:

文件:/ frameworks / native / libs / nativebase / include / nativebase / nativebaseh

native_handle_t实际上是的GraphicBuffer的句柄。

让我们依次看看GraphicBufferAllocator和GraphicBufferMapper都做了什么。

文件: frameworks / native / libs / ui / GraphicBufferAllocatorcpp

ANDROID_SINGLETON_STATIC_INSTANCE这个宏实际上就是一个单例:

1W25Q64 是华邦公司推出的大容量SPIFLASH 产品,W25Q64 的容量为 64Mb,W25Q128的容量为128Mb。W25Q64 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为 27~36V。

2操作时序。

    根据手册说明,发送指令需要将CS拉低。指令发送完毕在将CS拉高。指令有可能是单字节有可能是多字节。

下图为写指令时序示意图。

   1SPI每发送一个数据的同时会接收到一个字节的数据

   2SPI有4条线,MISO,MOSI,SCLK三条数据线,还有片选线CS,片选线对于SPI接口的从设备是低电平有效,主机输出一个低电平从机就被选中。这样就方便一个主机可以连接多个从设备,只需要使用不同的片选线。 

1配置为普通SPI。初始化时将FSS配置为普通IO口。根据需求拉高或者拉低。

2官方的高级SPI模式,

源码:

SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);//使能SPI2时钟

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//使能GPIOD时钟

    GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);//SPI2 IO 口定义

    GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);

    GPIOPinConfigure(GPIO_PD2_SSI2FSS);

    GPIOPinConfigure(GPIO_PD3_SSI2CLK);

    GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 |GPIO_PIN_2|

                      GPIO_PIN_3);

#if defined(TARGET_IS_TM4C129_RA0) ||                                        \

    defined(TARGET_IS_TM4C129_RA1) ||                                        \

    defined(TARGET_IS_TM4C129_RA2)

    SSIConfigSetExpClk(SSI2_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,

                      SSI_MODE_MASTER, 1000000, 8); //设置SSI 时钟 模式

    SSIAdvModeSet(SSI2_BASE,SSI_ADV_MODE_READ_WRITE);

#else

    SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,

                      SSI_MODE_MASTER, 1000000, 8);

#endif

    SSIAdvFrameHoldEnable(SSI2_BASE);

    SSIEnable(SSI2_BASE);//使能SPI2

在往某个地址写之前必须确保这个地址上的值是0xFF,否则说明这个地址以前被写过数据,还没有被擦除。W25Q64擦除的最小单位是Sector也就是4k个字节,也就是说如果要想往某个地址写一个值,如果这个地址上的值不是0xFF,那么就要把整个扇区都擦除,然后在写。

  给W25Q64开辟一个4k的缓存,比如定义一个4k的数组,然后在写数据之前先判断如果这个地址上的数据不是0xFF,就先把这个地址所在的Sector里的数据全部保存在4k缓存中,再擦除这个扇区,再把缓存中对应的地址上的数据更新,再把这个4k缓存区的所有数据一次性的写入到这个Sector中。

相关源码

这里就是我很喜欢的部分了哈哈。

但是气不气,就是没时间写。继续挖大坑。

以后会放出工具和资源,作为整合帖。也会另开文单独介绍。

Burp Suite是用于攻击Web应用程序的集成平台。它包含了很多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都共享一个能处理并显示HTTP消息、持久性、认证、代理、日志、警报的一个强大的可扩展的框架。

Burp Suite Pro ,提取密码:0554

资源 密码:l4he

具体教程另开贴。

中国菜刀

链接

资源 密码:pp61

SQL注入,扫描等

链接

资源 密码:skb4

SQL注入工具

一款好用免费的内核查看器

链接

破解色道隐写,需要JAVA环境

运行于Windows的常用音频隐写工具

链接

开源隐写工具,C语言编写

知名逆向工具。

链接

资源 密码:tku8

目录扫描

链接

资源 密码:h4d6

漏洞扫描、目录扫描,Java语言编写

链接

资源 密码:mn9h

强大的WEB漏洞扫描工具

链接

资源 密码:e8tf

对zip暴力破解速度极快,支持明文攻击。

链接

资源 密码:4fhk

常用RAR爆破工具。

链接

资源 密码:ntw5

常用zip爆破工具,界面美观,可爆破隐写压缩包。

链接

资源 密码:1ebq

体积小巧,功能强大。

资源 密码:alfu

开源Orcal密码爆破,附源码,DOS下运行。

资源 密码:l5bm

phpMyAdmin密码爆破。

资源 密码:f0so

密码爆破,DOS下运行。

链接

资源 密码:gz8y

虚拟光驱、ISO烧录到U盘或光盘,小巧免费无广告。

链接

资源 密码:v2em

用于Linux系统远程连接,小巧免费无广告。

资源 密码:j9u9

免费内网穿透。

链接

资源 密码:tghf

精灵表格总结的CTF工具合集。

资源 密码:wu31

资源 密码:s1ta

CTF Crack框架(集成栅栏、凯撒等),国内首个CTF Crack框架,Java编写,源码在Github

链接

资源 密码:y1jk

一款Windows平台下预配置的便携式开源渗透测试环境。

Pentest Box不同于运行在虚拟机或者双启动环境的Linux渗透测试发行版。它打包了所有的安全工具,并且可以再Windows系统中原生地运行,有效降低了对虚拟机或者双启动环境的需求。

这里选择的是集成了Metasploit的版本,安装时要关闭杀毒软件和防火墙,默认释放在C:/PentestBox/。

链接

资源 密码:4lxe

原文地址: Ansible系列-基础篇-Ansible 的安装、配置和基本使用

1、Ansible 目前支持Linux和MacOS作为控制节点,管理节点可以是Linux、MacOS、其他类Unix系统和Windows。

2、Ansible 节点主要分为两类,管理节点和被管理节点

需要主要的是 管理节点 和 被管理节点 之间需要配置好 SSH免密通道

3、如果可以的话,个人建议Python还是使用30以上版本,虽然系统预装了 275 但是官方都宣布不再维护该版本了,其他类似 openssl 、 git 等系统默认的版本就已经满足

4、本系列教程用到的环境

1、方式一 包管理器安装

比如 CentOS 、 Fedora 、 Redhat 等系统下使用 yum , Mac下使用 brew , Ubuntu、Debian等系统使用 apt-get ,如上说明,本系列都是在Centos系统下进行

2、方式二 源码安装

源码安装一般是为了尝鲜安装的最新版本,用的较少

3、方式三 采用Python PIP包安装

这里 建议采用方式三安装 ,Python可以通过 pyenv 来管理虚拟环境,同时后续可以通过 Ansible API 进行Python集成,方便平台化定制开发

Ansible 安装成功之后的验证

在正式聊 Ansible 配置之前,我们可以先仔细观察下上面 ansible --version 的输出结果,其中 config file 是 Ansible 配置文件存放的位置, 另外注意 jinja 和 libyaml ,其中 jinja 是 Ansible Role 中的 templates 用到的,而 libyaml 是 Ansible playbook 编写时用到的文件格式,具体我们都会在后续文章中进行详细说明。这里先了解下就行。

其实这里还有个文件格式没有展示出来,就是 Ansible Inventory 文件的格式 ,采用的是 ini 格式

好了我们正式聊聊如果配置 Ansible,其实除了上面提到的 config file 制定的配置之外。Ansible 会从以下方式按照由上到下优先级加载配置

ansiblecfg 配置文件详解

ansiblecfg 的配置项很多,实际环境中其实不会所有的配置项都配置,遵循二八法则。而且 Ansible 没有启动服务一说,说明配置文件的更改是即时生效的。

这里先看看本环境中用到的配置,然后做详细说明

Ansible 免密登录

在配置之前,先说个 运维规范 ,一般为了安全要求,Linux环境会禁用密码登录,采用公私钥对登录(特殊主机建议禁用root登录),因为通过ansible管理一般都是内网,这里默认是允许root登录的。

这里可能可能有人会问,为啥不统一也把root登录给全部禁用呢,这样岂不是更安全呢?

所以视自己实际环境而定哦

好了,我们回到正题,我们知道Ansible的调用是通过ssh远程执行,如果在配置文件中配置了 private_key_file 那么不管你使用哪个账号去执行,对应的公钥就是该私钥匹配的, 这样就会导致不同账号得使用相同的公私钥,这样不安全,也不友好

实际中,在配置文件中不配置 private_key_file , 然后新增的SA账号单独配置免密登录,员工离职清理账号也不影响其他人。

至于如果配置SSH免密登录,网上教程一大堆,这里就不啰嗦了

这里我们在 /etc/ansible/inventory/prohosts 配置几个测试主机,类似

这种命令执行的方式叫做 Ad-hoc , 具体 Ansible 都有哪些内置模块,可以参考 AnsibleBuiltin

如果知道模块,但是不知道怎么用,可以尝试 ansible-doc -s module-name ,比如上面的 shell 模块

下一篇我们来说说工作中常用的模块及其用法

参考:

1、 https://wwwcnblogscom/yangmingxianshen/p/12655843html

2、 https://docsansiblecom/ansible/latest/collections/ansible/builtin/indexhtml

Hack,顾名思义是修改的意思。Hack是基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求。

W3C是英文 World Wide Web Consortium 的缩写,中文意思是W3C理事会或万维网联盟。

W3C推出的主要规范

到目前为止,W3C已开发了超过50个规范(草案)。这些规范(草案)包括人们早已、耳熟能详的HTML、HTTP、URIs、XML等,也包括针对语义Web的RDF、OWL等。

HTML/XHTML:HTML是Web的基础之一,基于HTML,Web上开始出现丰富多彩的页面,蕴涵了各种信息。基于HTML,Web以一种简便易用的方式走出了象牙塔,成为全社会的公共资源和财富。W3C先后推出了多个HTML版本,分别是1997年12月的首个版本、1998年4月的更新、1999年12月推出HTML 401版。XHTML是对HTML 401的扩展,在其中可以使用XML的语义功能。XHTML 10已于2000年1月作为推荐标准发布;XHTML Basic是对XHTML10的独立于设备(如手机、PDA等)的扩展,于2000年12月发布;随后,2001年5月推出了XHTML的模块化版本——XHTML11。

CSS:CSS负责为网页设计人员提供丰富的款式空间来设计网页。CSS所提供的网页结构内容与表现形式的分离机制,大大简化了网站的管理,提高了开发网站的工作效率。CSS可用于控制任何HTML和XML内容的表现形式。CSS10于1996年12月推出,1998年5月CSS20发布。

XML:1998年2月发布的XML 10是W3C最具前瞻性和最有影响的标准之一。XML作为下一代Web的第一块重要基石,为分布式的、异构的数据交换提供了强大的功能,并且将数据本身和数据的表现分离,同时,就数据本身而言,数据的值和语义也是适当分离的。事实上,XML已经发展为一族技术,包括2001年5月发布的XML Schema、1999年1月发布的XML Namespaces、1999年11月发布的用于处理XML转换的XSLT和用于在XML文档中定位的XPath,以及2001年6月发布的XLink和XML Base等。此外,XML的出现为程序能够自动地处理Web数据和信息,以及Web服务(WSDL、SOAP、UDDI规范)提供了一种公共基础。

DOM:DOM为HTML、XML等数据载体和信息载体在内存中的处理提供了一种基本的对象模型,可提供连接到文件的结构、格式、事件等。由于不依赖于任何程序设计语言和网页描述语言,它为有效处理HTML和XML数据提供了一种标准的、独立的接口。DOM先后经历了3个版本,分别是1998年10月发布的DOM Level 1、2000年11月发布的DOM Level 2和2003年发布的DOM Level 3。

MathML:MathML为在Web上实现一种跨平台的数学描述机制提供了工具性语言。MathML先后推出过2个版本:1999年7月发布的MathML 10和2001年2月发布的MathML 20。

PNG(Portable Network Graphics):1996年发布的PNG是一种可移植的、对图形像素无影响的、便于图像压缩的图像文档格式。目前已是使用最广泛的Web图像格式之一。

SVG(Scalable Vector Graphics):SVG是针对Web上大量矢量图提供的图像内容管理机制,包括图像内容查询、定制和使用图像等功能。2001年9月推出的是SVG 10,SVG 11/SVG Basic和Tiny已经可以为一些小型设备提供矢量图像;2003年7月已提交SVG 12草案。

RDF(Resource Description Framework):RDF是第一个有关构建语义网络的推荐标准,它提供了一种技术标准来描述Web上的词汇、编码和元数据(Metadata),并建立这些对象与Web上丰富资源之间的联系。RDF于1999年2月发布,至今仍是最重要的语义Web方面的技术标准,也是其他技术的基础之一。

W3C CSS验证服务是由W3C制作的一个免费软件,用于帮助Web设计者检查层叠样式表(CSS)。你可以在W3C提供的免费在线服务中使用,也可以下载后作为一个Java程序或者Servlet运行在自己的机器上。

Web20是Web10的升级,版本不同。

Web10里,互联网内容是由少数编辑人员(或站长)定制的,比如搜狐;而在Web20里,每个人都是内容的供稿者。Web20的内容更多元化:标签tag、多媒体、在线协作等等。在Web20信息获取渠道里,RSS订阅扮演者一个很重要的作用。我也一直推荐阅读者以订阅的方式阅读可能吧的文章。

在Web10里,互联网是“阅读式互联网”,而Web20是“可写可读互联网”。虽然每个人都参与信息供稿,但在大范围里看,贡献大部分内容的是小部分的人。

Web20实际上是对Web10的信息源进行扩展,使其多样化和个性化。

AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。 国内通常的读音为“阿贾克斯”和阿贾克斯足球队读音一样。

Ajax的定义

基于web标准(standards-based presentation)XHTML+CSS的表示;

使用 DOM(Document Object Model)进行动态显示及交互;

使用 XML 和 XSLT 进行数据交换及相关操作;

使用 XMLHttpRequest 进行异步数据查询、检索;

使用 JavaScript 将所有的东西绑定在一起。英文参见Ajax的提出者Jesse James Garrett的原文,原文题目(Ajax: A New Approach to Web Applications)。

类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如“AFLAX”。

AJAX的应用使用支持以上技术的web浏览器作为运行平台。这些浏览器目前包括:Mozilla、Firefox、Internet Explorer、Opera、Konqueror及Safari。但是Opera不支持XSL格式对象,也不支持XSLT。

AJAX前景非常乐观,可以提高系统性能,优化用户界面。AJAX现有直接框架AjaxPro,可以引入AjaxPro2dll文件,可以直接在前台页面JS调用后台页面的方法。但此框架与FORM验证有冲突。另微软也引入了AJAX组建,需要添加AjaxControlToolkitdll文件,可以在控件列表中出现相关控件。

JS是JavaScript 缩写。一种计算机脚本语言,主要在web浏览器(客户端)解释执行,由网景公司开发。

seo一词取自于英文Search Engine Optimization(搜索引擎优化)的首写字母,为近年来较为流行的网络营销方式,主要的目的是增加特定关键字的曝光率以增加网站的能见度,进而增加销售的机会。而网站的SEO化所指的是针对搜索引擎去使网站内容较容易被搜索引擎取得并接受,搜索引擎在收到该网站的资料后进行比对及运算而后将权重较高的网站放在网络上其他使用者在搜索时会优先看到的位置,进而促使搜索者可以得到正确且有帮助的资讯。

SEO的主要工作是通过了解各类搜索引擎如何抓取互联网页面、如何进行索引以及如何确定其对某一特定关键词的搜索结果排名等技术,来对网页进行相关的优化,使其提高搜索引擎排名,从而提高网站访问量,最终提升网站的销售能力或宣传能力的技术。

浏览器是个显示网页服务器或档案系统内的文件,并让用户与此些文件互动的一种软件。它用来显示在万维网或局部局域网络等内的文字、影像及其他资讯。这些文字或影像,可以是连接其他网址的超链接,用户可迅速及轻易地浏览各种资讯。

个人电脑上常见的网页浏览器包括微软的Internet Explorer、Mozilla的Firefox、Apple的Safari、Opera、HotBrowser、Google的Chrome。

浏览器的区别只要是在内核上:

Trident: IE浏览器使用的内核,该内核程序在1997年的IE4中首次被采用,是微软在Mosaic代码的基础之上修改而来的,并沿用到目前的IE7。Trident实际上是一款开放的内核,其接口内核设计的相当成熟,因此才有许多采用IE内核而非IE的浏览器涌现(如 Maxthon、The World 、TT、GreenBrowser、AvantBrowser等)。此外,为了方便也有很多人直接简称其为IE内核(当然也不排除有部分人是因为不知道内核名称而只好如此说)。

由于IE本身的“垄断性”(虽然名义上IE并非垄断,但实际上,特别是从Windows 95年代一直到XP初期,就市场占有率来说IE的确借助Windows的东风处于“垄断”的地位)而使得Trident内核的长期一家独大,微软很长时间都并没有更新Trident内核,这导致了两个后果——一是Trident内核曾经几乎与W3C标准脱节(2005年),二是Trident内核的大量 Bug等安全性问题没有得到及时解决,然后加上一些致力于开源的开发者和一些学者们公开自己认为IE浏览器不安全的观点,也有很多用户转向了其他浏览器,Firefox和Opera就是这个时候兴起的。非Trident内核浏览器的市场占有率大幅提高也致使许多网页开发人员开始注意网页标准和非IE浏览器的浏览效果问题。

Geckos: Netscape6开始采用的内核,后来的Mozilla FireFox也采用了该内核,Geckos的特点是代码完全公开,因此,其可开发程度很高,全世界的程序员都可以为其编写代码,增加功能。因为这是个开源内核,因此受到许多人的青睐,Geckos内核的浏览器也很多,这也是Geckos内核虽然年轻但市场占有率能够迅速提高的重要原因。

事实上,Geckos引擎的由来跟IE不无关系,前面说过IE没有使用W3C的标准,这导致了微软内部一些开发人员的不满;他们与当时已经停止更新了的 Netscape的一些员工一起创办了Mozilla,以当时的Mosaic内核为基础重新编写内核,于是开发出了Geckos。不过事实上,Gecko 内核的浏览器仍然还是Firefox用户最多,所以有时也会被称为Firefox内核。此外Gecko也是一个跨平台内核,可以在Windows、 BSD、Linux和Mac OS X中使用。

Presto: 目前Opera采用的内核,该内核在2003年的Opera7中首次被使用,该款引擎的特点就是渲染速度的优化达到了极致,也是目前公认网页浏览速度最快的浏览器内核,然而代价是牺牲了网页的兼容性。

实际上这是一个动态内核,与前面几个内核的最大的区别就在脚本处理上,Presto有着天生的优势,页面的全部或者部分都能够在回应脚本事件时等情况下被重新解析。此外该内核在执行Javascrīpt的时候有着最快的速度,根据在同等条件下的测试,Presto内核执行同等Javascrīpt所需的时间仅有Trident和Gecko内核的约1/3(Trident内核最慢,不过两者相差没有多大)。那次测试的时候因为Apple机的硬件条件和普通PC机不同所以没有测试WebCore内核。只可惜Presto是商业引擎,使用Presto的除开Opera以外,只剩下NDSBrowser、Wii Internet Channle、Nokia 770网络浏览器等,这很大程度上限制了Presto的发展。

Webkit:苹果公司自己的内核,也是苹果的Safari浏览器使用的内核。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,均是从KDE的KHTML及KJS引擎衍生而来,它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。在安全方面不受IE、Firefox的制约,所以Safari浏览器在国内还是很安全的。

限于Mac OS X的使用不广泛和Safari浏览器曾经只是Mac OS X的专属浏览器,这个内核本身应该说市场范围并不大;但似乎根据最新的浏览器调查表明,该浏览器的市场甚至已经超过了Opera的Presto了——当然这一方面得益于苹果转到x86架构之后的人气暴涨,另外也是因为Safari 3终于推出了Windows版的缘故吧。因为Apple最近才将Safari移植到Windows因此暂时没有Windows上使用WebKit的其他浏览器,不过Mac下还有OmniWeb、Shiira等人气很高的浏览器。

XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。

XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身。而HTML是用来定义数据的,重在数据的显示模式。

XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

为了使得SGML显得用户友好,XML重新定义了SGML的一些内部值和参数,去掉了大量的很少用到的功能,这些繁杂的功能使得SGML在设计网站时显得复杂化。XML保留了SGML的结构化功能,这样就使得网站设计者可以定义自己的文档类型,XML同时也推出一种新型文档类型,使得开发者也可以不必定义文档类型。

因为XML是W3C制定的,XML的标准化工作由W3C的XML工作组负责,该小组成员由来自各个地方和行业的专家组成,他们通过email交流对XML标准的意见,并提出自己的看法 (wwww3org/TR/WD-xml)。因为XML 是个公共格式, (它不专属于任何一家公司),你不必担心XML技术会成为少数公司的盈利工具,XML不是一个依附于特定浏览器的语言。

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/1059667.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-26
下一篇2023-08-26

随机推荐

  • 精华露和乳液的区别是什么,分别如何使用

    精华露用于皮肤的修护和保养  一般用于睡前洁面后轻拍于面部至吸收 其功能和效果长期使用才会有效果 如雅诗兰黛和ONLY就有两款 但是如果年龄还不大 不推荐使用 容易使皮肤更容易老化 对产品长生依赖。乳液分为妆前乳和保湿乳等等 就是皮肤的日常

    2024-04-15
    49600
  • 护肤品里精华水和精华凝露有什么区别

    护肤品里精华水和精华凝露,这两种产品在外观和质地上有着很明显的区别。但是,很多人对于它们的功效和使用方法却存在疑惑。究竟精华水和精华凝露有什么区别呢?我们来看一下精华水。精华水是一种含有高浓度营养成分的化妆水,通常是透明或略带色泽的液态产品

    2024-04-15
    47600
  • 美白身体乳哪个好用效果好

    又到了秀胳膊秀腿的夏天,身体美白的需要也渐渐高了起来。相比其他身体美白的方法,个人认为坚持涂美白身体乳是个很不错的习惯,虽然它不会有立竿见影的效果,但却是更温和更安全的一种方法,还能逐步改善我们的皮肤状态。另外建议在涂抹美白身体乳的同时,也

    2024-04-15
    44400
  • 精油、精华乳等护肤品的使用顺序

    顺序是:洁面乳、爽肤水、眼霜、精华乳、乳液、CC霜、精油。精油分稀释的(复方精油)和未经稀释的(单方精油)比如仙人掌种子油。在使用时需要注意:复方精油使用前应先进行皮肤测试,以避免刺激及过敏性反应。初次使用某种精油时,可先用棉球沾一滴精油,

    2024-04-15
    28000
  • 妮维雅男士控油保湿精华露是洗面奶吗

    听说妮维雅男士控油保湿精华露是洗面奶?这可真是让人大吃一惊。其实,妮维雅男士控油保湿精华露并不是洗面奶,它是用来控制男性肌肤油脂分泌,同时保持肌肤的水润度。此外,精华露还可以帮助男性肌肤延缓衰老,让肌肤更加健康光滑。但是,妮维雅男士控油保湿

    2024-04-15
    33100
  • TOM FORD汤姆福特眼镜盒的真假对比辨别方法是什么?

    之前以为只有TOM FORD眼镜有假货,后来才知道人家连镜盒都伪造出来了!下面专门整理一篇针对汤姆福特眼镜盒的真假对比辨别方法,即可以用于单独买眼镜盒的时候来参考,也可以用来连同萌猪之前整理分享过的眼镜的对比来一起综合判断TOM FORD眼

    2024-04-15
    26900
  • 保湿精华液和润肤露,应该先擦哪个?

    先用精华液,再用保湿露,一般没有特殊说明的话是这样的。你也可以好好看看说明,比如旁氏的一款精华液就说明了用后可以再抹其他护肤品。|||我认为越贵的越早擦,因为吸收的越好嘛|||我觉得只擦精华液吧|||精华液后再用面霜|||看说明吧,不同产品

    2024-04-15
    32200

发表评论

登录后才能评论
保存