当前位置: 首页 > news >正文

✨【数据变形术:联合体在通信协议中的降维打击】✨

(万字长文详解联合体的二进制魔法与工程实践)


🔮 原理解析:内存空间的量子叠加态

文字叙述
联合体(union)是C语言中最具魔法的数据结构,其所有成员共享同一块内存空间。这种特性使其成为通信协议开发的"瑞士军刀"——同一份数据可呈现浮点、字节流、整型等多种形态,完全消除了传统指针转换的类型安全风险。这种设计哲学类似于量子物理的叠加态概念,通过不同的访问方式触发数据坍缩为特定形态。

代码深度解析

typedef union SensorPacket {float temperature;    // 浮点形态(4字节)uint8_t bytes[4];     // 字节流形态(4字节)uint32_t crc_code;    // 校验码形态(4字节)
} SensorData;
  • 内存布局:三个成员共享4字节内存空间(假设float和uint32_t均为4字节)
  • 访问方式:
    temperature用于业务层读取温度值 → bytes用于物理层发送字节流 → crc_code用于链路层校验
  • 关键优势:消除传统指针转换的未定义行为风险,如*(uint8_t*)&float_val的潜在问题

📡 通信协议实战应用

场景1:串口发送浮点传感器数据(跨平台实现)

文字叙述
在嵌入式系统中,浮点数不能直接通过串口发送。传统方法需要将float指针强制转换为uint8_t数组,但这种方法存在字节序问题和严格别名违规风险。联合体方案通过内存共享特性,安全地实现浮点到字节流的零拷贝转换。

代码逐行解析

// 发送端(Linux系统)
SensorData packet;
packet.temperature = 25.6f;  // 业务层设置温度值
write(fd_serial, packet.bytes, 4); // 物理层直接访问字节数组// 接收端(Windows系统)
uint8_t received[4];
DWORD bytesRead;
ReadFile(hSerial, received, 4, &bytesRead, NULL);  // 读取原始字节
memcpy(packet.bytes, received, 4);  // 填充联合体
printf("温度:%.1f℃", packet.temperature);  // 业务层直接使用浮点数
  • write()系统调用直接操作联合体的字节数组形态
  • memcpy()确保字节顺序一致性(需配合端序处理)
  • 整个过程无需显式类型转换,消除严格别名(strict aliasing)问题
场景2:跨平台数据打包(CAN总线协议)

文字叙述
在汽车电子领域,CAN总线对数据包有严格的长度限制。通过结构体与联合体的嵌套使用,既能保证数据语义的清晰性,又能直接获取原始字节流。#pragma pack指令确保内存紧凑排列,消除不同平台的填充字节差异。

代码深度解析

