【EmbeddedGUI】PFB设计说明

PFB设计说明

背景介绍

一般来说,要实现屏幕显示,就是向特定像素点写入颜色值,最简单的办法就是直接通过SPI接口,向显示器芯片的特定缓存地址,写入像素点。一般来说,显示器芯片会提供2个基本操作API,WritePointWriteRegionWritePoint实现对特定像素点写入一个色彩值,通常用于绘制文字这些。WriteRegion用于向特定像素点开始的区域Width/Height区间写入一块数据,通常用于绘制图像。

如下图所示,主芯片通过SPI接口,直接向显存中写入数据。调用WriteRegion接口,向(x0,y0)坐标点绘制图像;多次调用WritePoint,主芯片计算每个字体的像素点偏移,加上(x1,y1)基本坐标,来绘制字体。

这个基本上所有卖的显示器提供的测试Demo都是这样子操作方式,这个方式的好处是简单直接,对主芯片的资源暂用最少。RAM全部用显示器芯片的显存。大家学校期间搞的东西很多都是这个样子,基本满足很多场景的需要了。

image-20241024095939664

这种方式这么好,资源用的也少,为什么不都这样干呢?那下面举1个例子,如果要更新文字或者更新图像,基本就是要清除原本的显示缓存,重新向新坐标点写入数据。

动态刷新需求

这里会涉及一个问题,显示屏有内容刷新需求了,主芯片就要有状态机管理什么时候显示那些内容,显示器内容不再是一成不变的。像是下面的需求看起来也还好,不是很难,继续用显示器芯片的缓存就行了。

image-20241024101744908

带透明通道图片叠加

如下一个带背景,并且有透明通道的图片要显示呢?

如果没有背景,那直接显示,有Alpha=0xFF的用图片值,没Alpha=0x00就不绘制,Alpha其他值,就直接混合一个默认值就好了。

有背景,并且背景不是单色呢,那这时候就必须做图像混合了。一般情况下,就需要用RAM去记录背景色,取到新图片和就图片之间的重叠区域,当Alpha不为0时,就需要进行混合了。

image-20241024103223469

其实好看点的字体也是带透明通道的,如下一个字体放大后是这样的,透明通道本身需要根据背景色的不同混合的呈现效果也不相同。

image-20241024110328220

image-20241024110448996

页面滑动需求

而要是有下面这种滑动页面需求,并且里面的图像还涉及混合透明图片怎么办呢?虽然依然可以主芯片自己算,但是为了维护需求,都是需要用缓存来实现的。

20240831_164234_viewpage.gif

部分帧缓存PFB(Partial Frame Buffer)

上面说的,还有个一个办法,直接用显示器芯片的显存不就好了吗,但是因为要从显示器芯片获取像素点数据,这个又会影响性能了。

一般的做法就是在主芯片里面做显示缓存,最省事就是缓存整个屏幕,但是嵌入式开发中,RAM资源是非常宝贵的,一般小资源的芯片只有16KB32KB,富裕点的也就100200KB。但是一个320*240的RGB565屏幕,如果需要缓存整个屏幕的资源的话,需要320*240*2=153,600B=150KB,根本不现实。

部分帧缓存PFB技术就是为了解决这个问题。本项目的PFB技术是可以支持任意大小的,哪怕只有8*8大小的PFB也可以支持任意大小的屏幕,最关键的是用户界面API是不用关心PFB的大小的,本项目都弄好了,我们可以假装拥有完整的Frame Buffer。

通过配置EGUI_CONFIG_PFB_WIDTHEGUI_CONFIG_PFB_HEIGHT就可以指定PFB大小,可以根据项目需求调整。

PFB刷新机制

如下图的显示屏,从坐标(0,0)点,按照列到行的扫描顺序覆盖整个屏幕,每次都只计算PFB区域要显示的内容,然后通过WriteRegion接口,将这块区域的显示信息更新到显示器芯片中。

当然这里涉及到一个脏矩阵的概念,只有需要更新的区域才会进行PFB计算,并更新到显示屏中,这样大大加快的屏幕刷新速度。

