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

unity中使用spine详解

一.Spine概述

Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程,以创建游戏所需的动画。

Spine原理:将一个模型,根据动画的需求分成一些骨骼,一个骨骼对应一张贴图,控制骨骼位置、缩放、旋转等形成动画;

Spine工作流程如下所示:

参考:认识Spine

二.导入spine-unity 运行时

下载spine-unity unitypackage

下载完成后将其拖入到Project视图中, Import,完成导入,新增Spine和Spine Examples目录

Important:spine运行时版本需要和导入的spine资源一致,若导入不一致的spine资源时,会弹出对话框并报错

参考:spine-unity 下载

三.导入spine资源

3.1 spine导出的文件转unity资产

 通过spine编辑器导出的unity资源如图所示

  1. skeleton-name.json 或 skeleton-name.skel.bytes, 其中包含了skeleton和动画数据.
  2. skeleton-name.atlas.txt, 保存的是texture atlas的信息.
  3. 单个或数个 .png 文件, texture atlas中的一页就对应着这样一个文件, 而texture atlas则包含了skeleton所需的全部图片.

将导出的文件(或包含它们的文件夹)拖到Unity的项目面板中的某个目录下

spine-unity运行时在检测到文件添加后会自动生成Unity所需的资产文件.

自动生成具体会产生以下资产:

  1. 一个代表texture atlas文件 (.atlas.txt)的 _Atlas 资产文件. 它包含对material(材质)和 .atlas.txt 文件的引用.
  2. 一个代表各 texture atlas页 (.png) 的 _Material 资产文件. 它包含对着色器和 .png texture的引用.
  3. 一个存储了skeleton数据 (.json.skel.bytes) 的 _SkeletonData 资产文件. 它包含了对 .json 或 .skel.bytes 文件的引用以及对自动生成的 _Atlas 资产的引用. 它还可以自定义的skeleton导入和设置skeleton动画.

3.2 更新spine资源

在实际开发过程中, 你可能经常需要更新Spine skeleton数据和texture atlas文件. 直接覆盖这些文件其实就能更新这些文件 (.json.skel.bytes.atlas.txt.png). 只需从Spine编辑器中重新导出资产, 并将新导出的文件复制到项目中 Assets 文件夹的子文件夹中覆盖现有文件即可.

Unity会检测这些文件的变化, 并自动重新导入修改后的资产. 自动重新导入会保持对Spine资产引用的完整性同时使用最新数据.

3.3 动画预览

选中*_SkeletonData,在Inspector中可以预览动画,获取动画名称

所有时间轴事件以紫色标记显示. 在播放预览时将鼠标悬停在标记上, 就能显示事件名称.

注意:play模式下无法预览

点击 Create Animation Reference Assets 按钮即可为skeleton的所有动画生成引用资产. AnimationReferenceAsset 和一个引用了 Spine.Animation 的Unity资产行为完全一致, 也可以将它用在Unity检查器的组件属性中.

参考:资产

四.Editor中创建动画对象

  1. 将*_SkeletonData文件拖入Hierarchy视图中
  2. 选择需要的组件
  3. 设置Animation Name

五.spine运行时核心概念(重点)

5.1 混合(重中之重)

Spine支持动画之间的混合, 混合主要有以下两方面的应用场合

  • A.多个动画同时播放,形成新的,较复杂的动画
  • B.动画之间的平滑过渡,而不是从一个姿势突然变成另一个姿势

其实这种需求是动画上的通用需求,Unity的Animator动画通过Transition(过渡),Layer(分层),blend tree(混合树)支持了混合在3D动画上的应用

5.2 通道(Track)

Track可分层应用动画,每个track存储了一个动画和播放参数。Track编号从零累加(track索引在内部是一个数组索引)。在将AnimationState应用到一个骨架后,track动画会从最低的track号开始依序应用。

Track有许多用途,例如,没有任何关键帧的动画可在高层track中运行,只覆盖有关键帧的低层track。例如,Track 0可以有行走、奔跑、游泳或其他动画,track 1可以有一个只为手臂和开枪设置了关键帧的射击动画。此外,为高层track设置TrackEntry alpha可使其与下面的轨道混合。例如,track 0可以有一个行走动画,track 1可以有一个跛行动画。当玩家受伤时,track 1的alpha值会增加,跛行会加重。

5.3 播放

在一个通道上播放动画通过调用setAnimation完成。将使用指定的动画取代该track中的当前动画和任何已排队的动画。如果在前一动画和当前动画之间定义了混合动画时间,则当前动画将在混合动画时间上混出,让动画过渡更流畅。

5.4 排队

要排队动画在将来播放,可调用addAnimation,安排该动画在此track当前动画或最后排队的动画后播放。如果此track空了,则等于调用setAnimation。