#pragma pack(push, 1)  // 按1字节对齐(取消填充)
typedef union {struct {uint16_t rpm;     // 2字节转速值float voltage;    // 4字节电压值};                    // 总长度6字节uint8_t raw_data[6];  // 原始字节流形态
} CANPayload;
#pragma pack(pop)       // 恢复默认对齐
  • rpmvoltage组成逻辑关联的数据结构
  • raw_data直接暴露内存原始形态用于总线传输
  • #pragma pack确保结构体总长度为精确的6字节(2+4),避免不同编译器产生不同大小的风险

💡 六大核心优势(标准库强化版)

3. 协议层抽象利器

文字叙述
联合体天然适配分层协议设计,同一份数据可无缝适配HTTP、CAN、UDP等不同协议,无需重复序列化操作。这种设计大幅降低协议转换层的复杂度,提升系统吞吐量。

代码解析

// 多协议适配示例
send_http(packet.bytes, 4);          // HTTP协议(应用层)
can_send_frame(packet.raw_data, 6);  // 原始CAN帧(数据链路层) 
send_udp((char*)packet.bytes, 4);    // UDP数据报(传输层)
  • bytes成员作为通用二进制接口
  • 各协议层直接访问最适合的数据形态
  • 消除传统方案中的多次序列化开销
4. 端序自适应护盾

文字叙述
网络协议必须处理大端序(Big-Endian)与小端序(Little-Endian)的兼容性问题。通过标准库的字节序转换宏,结合联合体的多形态访问,可构建自适应的端序转换机制。

代码深度解析

#include <endian.h>
#if __BYTE_ORDER == __BIG_ENDIAN#define TO_NETWORK_ORDER(val) (val)  // 大端系统无需转换
#else#define TO_NETWORK_ORDER(val) __bswap_32(val) // 小端系统转换
#endif// 使用示例(发送前处理)
packet.crc_code = TO_NETWORK_ORDER(packet.crc_code);
  • __BYTE_ORDER宏检测系统字节序
  • __bswap_32是GCC标准库的32位字节序转换函数
  • 联合体允许先处理整型字段,再发送字节数组

(由于篇幅限制,其他章节的详细解析将以类似方式展开,重点揭示代码背后的设计哲学与工程考量)


🛠️ 性能优化对比表(原理揭秘)

方法性能优势原理
传统指针强制转换需要CPU执行指针算术运算,可能触发严格别名规则导致的指令重排
联合体法直接内存访问,编译器保证类型合法性,无额外指令开销
库函数memcpy函数调用开销+内存拷贝操作,但安全可靠

🚨 避坑指南(原理深度剖析)

2. 内存对齐防护罩

文字叙述
某些平台(如ARM架构)要求严格的内存对齐访问。通过C11标准的对齐控制,可确保联合体适应不同处理器的内存访问特性,避免总线错误。

代码解析

#include <stdalign.h>
alignas(8) union {      // 强制8字节对齐double timestamp;    // 需要8字节对齐的类型uint8_t raw[8];      // 原始字节流
} time_packet;
  • alignas(8)确保联合体起始地址是8的倍数
  • 避免在RISC架构上访问未对齐内存导致的硬件异常

🌌 通信领域扩展应用(原理+实践)

1. 网络协议解析

文字叙述
IP协议栈需要高效解析不同层级的协议头。联合体允许开发者在保持代码可读性的同时,直接操作原始数据包,大幅提升协议解析性能。

代码解析

union IPV4_Header {struct {uint8_t ver_ihl;       // 版本+头部长度uint8_t dscp_ecn;      // 服务类型uint16_t total_length; // 总长度(需ntohs转换)// ...其他字段};uint8_t raw[20];  // 原始数据包
};
  • 结构体成员提供语义化访问
  • raw数组允许直接操作原始数据
  • 字段可配合ntohs()等网络字节序转换函数

联合体就像数据的棱镜,同一份内存通过不同的访问角度折射出多样的数据形态,这正是嵌入式与通信开发的精髓所在!

相关文章:

✨【数据变形术:联合体在通信协议中的降维打击】✨

&#xff08;万字长文详解联合体的二进制魔法与工程实践&#xff09; &#x1f52e; 原理解析&#xff1a;内存空间的量子叠加态 文字叙述&#xff1a; 联合体&#xff08;union&#xff09;是C语言中最具魔法的数据结构&#xff0c;其所有成员共享同一块内存空间。这种特性使…...

docker compose部署minio报错

背景 部分服务使用docker-compose单节点编排&#xff0c;其中对象存储服务使用minio&#xff0c;在minio中配置了aksk后报错 Error: IAM sub-system is partially initialized, unable to write the IAM forma 解决 minio如果配置了aksk等iam类的配置则需要持久化存储到etcd…...

软件开发通用之状态机初认识-基本概念及简单应用

0 前言 在程序开发阶段&#xff08;其实也不限于程序&#xff0c;还包含硬件电路设计&#xff0c;协议设计等&#xff09;&#xff0c;无论使用何种语言&#xff0c;何种工具&#xff0c;何种系统&#xff0c;程序的运行必须符合开发者的预设逻辑&#xff0c;而单独通过大脑记…...

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…...

适配器模式 (Adapter Pattern)

适配器模式 (Adapter Pattern) 是一种结构型设计模式,它将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。 在现实生活中,适配器的例子随处可见,比如电源适配器,它将不同电压的电流转换为设备所需的电压,确保设备能正…...

操作系统WIN11无法出现WLAN图标(解决方案)

本人操作系统WIN11之后无网络图标 于是在设置里查看了一下&#xff0c;是网卡驱动没了 网上去下载一个驱动类软件自行处理即可。 本人使用手机USB网络连的电脑&#xff0c;然后发现网卡驱动凭空出现了&#xff0c;就很困惑&#xff0c;没有下载驱动就恢复了。...

HCL—我与虚拟机的爱恨情仇[特殊字符][特殊字符]‍[特殊字符]️

时隔了三周&#xff0c;我可能算是了解了虚拟机了吧。自从上一次的安装虚拟机&#xff0c;我与HCL、虚拟机就没有停止过纠缠。 为什么很多win11电脑使用不了HCL&#xff0c;或者无法启动HCL设备&#xff1f; 首先来解答&#xff0c;为什么很多win11电脑使用不了HCL&#xff0c…...

illustrate:一款蛋白/核酸结构快速渲染为“卡通风格”的小工具

本期向大家介绍一款蛋白/核酸结构快速渲染&#xff08;卡通风格&#xff09;的小工具——illustrate。放心&#xff01;本期完全不涉及代码&#xff0c;不折腾人&#xff0c;请放心食用。 结构渲染效果示例如下&#xff1a; PDB ID: 1ttt 该小工具适用绘制蛋白或复合物整体轮廓…...

Linux上位机开发实战(能用的开发板计算资源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家所能想到的嵌入式上位机开发&#xff0c;如果是linux&#xff0c;同时涉及到嵌入式的话&#xff0c;一般都会认为是把pc linux的软件port到板子…...

kotlin 内联函数 inline

高阶函数实现的原理&#xff1a;函数类型其实是生成了一个对象 。 inline翻译成中文的意思就是内联&#xff0c;在kotlin里面inline被用来修饰函数&#xff0c;表明当前函数在编译时是以内嵌的形式进行编译的&#xff0c;从而减少了一层函数调用栈&#xff1a; inline fun fun…...

vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】

前端编写 安装 axios 如果当前未安装axios&#xff0c;可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目&#xff0c;在 vite.config.ts 中配置代理&#xff0c;在defineConfig中新增server配置&#xff0c;主要关注两个点&#xff1a; 一、需要代…...

论文阅读:2023 arxiv Multiscale Positive-Unlabeled Detection of AI-Generated Texts

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Multiscale Positive-Unlabeled Detection of AI-Generated Texts https://arxiv.org/abs/2305.18149 https://www.doubao.com/chat/2114270649152258 https://github.com/YuchuanTi…...

【数学建模】最大最小值模型详解

数学建模中的最大最小值模型详解 文章目录 数学建模中的最大最小值模型详解引言最大最小值模型的基本概念最大化问题最小化问题 常见的求解方法1. 微积分法2. 线性规划3. 非线性规划4. 动态规划 实际应用案例案例1&#xff1a;生产规划问题案例2&#xff1a;投资组合优化 最大最…...

Camera2 实现重力感应四个方向调试相机预览

Camera2API 实现重力感应四个方向调试相机预览 文章目录 需求场景 需求实现setAspectRatio 设置显示长宽postScale postRotate 设置缩放和旋转manager.openCamera 打开相机startPreviewgetPreviewRequestBuilder 设置预览参数&#xff1a;createCaptureSession 预览准备工作set…...

C++::多态

目录 一.多态的概念 二.多态的定义及实现 二.1多态的构成条件 二.2虚函数 1.虚函数的写法 2.虚函数的重写/覆盖 3.协变 二.3析构函数的重写 二.4override和final关键字 ​编辑二.5重载/重写/隐藏的对比 三.多态的运行原理&#xff08;一部分&#xff09; 四.多态的常…...

278.缀点成线

1232. 缀点成线 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean checkStraightLine(int[][] coordinates) {if(coordinates.length2){return true;}int xcoordinates[1][0]-coordinates[0][0];int ycoordinates[1][1]-coordinates[0][1];for(int i1;i…...

xssgame第8关注入详解

1.SVG利用实现xss攻击 1.代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>tes…...

《数据库原理》SQLServer期末复习_题型+考点

目录 题型&#xff1a; 一. 概况分析题&#xff08;5小题&#xff0c;每小题2分&#xff0c;共10分&#xff09; 二. 计算题&#xff08;3小题&#xff0c;每小题5分&#xff0c;共15分&#xff09; 三. 数据库设计&#xff08;2小题&#xff0c;每小题10分&#xff0c;共2…...

RK3588开发笔记-RTL8852wifi6模块驱动编译报错解决

目录 前言 一、问题背景 二、驱动编译 总结 前言 在基于 RK3588 进行开发,使用 RTL8852 WiFi6 模块时,遇到了一个让人头疼的驱动编译报错问题:“VFs_internal_I_am_really_a_filesystem_and_am_NoT_a_driver, but does”。经过一番摸索和尝试,最终成功解决了这个问题,在…...

机器学习算法实战——天气数据分析(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 天气数据分析是气象学和数据科学交叉领域的一个重要研究方向。随着大数据技术的发展&#xff0c;气象数据的采集、存储和分…...

java项目之基于ssm的毕业论文管理系统(源码+文档)

项目简介 毕业论文管理系统实现了以下功能&#xff1a; 本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分&#xff0c;具体功能分析如下&#xff1a; &#xff08;1&#xff09;导师功能模块&#xff1a;导师注册登录后主要功能模块包括个人…...

【Vue3入门1】02- vue3的基本操作(上)

本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...

Redis集群搭建和高可用方案(Java实现)

Redis集群搭建和高可用方案(Java实现) 我将详细介绍如何使用Java技术搭建Redis集群并实现高可用方案。 1. Redis集群架构概述 Redis集群可以通过以下几种方式实现: 主从复制Sentinel哨兵模式Redis Cluster集群模式2. 使用Java实现Redis集群连接 2.1 使用Jedis客户端 Je…...

【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论

1. 大模型时代应用工具化以及无忠诚度现象讨论 接触大模型久了&#xff0c;也慢慢探到一些大模型能力表现非常自然和突出的场景&#xff0c;比如AI搜索&#xff08;依赖大模型的理解总结能力&#xff09;、AI对话&#xff08;即chat&#xff0c;依赖大模型的生成能力&#xff0…...

Rust语言学习

Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目&#xff08;模块系统&#xff09;包和crate定义模块来控制作用…...

AI比人脑更强,因为被植入思维模型【16】反脆弱

毛选中就有言&#xff0c;不经历困难&#xff0c;我们就不会掌握战胜困难的方法。 这个世界纷繁复杂&#xff0c;不是强者总是运气好&#xff0c;而是他们能够失败后快速复原&#xff0c;不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型&#xff1f; 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...

计算机视觉的多模态模型

计算机视觉的多模态模型 是指能够同时处理和理解 多种类型数据&#xff08;模态&#xff09; 的模型。这些模态可以包括图像、文本、音频、视频、深度信息等。多模态模型的核心目标是利用不同模态之间的互补信息&#xff0c;提升模型的性能和泛化能力。 1. 多模态模型的核心思想…...

Scrapy 入门教程

Scrapy 入门教程 Scrapy 是一个用于爬取网站数据的 Python 框架&#xff0c;功能强大且易于扩展。本文将介绍 Scrapy 的基本概念、安装方法、使用示例&#xff0c;并展示如何编写一个基本的爬虫。 1. 什么是 Scrapy&#xff1f; Scrapy 是一个开源的、用于爬取网站数据的框架…...

Oracle OCP认证是否值得考?

Oracle OCP&#xff08;Oracle Certified Professional&#xff09;认证是数据库领域的传统权威认证&#xff0c;但随着云数据库和开源技术的崛起&#xff0c;其价值正面临分化。是否值得考取&#xff0c;需结合你的职业定位、行业需求及长期规划综合判断。以下是关键分析&…...

OpenCV中距离公式

一、各类距离公式总结 常见距离公式 欧氏距离&#xff1a; 曼哈顿距离&#xff08;L1&#xff09;‌&#xff1a; 切比雪夫距离&#xff08;Chessboard&#xff09;‌&#xff1a; 1、点与点距离(欧氏距离) ‌二维空间‌ 设两点坐标为 P1(x1,y1)、P2(x2,y2)&#xff0c;其距离…...

DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》|73页|附PPT下载方法

导 读INTRODUCTION 今天分享是由ai呀蔡蔡团队带来的DeepSeek自学手册&#xff1a;《从理论&#xff08;模型训练&#xff09;到实践&#xff08;模型应用&#xff09;》&#xff0c;这是一篇关于DeepSeek模型训练、应用场景及替代方案的综合指南文章&#xff0c;主要介绍了Deep…...

Doris官网上没有的一些Fe参数了,都在源码中

一、FE配置源码 apache-doris-src\fe\fe-common\src\main\java\org\apache\doris\common\Config.java 二、BE配置源码 apache-doris-src\be\src\common\config.cpp 三、FE源码 package org.apache.doris.common;public class Config extends ConfigBase {ConfField(descri…...

(一)丶Windows安装RabbitMQ可能会遇到的问题

一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...

stm32g030移植RT-Thread

移植流程 移植前需要安装Keil.STM32G0xx_DFP.1.2.0.pack组件&#xff0c;大致的移植过程&#xff1a; CubeMX配置RT-Thread组件配置工程模板配置 参考例程配置&#xff1a;拷贝仓库原有的stm32g070-st-nucleo工程&#xff0c;然后另起一个名字&#xff0c;目录结构如下 完整…...

Parsing error: Unexpected token, expected “,“

今天在使用Trae AI 编程工具开发大文件切片上传功能&#xff0c;使用的是VUE3,TS技术栈&#xff0c;开发完成运行时&#xff0c;编译报错&#xff08;Parsing error: Unexpected token, expected ","&#xff09;&#xff0c;让AI自行修复此问题多次后还是没有解决&a…...

Day23: 数组中数字出现的次数

整数数组 sockets 记录了一个袜子礼盒的颜色分布情况&#xff0c;其中 sockets[i] 表示该袜子的颜色编号。礼盒中除了一款撞色搭配的袜子&#xff0c;每种颜色的袜子均有两只。请设计一个程序&#xff0c;在时间复杂度 O(n)&#xff0c;空间复杂度O(1) 内找到这双撞色搭配袜子的…...

目标检测——清洗数据

清洗VOC格式数据集代码示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍历标签文件夹中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…...

嵌入式基础知识学习:UART是什么?

UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;是一种广泛应用于嵌入式系统和通信设备的异步串行通信协议。它通过两根数据线&#xff08;TX和RX&#xff09;实现设备间的全双工数据传输&#xff0c;无需共享时钟信号…...

SpringBoot项目实战(初级)

目录 一、数据库搭建 二、代码开发 1.pom.xml 2.thymeleaf模块处理的配置类 3.application配置文件 4.配置&#xff08;在启动类中&#xff09; 5.编写数据层 ②编写dao层 ③编写service层 接口 实现类 注意 补充&#xff08;注入的3个注解&#xff09; 1.AutoWir…...

合成层优化

以下是关于 合成层(Composite Layer)优化 的系统梳理,涵盖基础原理、触发条件、优化策略及进阶实践,帮助深入理解如何通过分层渲染提升页面性能: 一、合成层基础概念 1. 什么是合成层? 定义:浏览器将页面元素提升为独立的图形层(Graphics Layer),由 GPU 单独处理,避…...

什么是MCP|工作原理是什么|怎么使用MCP|图解MCP

写在前面 Manus的爆火似乎推动了MCP的出圈&#xff0c;虽然Manus没有用MCP。这篇文章我们就讲讲MCP&#xff0c;当然我也是最近才学习到MCP的&#xff0c;如果理解有误的地方&#xff0c;欢迎评论区指出&#xff01; 1. 为什么需要MCP&#xff1f; 1.1 LLM 现状 我们都知道…...

《Partial-label learning with a guided Prototypical classifier》23年CVPR 文献速读

论文地址 1. 引言 本文介绍了一种用于部分标签学习&#xff08;Partial-Label Learning, PLL&#xff09;的新框架 PaPi&#xff08;Partial-label learning with a guided Prototypical classifier&#xff09;&#xff0c;旨在提高在视觉任务中处理部分标签数据时的性能。部…...

GitLens with `Commit Graph`

文章目录 GitLens with Commit Graph GitLens with Commit Graph 自己打包的 GitLens&#xff0c;能够查看 commit graph。 GitLens 持续更新中 下载之后&#xff0c;通过 VSCode 插件直接安装即可使用。...

python每日十题(6)

】函数定义&#xff1a;函数是指一组语句的集合通过一个名字&#xff08;函数名&#xff09;封装起来&#xff0c;要想执行这个函数&#xff0c;只需要调用其函数名即可。函数能提高应用的模块性和代码的重复利用率 在Python语言中&#xff0c;用关键字class来定义类 在Python语…...

UniRel论文复现过程中的问题解决办法(全)

注解写在前面&#xff1a;本文仅为解决各位同学在复现时面对的问题&#xff0c;有问题可以评论&#xff0c;看见会回复&#xff01;&#xff01;&#xff01; [顶刊论文]UniRel:Unified Representation and Interaction for Joint Relational Triple Extraction2022.11.16&…...

js逆向之断点调试

1.XHR/提取断点用法 当刷新页面时候&#xff0c;有大量请求&#xff0c;并且你无法定位参数信息的时候&#xff0c;或者参数被混淆无法搜到&#xff0c;可以用该方法&#xff0c;该方法是会捕获所有请求连接&#xff0c;然后我们通过连接过滤出自己想要的请求&#xff0c;然后…...

Unity Shader编程】之渲染流程之深度及pass详解

关于透明物体的渲染&#xff0c;首先需要了解以下部分 深度缓冲区深度写入深度测试pass渲染和深度测试的过程深度测试和颜色混合过程 ** 一&#xff0c;深度缓冲区 ** 深度即物体距离相机的距离&#xff0c;深度写入即是把物体的距离相机信息记录下来&#xff0c;写入一个名…...

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…...

Compose 原理解析

Compose 的组件都是放在 setContent() 之后才能显示的&#xff0c;那需要先看看这个函数的作用。 先看 ComponentActivity 的扩展函数 setContent()&#xff1a; /*** 将给定的可组合项合成到给定的 Activity 中。[content] 将成为给定 Activity 的根视图。* 这大致相当于使用…...