image-20241024112832708

PFB实现机制

本项目底层的图像绘制都是通过egui_canvas_t实现的,egui_canvas_t中会保持当前的PFB缓存(egui_color_int_t *pfb;)和大小信息(egui_region_t pfb_region;)。到最后绘制接口最终会调用egui_canvas_draw_point()接口。

这个接口中会通过egui_region_pt_in_rect判断所需绘制的像素点是否在base_view_work_region(这个是PFB在view的坐标Region,本质是pfb_region)中,如果在则转换为PFB坐标,并更新到PFB缓存pfb中。

void egui_canvas_draw_point(egui_dim_t x, egui_dim_t y, egui_color_t color, egui_alpha_t alpha)
{egui_canvas_t *self = &canvas_data;...if (egui_region_pt_in_rect(&self->base_view_work_region, x, y)){egui_dim_t pos_x = x - self->pfb_location_in_base_view.x;egui_dim_t pos_y = y - self->pfb_location_in_base_view.y;egui_color_t *back_color = (egui_color_t *)&self->pfb[pos_y * self->pfb_region.size.width + pos_x];if (alpha == EGUI_ALPHA_100){*back_color = color;}else{egui_rgb_mix_ptr(back_color, &color, back_color, alpha);}}
}

这样应用层并不需要管PFB是什么,只管在canvas进行绘制,最终canvas会判断像素点是否在PFB中,并进行像素点混合。

PFB性能分析

既然PFB技术这么好,还省RAM,那有什么不足吗?显而易见的就是性能问题,用的PFB越小,屏幕刷新的速率就越慢,因为本身就是用时间来换空间的。

如之前所述,PFB机制对用户是无感的,是canvas在最后时刻决定的,当绘制各种基本图形/图片/文字时,其实CPU是有很多运算的,这些都会影响mips,从设计角度讲,最好不在PFB区域内的图形计算不要进行。

但是实际要实现这一逻辑会很复杂,大多数GUI只做了矩形的二次裁剪。本项目考虑到实际业务中会使用很小的PFB,所以对项目所有基本图形都进行了二次裁剪,进而尽量满足有限RAM依然能够有较好性能。

如下所示例子,最好是Img0全部绘制,Img2上半部分参与绘制,Img1左侧区域绘制。实际大多数项目能处理好Img0和Img2的CPU损耗,但是对于Img1的处理很多时候都不是很友好。

image-20241024115741046

PFB不同尺寸测试

项目设计之初就考虑到PFB很小的场景,专门设计各种case来验证CPU所需的性能(不考虑降数据写入屏幕显存时间)。进行性能测试时,不建议在PC上运行,最好是在单片机环境中进行,这样也可以知道自己芯片中那些绘图操作最耗mips,进而从UI层面优化,减少复杂动作。

运行HelloPerformace例程中的,平台选择stm32g0。命令如下,接好项目配套开发板后,就会下载程序到单片机中,串口会打印时间信息。

make run APP=HelloPerformace PORT=stm32g0

同时修改HelloPerformace例程中的一些配置,EGUI_CONFIG_DEBUG_SKIP_DRAW_ALL设置为1(去除绘制到屏幕的时间)。EGUI_CONFIG_PFB_WIDTHEGUI_CONFIG_PFB_HEIGHT按需配置。

image-20241024135911010

对串口打印数据进行统计如下。

选择行和高为屏幕尺寸10分之一的场景24*32,大多数基本图形绘制性能就与240*32还有24*320差不多了。