5.5 空动画

空动画是spine中比较常用和重要的概念,主要有以下两种应用情况

A.立刻停止轨道上的所有动画,调用setEmptyAnimation

B.当多个动画混合播放(比如动画a0在track0播放,动画a1在track1播放),当a1停止后需要过渡到只有a0播放的状态,调用addEmptyAnimation

Case1:a1播放完后什么都不做(track1未进入empty状态),则a0和a1会混合失败,动画整体或局部静止。

Case2:调用setEmptyAnimation让a1静止,则可能a1播放中途停止,动画表现比较突兀,不是想要的效果。

参考:应用动画

六.主要API

6.1 SetAnimation

​​​​​

setAnimation(int trackIndex, string animationName, bool loop)setAnimation(int trackIndex, Animation animation, bool loop)

在轨道trackIndex立刻播放animationName这个动画,关于轨道的概念参考底部运行时术语

  • loop 若为true则循环播放动画. 若为false则不会循环播放, 
SkeletonAnimation skeletonAnimation = GetComponent<SkeletonAnimation>();
skeletonAnimation.AnimationState.SetAnimation(SpineBlinkPlayer.BlinkTrack, "blink", false);

6.2 AddAnimation

addAnimation(int TrackIndex, Animation animation, bool loop, float delay)

添加一个待播放动画, 在某轨道的当前或最后一个排队动画之后播放. 若该轨道为空, 则相当于调用setAnimation

SkeletonAnimation skeletonAnimation = GetComponent<SkeletonAnimation>();
skeletonAnimation.AnimationState.SetAnimation(0, "anim1", false);
skeletonAnimation.AnimationState.AddAnimation(0, "anim2", true, 0);

6.3 setEmptyAnimation

setEmptyAnimation (	int trackIndex, float mixDuration)

在轨道上设置一个空动画并移除队列中的全部动画, 同时设置轨道条目的mixDuration. 空动画没有时间轴, 它被当作淡入淡出的占位符.

6.4 addEmptyAnimation

addEmptyAnimation (	int trackIndex, float mixDuration, float delay)

添加一个空动画, 在某轨道的当前或最后一个排队动画之后播放, 同时设置该轨道条目的 mixDuration. 若该轨道为空, 则相当于调用 setEmptyAnimation

API参考文档

七.回调事件

7.1 不包括混合(mixing)/淡入淡出(crossfading)的事件

触发流程图

  • Start 当动画开始播放时触发,
    • 当调用SetAnimation时立刻触发.
    • 它也可以在一个队列中的动画开始播放时触发.
  • End 当动画从轨道中被移除(或中断)时触发,
    • 当当前动画快要播放完成时你调用SetAnimation中断了它, 该事件将被触发.
    • 当使用ClearTrack或者ClearTracks清除了轨道时, 该事件也会被触发.
    • 在混合(mix)/淡入淡出(crossfade)期间,在mix完成后End事件将被触发.
    • 当注册到AnimationState时, 永远不要End事件处理中调用SetAnimation, 它会引发无限递归. 请看下面的警告. 可以注册一个TrackEntry.End来替代.
    • 注意, 默认情况下, 非循环动画的TrackEntries不再在动画的持续时间内停止. 相反, 会继续无限期地保持最后一帧, 直到你移除它或用其他动画取代它. 如果你想让你的TrackEntry达到其动画持续时长(duration)时清空轨道, 请将TrackEntry.TrackEnd设置为动画持续时长.
  • Dispose 当AnimationState释放一个(在其生命周期结束时的)TrackEntry时, 会对TrackEntry触发.
    • 像spine-libgdx和spine-csharp这样的运行时会把TrackEntry对象缓存,以减小非必要的GC压力。这在Unity中尤为重要,因为Unity的GC实现有较为老旧低效.
    • 当TrackEntries被释放后,一定要记得移除对它们的所有引用,因为它们可能稍后就会被写入多余数据或触发意外事件.
    • Dispose事件会在End事件后立即触发.
  • Interrupt 当设置了新的动画且当前有一个动画还在播放时触发.
    • 当一个动画开始mixing/crossfading到另一个动画时触发.
  • Complete 当动画完成时触发,
    • 当一个非循环的动画播放完毕时触发,无论是否存在下一个在排队的动画.
    • 在循环动画每次循环结束后,也会触发.
  • Event 任何用户自定义事件被监听到时触发.
    • 这些事件点在Spine编辑器的动画中设置的。它们显示围为紫色的关键帧。在树状视图中也可以看到一个紫色的icon.
    • 为了区分不同的事件,你需要检查Spine.Event eName参数。(或者Data引用).
    • 当你想要按照动画节点去播放声音时它会非常有用,比如播放脚步声。它也可以根据Spine动画去同步或者通知非Spine系统,比如Unity的粒子系统或者产生单独的特效,甚至是诸如对齐发射子弹的时刻这样的游戏逻辑(如果你真的想这么做的话).
    • 每个TrackEntry都有一个EventThreshold属性. 它定义了在淡入淡出的哪些时间点上不触发用户事件.

