精华内容
下载资源
问答
  • 文章目录图形系统显示系统Buffer管理显示系统的架构从应用的角度理解Android Android图形显示子系统概述 Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示...


    Android图形显示子系统概述

    Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示系统的手机是什么样子,可能连对讲机都不如吧。图形显示系统比较复杂,从Android诞生到现在,几经修改,已经变的越来越庞大了。总的说来,图形显示系统可以分为两大部分来理解:

    • 图形系统
    • 显示系统

    图形系统

    图形系统也就是图形支持系统,提供绘图和图形处理支持。包括最初的2D绘图API Skia,后来的3D绘图API OpenGLES,RenderScript,OpenCV,到最近的Vulkan。也包括图片解码库,jpg,png,gif等。以及它们所需要的各种Driver支持。

    但是Android为了方便大家,我们在做应用开发的时候,并不用大家直接用各种API去绘制界面,也不用直接用解码库去解码。Android已经给大家提供了一个界面绘制机制,有很多widget和view,Android的应用开发者,用现有的widget就能够绘制出比较酷炫的界面。

    Android提供的大多view和widget都是2D的绘图,2D绘图比较慢,也发挥不出GPU的作用,因此Android又设计了一套加速系统,硬件加速。其目的就是将2D的绘图操作转换为一个个的3D(Opengl)绘图,再采用部分更新的方式,只去重绘界面中有更新的部分view,这样就大大提升界面绘制的速度。

    显示系统

    图形绘制好了后,需要送到LCD显示屏上,我们才能看到。绘制界面时,我们只关心单个界面,显示的时候,可能就有多个界面了。做过Android应该开发的都知道,我们需要继承一个Activity,用Activity呈现我们的界面。Activity的生命周期管理,也就伴随了窗口的管理。这中间就涉及了两个Android中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService)。View,AMS,WMS可以说是整个上层显示系统的三驾马车。

    在Android中,一个窗口用一个Surface描述。多个窗口(窗口不一定都是Activity),需要同时显示,我们就需要将多个窗口进行合并。这就需要显示系统中重量级的服务SurfaceFlinger,Surfaceflinger控制窗口的合成,将多个窗口合并成一个,再送到LCD。

    Surfaceflinger是Native的服务,Surfaceflinger中怎么去描述一个窗口呢?Surfaceflinger采用图层的概念,即Layer。SurfaceFlinger合成,就是基于Display HAL的实现,将多个Layer合并。Display HAL,各个厂商的实现就千差万别了。

    Buffer管理

    前面讨论了怎么绘制,怎么显示。但是,绘制,绘在什么地方,拿什么去显示。答案只能是内存Buffer。Android的系统中,采用GraphicBuffer对buffer进行封装,而buffer采用ion实现,能在进程间共享。

    Surface属性应用进程,Layer属于SurfaceFlinger进程。如果只用一个Buffer,那么两个进程都有可能同时在用Buffer,这就可能会造成我们看到的屏幕显示不对,存在撕裂。另外,只用一个Buffer,效率也不高啊,绘制本来就是GPU在绘制,显示这边是CPU或者是其他的硬件模块,一个工作,另外一个不工作,且不浪费。所以Android采用Buffer队列的方式,即BufferQueue。绘制的是一个Buffer,显示的是一个buffer,各自处理完后,交换一下Buffer。这样效率就高很多了。这中间再采用一个生产者-消费者模型,Buffer是载体,Surface应用这边是Producer,SurfaceFlinger这边是是Consumer。这样就更好理解了。

    显示系统的架构

    有了前面的描述,是不是对Android的图形显示系统有了大概的认识了?没有关系,我们直接来看架构图。架构图来自Androd的官网, https://source.android.com/devices/graphics/ ,
    Android显示系统的架构

    大家可以对照图再回味一下,前面的描述。有些地方,这个图并不能很好的体现,不过没有关系,接下来我们会详细的介绍各个模块和流程。

    换一种方式来描述Android的显示系统,架构图如下:
    Android显示系统的架构

    再和前面Android的图进行对照,是不是更清楚一些了。

    这个图里,前面的描述里有点没有说到,SurfaceFlinger到OpenGLES,大家是不是觉得有点奇怪。其实是这样的,SurfaceFlinger合成,有两种方式,ClientDevice。Client就是Client合成完Layer后再将合成后的数据给到HWComposer,HWComposer此时做的工作很少,直接给到Display。Device则是将未合成的Layer,给到硬件合成的设备,合成完后再给到Display。

    可能大家还是很迷茫,没有关系~,我们接下来将参照Android的源码,逐一为大家讲解。

    从应用的角度理解Android

    做Android开发,我们都讲了太多的架构,也听了太多的架构。不知道大家有没有从应用的角度去看过Android的系统?我们先来看Android的整体系统架构。
    Android的整体系统架构

    Android基于Linux内核,我们是不是可以将上层Android理解为Linux内核的一个应用。这个应用非常庞大,集集了电话,BT,WiFi,音视频播放,Camera等功能。

    基于Linux内核的系统非常的多,比如常用的,Debian系列的Ubuntu,Debian;Redhat系统的RedHat,Fedora等。你可以理解Android自成一个系列。所以,我们也可以基于Linux内核去开发自己的系统。

    回到Android,Android在Linux中加了很多驱动,再采用硬件抽象的方式,向上提供接口,这就是我们所说的HAL层。所以我们要增加一个模块,需要增加Linux驱动,然后实现HAL,以供上层使用。当然,我们也可以基于Android的HAL去开发上层的系统,又可以将基于HAL的系统看成一个应用。据了解,FirefoxOS,360OS,YunOS等,基本都是基于Android的HAL的方式去开发的(Oops~如有亵渎,神灵保佑…)。

    基于HAL的Android Framework,分为Native Framework和JavaFramework。HAL层是C++写的,按里说,Native的 Framework应该就够了,什么还要去实现Java的Framework呢?Android的应用大多数都是用Java开发,中间还有一个Java虚拟机,和JNI。

    其实,这是有历史原因的。现在Android已经形成了一个很大的生态链,但是想想当初,Android系统刚才发布,得有开发者呀,没有开发者的支持,如何能形成生态链。所以,Android就采用了这种Java开发方式,大大笼络了Java开发人员。

    再回到我们的显示子系统,Surfaceflinger基于HAL HWComposer,管理和控制着整个Android的显示。而上层,则是WMS,AMS,View等系统服务管理和控制着整个Android的显示。

    回到上一章给出的Display架构图,我们是不是可以直接基于Native的Framework进行应用的开发呢,答案是肯定的。Android也为此提供了NDK,以便于Android Native应用的开发。

    下面,让我们从一个Native应用开始,揭开Android显示系统的面纱~

    展开全文
  • Linux显示系统信息的shell小脚本

    万次阅读 2021-04-01 11:13:15
    显示系统相关信息 #!/bin/bash # #*************************************** #Author: SunMY #Date: 2021-04-1 #FileName: showsysinfo.sh #blog: https://blog.csdn.net/timonium #Des: Show System Info #*******...
    • 显示系统相关信息
    #!/bin/bash
    #
    #***************************************
    #Author:   SunMY
    #Date:     2021-04-1
    #FileName: showsysinfo.sh
    #blog:     https://blog.csdn.net/timonium
    #Des:      Show System Info
    #******************************************
    #Color
    RED="\E[1;31m"
    GREEN="echo -e \E[1;32m"
    END="\E[0m"
    #
    $GREEN-------------Host SysInfo----------------$END
    echo -e  "HOSTNAME:  $RED`hostname`$END"
    echo -e  "IPADDR:  $RED`hostname -I`$END"
    #echo -e  "IPADDR:  $RED`ifconfig ens33 | grep -Eo '([0-9]{1,3}\.){3}[0-9{1,3}]' | head -n1 `$END"
    echo -e  "OSVERSION:  $RED`cat /etc/os-release | grep "PRETTY_NAME" | cut -d '"'  -f2 `$END"
    echo -e  "KENRNEL:  $RED`uname -r`$END"
    echo -e  "CPU:  $RED`lscpu | grep 'Model name' | tr -s ' ' | cut -d : -f2`$END"
    echo -e  "MEMORY:  $RED`free -h | grep Mem | tr -s ' ' : | cut -d : -f2`$END"
    echo -e  "DISK:  $RED`lsblk | grep '^sd' | tr -s ' ' | cut -d " " -f4`$END"
    $GREEN-------------Host SysInfo End----------------$END
    
    
    u20@u20-58:~$ man scp
    u20@u20-58:~$ ll sysinfo.sh 
    -rw-r--r-- 1 u20 u20 1006 Apr  1 03:51 sysinfo.sh
    u20@u20-58:~$ bash sysinfo.sh 
    -------------Host SysInfo----------------
    HOSTNAME:  u20-58
    IPADDR:  10.0.0.58 
    OSVERSION:Ubuntu 20.10
    KENRNEL:  5.8.0-48-generic
    CPU:   Intel(R) Core(TM) i9-1099k CPU @ 3.70GHz
    MEMORY:  1.9Gi
    DISK:  20G
    -------------Host SysInfo End----------------
    

    showsysinfo.sh

    展开全文
  • 在html页面实时显示系统时间

    万次阅读 多人点赞 2018-11-05 13:24:58
    在html页面实时显示系统时间 桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=...

    在html页面实时显示系统时间

    桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可

    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>系统时间</title>
    </head>
    <body>
    <div id="datetime">
        <script>
            setInterval("document.getElementById('datetime').innerHTML=new Date().toLocaleString();", 1000);
        </script>
    </div>
    </body>

    代码解析:

    new Date()是取现在系统时间的实例,其格式为:
    	显示的结果是:Mar 31 10:10:43 UTC+0800 2018 这种格式的时间

    但是当这种对象参加计算后就会自动改变格式为:年月日 时分秒

    toLocaleString()便是将该对象在本地打印,自动转换了格式为:
    	2018/11/5 下午1:18:17 或 2018年11月5日 13:19:14 (取决于不同的浏览器)

    这个方法是循环方法,后面的1000是毫秒数,每单位毫秒数执行一次前面的xxx

    setInterval("xxx",1000);

    这句话的操作就是,每1000毫秒(即1秒),取当前时间打印更新在页面该标签里,实现系统时间实时显示

    =======================我是一条温柔的分割线=======================

     

    有网友提出格式化成"yyyy-MM-dd hh:mm:ss"的问题,我在这里更新一下:

    桌面新建记事本,将下列代码复制粘贴,重命名后缀为.html,保存,用浏览器打开即可

    <html>
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>系统时间</title>
    </head>
    
    <body>
        <script>
            Date.prototype.format = function (fmt) {
                var o = {
                    "y+": this.getFullYear, //年
                    "M+": this.getMonth() + 1, //月份
                    "d+": this.getDate(), //日
                    "h+": this.getHours(), //小时
                    "m+": this.getMinutes(), //分
                    "s+": this.getSeconds() //秒
                };
                if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
                for (var k in o)
                    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
                return fmt;
            }
            setInterval("document.getElementById('dateTime').innerHTML = (new Date()).format('yyyy-MM-dd hh:mm:ss');", 1000);
        </script>
    
        <div id="dateTime"></div>
    </body>

    运行结果:

    展开全文
  • 双系统不显示系统选择界面

    千次阅读 2019-10-25 14:31:39
    当windows+ubuntu安装在同一个硬盘,使用boot menu可以分别进入window和ubuntu系统,而开机没有显示系统选择界面时,可以使用以下方法解决: 方法一、开机摁Delete键进入BIOS界面,在boot界面中把ubuntu设为第一引导...

    当windows+ubuntu安装在同一个硬盘,使用boot menu可以分别进入window和ubuntu系统,而开机没有显示系统选择界面时,可以使用以下方法解决:
    方法一、开机摁Delete键进入BIOS界面,在boot界面中把ubuntu设为第一引导选项,保存退出
    方法二、在window系统下修改默认启动引导
    1、创建引导分区的临时盘符
    命令:mountvol v: /s
    2、进入EFI文件夹
    命令:cd v:\EFI
    3、修改启动引导
    命令:bcdedit /set {bootmgr} path \EFI\ubutu\grubx64.efi

    展开全文
  • Android P 图形显示系统

    千次阅读 2019-01-10 09:57:57
    Android P 图形显示系统(一)硬件合成HWC2 Android P 图像显示系统(二)GraphicBuffer和Gralloc分析 Android P 图像显示系统(三)Android HWUI 绘制流程 Android P 图形显示系统(四) Android VirtualDisplay...
  • 虚拟机安装TOOL显示灰色,WIN7安装TOOL显示系统版本要升级到SP1 遇到的问题有两个 问题一:打开VMware准备手动安装TOOL,但是发现按钮是灰色的,如下图 以下图文方式显示 进入虚拟机设置 设置完成后我的灰色...
  • Android图形显示系统——概述

    千次阅读 2015-12-28 21:40:30
    序Android的图形显示系统,虽然感觉自己基本了解了,有问题基本都能解决,但要写时,一是觉得千头万绪无从下笔,一是发现还有很多并没有真正搞懂。开工写这套体系,也顺便查漏补缺下。Android图形显示系统的剖分图形...
  • tkinter动态显示系统时间

    千次阅读 2019-05-06 16:26:27
    def get_time(): '''显示当前时间''' global time1 time1 = '' time2 = time.strftime('%Y-%m-%d %H:%M:%S') Label(top, text='当前时间:', bg='gold', font=28).place(x=630, y=... # 能动态显示系统时间 ...
  • Android图形显示系统(一)

    万次阅读 多人点赞 2017-05-03 17:03:02
    本文讲解的内容是Android4.1以后的系统机制,将从整体上分析Android图形显示系统的结构,不深入分析每一层内部的代码实现,更多的是使用流程图和结构图来让大家理解Android是如何绘制、合成图形并显示到屏幕上。...
  • Android显示系统框架原理介绍

    千次阅读 2016-03-23 11:17:55
    1. android显示系统整体框架       最上面一层为应用程序,根据数据类型以及应用的不同可以分为几种。   第一种是最普通的应用,如 UI 界面的显示,这部分通常数据类型为 RGB 格式,数据无须再...
  • 我安装精简版的win10后,安装autoacd2008总显示系统组件已损坏,之后知道了net坏了,不能用,但在网上找包一直安装不了,怎么办
  • JSP中实现动态显示系统时间

    千次阅读 2017-10-12 17:01:46
    JSP中实现动态显示系统时间可以使用js来编写,如下代码: 当前时间: document.getElementById('time').innerHTML = new Date().toLocaleString() + ' 星期' + '日一二三四五六'.charAt(new Da
  • 航班信息显示系统-总结

    千次阅读 2013-01-03 00:54:41
    航班信息显示系统,俗称航显系统,是机场对外发布航班信息的重要系统之一。 为此,国内大中型机场,均有航班信息显示系统存在,一些小机场,也有航显屏立在机场的显目位置,目的是向旅客等提供可靠的航班信息数据...
  • QT的温湿度显示系统

    千次阅读 2018-03-11 12:05:10
    大家好,这里是石侃侃的博客,欢迎...利用LCD作为了显示器件,利用触摸屏作为用户界面输入设备,第一行显示当前实时的温度,湿度,第二行依次显示历史时刻最高的温度值,最高的湿度值。第三行是一个文本框,记录了程...
  • 航班信息显示系统研究问题列表   航班信息显示系统是机场面向旅客服务的最为重要的信息通知系统,所有的航班信息通过部署在航站楼内各个要道上的电子显示屏幕来通告给旅客。对于新兴的机场以及需要航班信息改造的...
  • CentOS 7.2上显示系统托盘图标
  • 本文说明Ubuntu中如何显示系统托盘图标。
  • 使用JS和HTML5实现动态显示系统时间

    千次阅读 2018-06-13 14:38:18
    不多说直接给代码,我是在Dreamweaver CC 2018上编写的。&lt;!doctype html&gt;&lt;...gt;...动态显示系统时间&lt;/title&gt; &lt;style type="text/css"&gt; #tim
  • 上一次由于电脑卡了,在关闭虚拟机的时候卡住了,等再次登录的时候就显示系统繁忙无法登陆。 这个时候不要慌张,找到你当时安装虚拟机的文件夹Centos,打开文件夹,里面有一个.lck的文件夹,删除这个文件夹就可以了...
  • 数据采集显示系统在嵌入式行业中应用非常普遍。数据采集包括各种设备的状态量采集,总线数据的获取和监测,数据的存储等,同时在数据采集过程中也需要一定的人机交互来完成一些控制操作。对此,辉为科技以TI 工业级...
  • Android图形显示系统——一张图片的显示流程

    万次阅读 多人点赞 2016-01-20 23:56:45
    Android设备上一张图片的显示过程应用示例假如我们现在有一张这样的风景照 想在Android设备(比如一个小米pad)上显示出来。首先想到的是写一个应用,用一个ImageView,把这张照片附到ImageView上显示,如下面的...
  • android 实时显示系统时间

    千次阅读 2016-10-31 12:49:07
    我们知道,用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示系统时间。  我们开启一个线程,线程每隔一秒发送一次消息,我们在...
  • Android——实时显示系统时间

    万次阅读 2018-06-06 10:07:05
    System.currentTimeMillis()可以获取系统当前的时间,这里要实时显示就可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示系统时间。具体就是写一个线程,线程里面无限循环,每隔一秒发送一个...
  • HTML 显示系统时间

    万次阅读 2015-08-08 10:38:21
    代码1:(显示静态时间) var myDate = new Date(); document.write(myDate.toLocaleString()) 代码2:(显示动态时间) function show(){ var date = new Date(); //日期对象 var now = ""; now = date....
  • 调用支付宝 显示系统繁忙,请稍后再试(ALI10) 我们签约的是 移动支付 代码没有报错,为何老是提示显示系统繁忙 在targets 的中 info 添加 url types 添加 alisdkdemo 亲测有效。希望大家引以为戒!  ...
  • PHP服务端生成地址传给IOS端调用 一直显示系统繁忙 请稍后再试 ALI40247 密钥也正常 也按照官方说明来走。 官方的PHP端SDK是错误的 根本不加密biz_content 字段 随后百度找不到相关的资料 只有人说换成 1.0...
  • vb.net显示系统通知

    万次阅读 2018-12-05 21:38:14
    MessageSystem.send(“heloworld”)
  • Navicat Premium 12连接MongoDB不显示默认的系统库 本地安装MongoDB之后使用Navicat Premium 12来连接数据库,发现只显示我自己新建的数据库,不显示默认的系统库。默认的系统库有三个,分别是(admin、config、...
  • 毕业设计 —— 基于STM32手势控制显示系统的设计

    千次阅读 多人点赞 2019-11-09 18:14:22
    目录 一、前言 二、项目背景及资源分享 三、项目简介 1、项目名称 2、系统框架 ...5、最小系统: ...1、系统设计的原理 ...3、系统设计框图 ...1、32 * 80点阵显示屏 1.1 模块作用 1.2 实现功能 1.3 内...
  • //设置Buffer失效期限,当应用生产Buffer快于消费者(一般是显示系统)的消费时,这个参数决定是否丢弃之前没来得及消费的Buffer。 int (*query)(const struct ANativeWindow* window, int what, int* value);//...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 254,406
精华内容 101,762
关键字:

显示系统