场景12*824*32240*3224*320
LINE104.8ms21.6ms10.7ms9.6ms
IMAGE_56549.1ms27.4ms23.6ms24.8ms
IMAGE_565_1(Flash不够,未绘制)23.8ms7.4ms5.4ms5.4ms
IMAGE_565_2(Flash不够,未绘制)23.8ms7.5ms5.4ms5.4ms
IMAGE_565_4(Flash不够,未绘制)23.8ms7.4ms5.3ms5.4ms
IMAGE_565_8(Flash不够,未绘制)23.7ms7.4ms5.4ms5.3ms
IMAGE_RESIZE_56577.5ms40.0ms33.5ms35.6ms
IMAGE_RESIZE_565_1(Flash不够,未绘制)23.8ms7.5ms5.4ms5.4ms
IMAGE_RESIZE_565_2(Flash不够,未绘制)23.8ms7.4ms5.4ms5.4ms
IMAGE_RESIZE_565_4(Flash不够,未绘制)23.7ms7.4ms5.4ms5.4ms
IMAGE_RESIZE_565_8(Flash不够,未绘制)23.7ms7.5ms5.4ms5.4ms
TEXT92.1ms19.5ms12.5ms17.1ms
TEXT_RECT135.0ms24.8ms13.0ms17.6ms
RECTANGLE40.7ms15.7ms12.3ms12.6ms
CIRCLE135.4ms93.8ms84.8ms89.1ms
ARC122.3ms51.0ms36.3ms42.4ms
ROUND_RECTANGLE138.8ms96.0ms86.7ms91.2ms
ROUND_RECTANGLE_CORNERS138.6ms93.5ms84.0ms88.4ms
RECTANGLE_FILL37.7ms18.0ms15.1ms15.6ms
CIRCLE_FILL387.3ms63.5ms23.5ms25.6ms
ARC_FILL212.5ms121.0ms108.4ms108.1ms
ROUND_RECTANGLE_FILL391.4ms66.5ms26.0ms28.4ms
ROUND_RECTANGLE_CORNERS_FILL393.8ms66.8ms26.0ms28.3ms

12*8性能测试数据

=========== Test Mode: LINE ===========
Refresh Screen Time: 104.8ms
=========== Test Mode: IMAGE_565 ===========
Refresh Screen Time: 49.1ms
=========== Test Mode: IMAGE_565_1 ===========
Refresh Screen Time: 23.8ms
=========== Test Mode: IMAGE_565_2 ===========
Refresh Screen Time: 23.8ms
=========== Test Mode: IMAGE_565_4 ===========
Refresh Screen Time: 23.8ms
=========== Test Mode: IMAGE_565_8 ===========
Refresh Screen Time: 23.7ms
=========== Test Mode: IMAGE_RESIZE_565 ===========
Refresh Screen Time: 77.5ms
=========== Test Mode: IMAGE_RESIZE_565_1 ===========
Refresh Screen Time: 23.8ms
=========== Test Mode: IMAGE_RESIZE_565_2 ===========
Refresh Screen Time: 23.8ms
=========== Test Mode: IMAGE_RESIZE_565_4 ===========
Refresh Screen Time: 23.7ms
=========== Test Mode: IMAGE_RESIZE_565_8 ===========
Refresh Screen Time: 23.7ms
=========== Test Mode: TEXT ===========
Refresh Screen Time: 92.1ms
=========== Test Mode: TEXT_RECT ===========
Refresh Screen Time: 135.0ms
=========== Test Mode: RECTANGLE ===========
Refresh Screen Time: 40.7ms
=========== Test Mode: CIRCLE ===========
Refresh Screen Time: 135.4ms
=========== Test Mode: ARC ===========
Refresh Screen Time: 122.3ms
=========== Test Mode: ROUND_RECTANGLE ===========
Refresh Screen Time: 138.8ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS ===========
Refresh Screen Time: 138.6ms
=========== Test Mode: RECTANGLE_FILL ===========
Refresh Screen Time: 37.7ms
=========== Test Mode: CIRCLE_FILL ===========
Refresh Screen Time: 387.3ms
=========== Test Mode: ARC_FILL ===========
Refresh Screen Time: 212.5ms
=========== Test Mode: ROUND_RECTANGLE_FILL ===========
Refresh Screen Time: 391.4ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS_FILL ===========
Refresh Screen Time: 393.8ms

24*32性能测试数据