在一个动画播放完成后,另一个队列中的动画即将开始播放的时候,事件触发的顺序为: CompleteEndStart

7.2 混合动画的事件

当你有设置了mix time(或者在你Skeleton Data Asset中设置了Default Mix),下一段动画开始播放且透明度逐渐增加,同时前一段动画依然在skeleton上生效, 这需要一小段时间.

我们把这段时间称为"淡入淡出"或"混合(mix)".

一个TrackEntry的EventThreshold控制在混合期间如何处理用户事件.

  • 默认值为0,当下一段动画开始播放时,立即停止触发用户事件.
  • 若置为0.5,就会在淡入淡出/混合过程到一半再停止触发用户事件.
  • 若置为1,将继续触发事件,直到淡入淡出/混合过程的最后一帧.

给动画设置合适的EventThreshold值是很重要的,因为你可能有交叠(overlapping)的相同动画,而它们不应该触发同一个事件,或者你希望即使动画已被中断但仍然触发其事件.

// Sample written for for Spine 3.7
using UnityEngine;
using Spine;
using Spine.Unity;// Add this to the same GameObject as your SkeletonAnimation
public class MySpineEventHandler : MonoBehaviour {// The [SpineEvent] attribute makes the inspector for this MonoBehaviour// draw the field as a dropdown list of existing event names in your SkeletonData.[SpineEvent] public string footstepEventName = "footstep"; void Start () {var skeletonAnimation = GetComponent<SkeletonAnimation>();if (skeletonAnimation == null) return;// This is how you subscribe via a declared method.// The method needs the correct signature.skeletonAnimation.AnimationState.Event += HandleEvent;skeletonAnimation.AnimationState.Start += delegate (TrackEntry trackEntry) {// You can also use an anonymous delegate.Debug.Log(string.Format("track {0} started a new animation.", trackEntry.TrackIndex));};skeletonAnimation.AnimationState.End += delegate {// ... or choose to ignore its parameters.Debug.Log("An animation ended!");};}void HandleEvent (TrackEntry trackEntry, Spine.Event e) {// Play some sound if the event named "footstep" fired.if (e.Data.Name == footstepEventName) {Debug.Log("Play a footstep sound!");}}
}

参考:Spine事件 & AnimationState回调函数

八.Spine运行时术语

Atlas 纹理集(atlas), 也被称为纹理图集(texture atlas), 是一个存储了一个纹理的命名区域. Spine可以打包纹理来新建一个图集, 也可以使用像Texture Packer Pro(大多数运行时使用的是 "libgdx "图集格式)这样的外部工具来创建图集.

Animation 动画(Animation)是一个存储了多条时间轴的列表. 每条时间轴都存储着许多关键帧, 每个关键帧都包含一个时间点以及一个/多个值. 当应用动画时, 时间轴使用这些关键帧来操作骨架(skeleton)、触发事件等. 动画不会存储任何状态.

AnimationState 动画状态(AnimationState)是一个方便的类, 它包含可用于骨架(skeleton)的一个或多个动画状态. 它有一个"轨道"的概念, 其索引号从零开始. 在每一帧中依次应用每条轨道中的动画, 且可以在动画轨道之上应用动画. 每个轨道都可以队列动画以便稍后播放. 当当前动画发生变化时, 动画状态还可以处理动画间的Mix(比如淡入淡出).

Attachment 附件(Attachment)放置在槽位中, 由此便附加于骨骼上. 它可以是一块texture区域也可以是边界框.

AttachmentLoader SkeletonJson使用附件加载器(AttachmentLoader)创建附件. 这个钩子函数用于注入自定义的附件实现, 例如实现惰性加载. 附件加载器最常见的用途是用于定制区域附件的图片源.

Bone 一个骨骼包含局部变换(SRT), 其子骨骼也会继承该变换. 一个骨骼也有世界变换, 它是所有父骨骼变换与局部变换的组合. 世界变换使用和根骨骼相同定义的坐标系.

Bounding box attachment 一个用于执行撞击检测、物理模拟等功能的多边形附件.

Draw order 绘制顺序(Draw order)是骨架(skeleton)上槽位的一个列表. 该列表的顺序表示从后到前绘制每个槽位中附件的顺序.

Mixing 混合(Mixing), 也被称为淡入淡出, 是通过在当前pose和动画pose间进行线性混合(blend)来使用动画的一种方式.