=========== Test Mode: LINE ===========
Refresh Screen Time: 21.6ms
=========== Test Mode: IMAGE_565 ===========
Refresh Screen Time: 27.4ms
=========== Test Mode: IMAGE_565_1 ===========
Refresh Screen Time: 7.4ms
=========== Test Mode: IMAGE_565_2 ===========
Refresh Screen Time: 7.5ms
=========== Test Mode: IMAGE_565_4 ===========
Refresh Screen Time: 7.4ms
=========== Test Mode: IMAGE_565_8 ===========
Refresh Screen Time: 7.4ms
=========== Test Mode: IMAGE_RESIZE_565 ===========
Refresh Screen Time: 40.0ms
=========== Test Mode: IMAGE_RESIZE_565_1 ===========
Refresh Screen Time: 7.5ms
=========== Test Mode: IMAGE_RESIZE_565_2 ===========
Refresh Screen Time: 7.4ms
=========== Test Mode: IMAGE_RESIZE_565_4 ===========
Refresh Screen Time: 7.4ms
=========== Test Mode: IMAGE_RESIZE_565_8 ===========
Refresh Screen Time: 7.5ms
=========== Test Mode: TEXT ===========
Refresh Screen Time: 19.5ms
=========== Test Mode: TEXT_RECT ===========
Refresh Screen Time: 24.8ms
=========== Test Mode: RECTANGLE ===========
Refresh Screen Time: 15.7ms
=========== Test Mode: CIRCLE ===========
Refresh Screen Time: 93.8ms
=========== Test Mode: ARC ===========
Refresh Screen Time: 51.0ms
=========== Test Mode: ROUND_RECTANGLE ===========
Refresh Screen Time: 96.0ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS ===========
Refresh Screen Time: 93.5ms
=========== Test Mode: RECTANGLE_FILL ===========
Refresh Screen Time: 18.0ms
=========== Test Mode: CIRCLE_FILL ===========
Refresh Screen Time: 63.5ms
=========== Test Mode: ARC_FILL ===========
Refresh Screen Time: 121.0ms
=========== Test Mode: ROUND_RECTANGLE_FILL ===========
Refresh Screen Time: 66.5ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS_FILL ===========
Refresh Screen Time: 66.8ms

240*32性能测试数据

=========== Test Mode: LINE ===========
Refresh Screen Time: 10.7ms
=========== Test Mode: IMAGE_565 ===========
Refresh Screen Time: 23.6ms
=========== Test Mode: IMAGE_565_1 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_565_2 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_565_4 ===========
Refresh Screen Time: 5.3ms
=========== Test Mode: IMAGE_565_8 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565 ===========
Refresh Screen Time: 33.5ms
=========== Test Mode: IMAGE_RESIZE_565_1 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_2 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_4 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_8 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: TEXT ===========
Refresh Screen Time: 12.5ms
=========== Test Mode: TEXT_RECT ===========
Refresh Screen Time: 13.0ms
=========== Test Mode: RECTANGLE ===========
Refresh Screen Time: 12.3ms
=========== Test Mode: CIRCLE ===========
Refresh Screen Time: 84.8ms
=========== Test Mode: ARC ===========
Refresh Screen Time: 36.3ms
=========== Test Mode: ROUND_RECTANGLE ===========
Refresh Screen Time: 86.7ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS ===========
Refresh Screen Time: 84.0ms
=========== Test Mode: RECTANGLE_FILL ===========
Refresh Screen Time: 15.1ms
=========== Test Mode: CIRCLE_FILL ===========
Refresh Screen Time: 23.5ms
=========== Test Mode: ARC_FILL ===========
Refresh Screen Time: 108.4ms
=========== Test Mode: ROUND_RECTANGLE_FILL ===========
Refresh Screen Time: 26.0ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS_FILL ===========
Refresh Screen Time: 26.0ms

24*320性能测试数据

=========== Test Mode: LINE ===========
Refresh Screen Time: 9.6ms
=========== Test Mode: IMAGE_565 ===========
Refresh Screen Time: 24.8ms
=========== Test Mode: IMAGE_565_1 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_565_2 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_565_4 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_565_8 ===========
Refresh Screen Time: 5.3ms
=========== Test Mode: IMAGE_RESIZE_565 ===========
Refresh Screen Time: 35.6ms
=========== Test Mode: IMAGE_RESIZE_565_1 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_2 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_4 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: IMAGE_RESIZE_565_8 ===========
Refresh Screen Time: 5.4ms
=========== Test Mode: TEXT ===========
Refresh Screen Time: 17.1ms
=========== Test Mode: TEXT_RECT ===========
Refresh Screen Time: 17.6ms
=========== Test Mode: RECTANGLE ===========
Refresh Screen Time: 12.6ms
=========== Test Mode: CIRCLE ===========
Refresh Screen Time: 89.1ms
=========== Test Mode: ARC ===========
Refresh Screen Time: 42.4ms
=========== Test Mode: ROUND_RECTANGLE ===========
Refresh Screen Time: 91.2ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS ===========
Refresh Screen Time: 88.4ms
=========== Test Mode: RECTANGLE_FILL ===========
Refresh Screen Time: 15.6ms
=========== Test Mode: CIRCLE_FILL ===========
Refresh Screen Time: 25.6ms
=========== Test Mode: ARC_FILL ===========
Refresh Screen Time: 108.1ms
=========== Test Mode: ROUND_RECTANGLE_FILL ===========
Refresh Screen Time: 28.4ms
=========== Test Mode: ROUND_RECTANGLE_CORNERS_FILL ===========
Refresh Screen Time: 28.3ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt QNetworkProxy详解

一、概述 QNetworkProxy通过设置代理类型、主机、端口和认证信息,可以使应用程序的所有网络请求通过代理服务器进行。它支持为Qt网络类(如QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager等)配置网络层代理支持…

数据仓库基础概念

数据仓库 概念 数据仓库(Data Warehouse, DW)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合。它是为满足企业决策分析需求而设计的。 面向主题:数据仓库围绕特定的主题组织数据,例如“销售”或“人力资源”&am…

springboot自动初始化表结构及其数据

1.通过配置文件进行初始化 mode:控制 SQL 初始化的模式,取值可以是: never:禁用初始化。embedded:仅在嵌入式数据库中初始化。always:每次应用启动时都初始化。 spring:sql:init:platform: mysqlmode: a…

HarmonyOS NEXT开发实战:实现高效下拉刷新与上拉加载组件(二)刷新核心逻辑与空页面集成

前言: 在上一篇文章中,我们深入探讨了如何在HarmonyOS中实现一个功能完备的空页面组件。现在,我们将进入下拉刷新和上拉加载功能的核心逻辑实现。这不仅仅是技术实现,更是对用户体验的深刻理解。本文将详细介绍如何将空页面与下拉刷新、上拉加载逻辑相结合,打造一个既高效…

学成在线实战

#1024程序员节|征文# 一、Bug修改 在实战之前,老师留了一个bug,这个bug出现的原因是因为在查询课程计划时,使用的是Inner join查询,所以当章节下面没有小节的时候,是查不出来数据的,只需要将其…

PHP企业门店订货通进销存系统小程序源码

订货通进销存系统,企业运营好帮手! 📦 开篇:告别繁琐,企业运营新选择 嘿,各位企业主和创业者们!今天我要给大家介绍一款超实用的企业运营神器——“订货通进销存系统”。在这个数字化时代&…

YOLOv5_DeepSORT实现电动自行车头盔佩戴检测系统

获取更多完整项目代码数据集,点此加入免费社区群 : 首页-置顶必看 文档说明 本文档是毕业设计——基于深度学习的电动自行车头盔佩戴检测系统的开发环境配置说明文档,该文档包括运行环境说明以及基本环境配置两大部分。在程序运行前请认真查…

零售行业的数字化营销转型之路