Region attachment 一个附件(attachment)包含一个纹理(texture)区域和一个偏移SRT, 这个偏移量用于对齐相对于附件的骨骼区域.

Slot 槽位(Slot)是骨骼上的一个占位符. 一个槽位既可包含一个附件也可不包含附件. 它也有自己的颜色且记录其附件切换后的保持时长.

Skeleton 骨架(Skeleton)保存着一个骨架的状态. 这包括当前pose、骨骼、槽位、绘制顺序等.

SkeletonBounds 骨架边界(SkeletonBounds)是一个方便的类, 它使用当前附加的边界框附件为骨架进行碰撞检测.

SkeletonData 骨架数据(SkeletonData)包含骨架信息(绑定pose的骨骼、槽位、绘制顺序、附件、皮肤等)和动画, 但不保存任何状态. 多个骨架可以共享同一个骨架数据

SkeletonJson 用于从JSON中加载SkeletonData.

SkeletonRenderer 骨架渲染器(SkeletonRenderer)在骨架的绘制顺序中重复遍历各插槽位, 并负责渲染各种附件.

Skin 皮肤(Skin)是一个映射(map), 其键(key)是槽位和名称, 值为附件. 皮肤是一个间接层, 它可以按槽位和名称来找到某个附件. 例如, 一个皮肤可能的键为[slot:head,name:head], 值为[attachment:redHead]. 另一个皮肤的同样的键值则为[attachment:greenHead]. 在动画中使用名称可使具有不同附件的骨架通过改变附件的方法复用动画.

SRT 缩放(Scale)、旋转(Rotation)和平移(Translation). 也被称为"变换(transform)".

Transform 缩放(Scale)、旋转(Rotation)和平移(Translation).

参考:

Spine概述

spine-unity 运行时文档

Spine运行时指南

Spine运行时文档

相关文章:

unity中使用spine详解

一.Spine概述 Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程&#xff0c;以创建游戏所需的动画。 Spine原理&#xff1a;将一个模型&#xff0c;根据动画的需求分成一些骨骼&#xff0c;一个骨骼对应一张贴图&#xff0c;控制骨骼…...

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …...

利用STM32TIM自制延迟函数实验

一、实验目的 掌握STM32定时器&#xff08;TIM&#xff09;的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 ​定时器基础&#xff1a; STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...

Android Activity栈关系解析

在 Android 系统中&#xff0c;这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系&#xff0c;每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例&#xff1a; 1. ActivityRecord&#xff08;活动记录&#xff09; 是什么…...

java使用word模板填充内容,再生成pdf

1.word模板填充内容 使用EasyPoi写入Word文档。 import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File; import java…...

回归实战详细代码+解析:预测新冠感染人数

回归实战&#xff1a;预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集&#xff0c;说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程&#xff0c;当然人和机器现在都不知道什么计算是什么&#xff0c;这是一个黑箱。 黑箱比喻&#xff1a;把模型想象成自…...

AI人工智能机器学习之聚类分析

1、概要 本篇学习AI人工智能机器学习之聚类分析&#xff0c;以KMeans、AgglomerativeClustering、DBSCAN为例&#xff0c;从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法&#xff0c;用于将数据集中的样本划分为不同的组&#xff…...

(下:补充——五个模型的理论基础)深度学习——图像分类篇章

目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构&#xff0c;BN以及迁移学习详解 总结&#xff08;可以直接看总结&#xff09; 1.1 卷积神经网络基础 视频讲解&#xf…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中&#xff0c;不管是市场研究还是科学分析&#xff0c;经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件&#xff0c;这种方式不便之处是不方便跟动态文字段落结合在一起&#xff0c;也不方便分…...

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件&#xff0c;支持使用java、object-c等原生语言编写&#xff0c;从HBuilderX 3.6起&#xff0c;新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作

目录 0.本地代码分区1.配置自己的个人信息&#xff08;设置一次即可&#xff09;2.新建仓库3.提交代码到暂存区&#xff08;加入购物车&#xff09;4.从暂存区撤回&#xff08;不会改变工作区文件&#xff09;5.恢复指定版本&#xff08;会改变工作区文件&#xff09;5.1&#…...

《国密算法开发实战:从合规落地到性能优化》

前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…...

LeetCode-154. 寻找旋转排序数组中的最小值 II

1、题目描述&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,…...

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法&#xff08;顾名思义&#xff0c;就是把没有顺序的…...

Ubuntu从零创建Hadoop集群

目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

Node.js, Bun, Deno 比较概述

以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl&#xff08;Node.js 原作者&#xff09;Jarred Sumner运行时引擎V8&#xff08;Chrome&#xff09;V8&#xff08;Chrome&#xff09;JavaScriptCore&#…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...