一方面,市场竞争激烈,电商平台、新兴品牌和跨界对手带来巨大压力。另一方面,消费者需求变化迅速,更加追求个性化、多元化和便捷化的购物体验,同时传统零售企业还面临着高成本压力,如租金、人力和库存等。 然…

Rsync数据复制/备份服务应用

文章目录 1. rsync概述1.1 什么是Rsync1.2 rsync的功能1.3 rsync 的功能特性1.4 Rsync 增量复制原理1.5 生产场景架构集群备份方案 2. Rsync工作方式介绍与实践2.1 本地数据传输模式2.1.1 本地数据传输模式语法2.1.2 本地数据传输模式实践 2.2 远程Shell 数据传输模式2.2.1 远程…

WSL(Ubuntu20.04)编译和安装DPDK

编译和安装DPDK DPDK可以使用工具meson和ninja在您的系统上进行配置、构建和安装。 DPDK配置 要配置DPDK构建,请使用: meson setup build --prefix/home/xx/dpdk19.11xxxx:~/dpdk-stable-19.11.14/$ meson setup build Message:Content Skipped libs…

React与TypeScript

React创建项目方式 react脚手架:create-react-app 项目名 --template typescript基于vite创建项目:npm init vitelatest 项目名 – --template react-ts useState自动推导 通常React会根据传入useState的默认值来自动推导类型,不需要显示标…

数据结构练习题5(链表和栈)

1环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测…

vue实现富文本编辑器上传(粘贴)图片 + 文字

vue实现富文本编辑器上传(粘贴)图片 文字 1.安装插件 npm install vue-quill-editor -s2.在使用vue-quill-editor富文本的时候,对于图片的处理经常是将图片转换成base64,再上传数据库,但是base64不好存储。 原理&a…

十七、行为型(命令模式)

命令模式(Command Pattern) 概念 命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求对客户进行参数化,排队请求,以及支持可撤销操作。通过这种模式,调用操作的…

全面指南:中国人工智能大模型技术创新与应用

近期,中国人工智能协会发布了《中国人工智能大模型技术白皮书》,涵盖了大模型发展历程、关键技术、困难及挑战以及未来发展的展望。 在此本文总结了下白皮书的主要内容,并附上白皮书~ 目录第 1 章 大模型技术概述 ........................…

基础数据结构——队列(双端队列,优先级队列,阻塞队列)

双端队列、队列、栈对比 定义特点队列一端删除(头)另一端添加(尾)First In First Out栈一端删除和添加(顶)Last In First Out双端队列两端都可以删除、添加优先级队列优先级高者先出队延时队列根据延时时间…

微信小程序地图功能开发:绘制多边形和标记点

在微信小程序中,地图功能是一个常见的需求,尤其是在需要展示地理位置、导航指引或区域覆盖的应用中。本文将通过一个实际的微信小程序地图组件示例,介绍如何在地图上绘制多边形区域和标记点,以及如何响应用户的点击事件。 项目背景…

V2X介绍

文章目录 什么是V2XV2X的发展史早期的DSRC后起之秀C-V2XC-V2X 和DSRC 两者的对比 什么是V2X 所谓V2X,与流行的B2B、B2C如出一辙,意为vehicle to everything,即车对外界的信息交换。车联网通过整合全球定位系统(GPS)导…

实操 maxkey对接三方文档

实操 maxkey 对接三方文档 概述前置准备:MaxKey 安装与配置:第三方系统准备网络环境 对接三方配置oauth2协议对接导入jar包(调接口)权限加回调重定向获取token处理业务 api对接三方获取api凭证配置 MaxKey更新代码 概述 最近在搞m…

【华为HCIP实战课程十六】OSPF虚链路Vlink,网络工程师

一、vlink续 区域内部的路由优于区域之间的路由,区域之间优于外部路由,外部路由类型1优于外部类型2 只有同一级别的路由才会对比cost <R3>tracert 11.1.1.1 traceroute to 11.1.1.1(11.1.1.1), max hops: 30 ,packet length: 40,press CTRL_C to break 1 10.1.35.5 …