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

110. UE5 GAS RPG 实现玩家角色数据存档

在这篇,我们实现将玩家数据保存到存档内。

增加保存玩家属性

玩家属性默认的等级,经验值,可分配的技能点和属性点。还有一些角色基础属性也需要保存,回忆一下,我们是如何实现玩家的属性的,我们是通过多个GE去实现的玩家的属性,将其分为了基础属性、额外属性和最后填充当前的血量和蓝量。基础属性首先有一些默认的属性,通过Instant类型的GE应用,后期属性增长可以通过分配属性点去实现,额外属性是基于基础属性计算得出,所以这些属性不需要去保存到存档,所以我们只需要保存基础属性值即可。
我们在SaveGame类里增加对应的需要保存的属性

	//经验值UPROPERTY()int32 XP = 0;//可分配技能点UPROPERTY()int32 SpellPoints = 0;//可分配属性点UPROPERTY()int32 AttributePoints = 0;/************************** 主要属性 **************************///力量UPROPERTY()float Strength = 0;//智力UPROPERTY()float Intelligence = 0;//韧性UPROPERTY()float Resilience = 0;//体力UPROPERTY()float Vigor = 0;

现在有了对应的参数,我们需要去实现对属性保存,然后保存的存档里。
在检查点和玩家产生碰撞后,会触发角色身上的SaveProgress函数。我们直接在里面增加对应的属性设置,角色常规属性我们在PlayerState上设置的,直接在PlayerState上设置即可。角色基础属性是保存在AS里,我们从AS里获取并设置到存档。
这里注意:如果通过检查点保存了存档,证明保存了当前的玩家操作后的数据,我们需要将bFirstTimeLoadIn 设置为false。

void ARPGHero::SaveProgress_Implementation(const FName& CheckpointTag)
{if(const ARPGGameMode* GameMode = Cast<ARPGGameMode>(UGameplayStatics::GetGameMode(this))){//获取存档ULoadScreenSaveGame* SaveGameData = GameMode->RetrieveInGameSaveData();if(SaveGameData == nullptr) return;//修改存档数据SaveGameData->PlayerStartTag = CheckpointTag;SaveGameData->ActivatedPlayerStatTags.AddUnique(CheckpointTag); //将检查点添加到已激活数组,并去重//修改玩家相关if(const ARPGPlayerState* RPGPlayerState = Cast<ARPGPlayerState>(GetPlayerState())){SaveGameData->PlayerLevel = RPGPlayerState->GetPlayerLevel();SaveGameData->XP = RPGPlayerState->GetXP();SaveGameData->AttributePoints = RPGPlayerState->GetAttributePoints();SaveGameData->SpellPoints = RPGPlayerState->GetSpellPoints();}//修改主要属性SaveGameData->Strength = URPGAttributeSet::GetStrengthAttribute().GetNumericValue(GetAttributeSet());SaveGameData->Intelligence = URPGAttributeSet::GetIntelligenceAttribute().GetNumericValue(GetAttributeSet());SaveGameData->Resilience = URPGAttributeSet::GetResilienceAttribute().GetNumericValue(GetAttributeSet());SaveGameData->Vigor = URPGAttributeSet::GetVigorAttribute().GetNumericValue(GetAttributeSet());SaveGameData->bFirstTimeLoadIn = false; //保存完成将第一次加载属性设置为false//保存存档GameMode->SaveInGameProgressData(SaveGameData);}
}

现在我们有了对应的配置,在创建存档时,我们就可以设置它的等级了。
在存档视图模型里设置玩家等级属性

	//角色的等级UPROPERTY(BlueprintReadOnly, FieldNotify, Setter, Getter, meta=(AllowPrivateAccess)) //meta=(AllowPrivateAccess)允许设置私有,但在蓝图公开int32 PlayerLevel;

创建Get和Set函数

	void SetPlayerLevel(const int32 InPlayerLevel);int32 GetPlayerLevel() const { return PlayerLevel; };

设置时,并触发广播,在UI上使用对应的部件,我们就可以同步更新

void UMVVM_LoadSlot::SetPlayerLevel(const int32 InPlayerLevel)
{UE_MVVM_SET_PROPERTY_VALUE(PlayerLevel, InPlayerLevel);
}

后面编译代码,在UI上,记得绑定
在这里插入图片描述
接着,我们在加载界面视图模型里创建新存档时,设置存档玩家等级
在这里插入图片描述
在加载存档时,修改存档视图模型的等级
在这里插入图片描述

加载存档角色属性

我们现在实现了保存,那么,接下来,将实现从存档读取角色的属性并设置回去。
我们接下来在存档里设置一个值,这个值用于记录当前角色是否为第一加载存档,因为在加载界面创建的角色还没有设置初始属性

	//第一次加载存档UPROPERTY()bool bFirstTimeLoadIn = true;

考虑到从存档读取玩家信息方法有可能后续在别的地方使用,我们将其设置为一个函数库函数,之前,我们将角色的基本属性初始值设置到的GE里,是写死的,每个角色初始值是不同的,如果在存档读取,则需要从存档读取值然后设置,那么我们需要一个SetByCaller的GE来实现对玩家属性的定义。
我们在之前定义敌人使用初始化数据的类里额外增加一项,这一项是可以在GameMode或者PlayerState里获取到的

	//主要属性,玩家的基础属性,通过SetByCaller设置UPROPERTY(EditDefaultsOnly, Category="Common Class Defaults")TSubclassOf<UGameplayEffect> PrimaryAttributes_SetByCaller;

然后就是设置玩家的次级属性和额外属性的GE,我们已经设置到了玩家角色身上,没必要在别的地方再设置一次,实现获取,我们可以在玩家接口里实现两个获取函数。在玩家接口类IPlayerInterface里,我们增加两个函数,用于获取对应的GE

	//获取角色使用的次级属性GameplayEffectUFUNCTION(BlueprintNativeEvent, BlueprintCallable)TSubclassOf<UGameplayEffect> GetSecondaryAttributes();//获取角色使用的额外属性GameplayEffectUFUNCTION(BlueprintNativeEvent, BlueprintCallable)TSubclassOf<UGameplayEffect> GetVitalAttributes();

然后在玩家基类里覆写

	virtual TSubclassOf<UGameplayEffect> GetSecondaryAttributes_Implementation() override;virtual TSubclassOf<UGameplayEffect> GetVitalAttributes_Implementation() override;

直接返回在玩家身上设置的对应类即可

TSubclassOf<UGameplayEffect> ARPGHero::GetSecondaryAttributes_Implementation()
{return DefaultSecondaryAttributes;
}TSubclassOf<UGameplayEffect> ARPGHero::GetVitalAttributes_Implementation()
{return DefaultVitalAttributes;
}

现在,实现读取存档所需的GE已经可以都获取,我们可以在函数库实现对应的函数。
我们在函数库实现一个通过存档初始化角色属性的函数,需要传入角色,ASC和读取的存档

	/*** 从存档初始化角色的属性** @param WorldContextObject 一个世界场景的对象,用于获取当前所在的世界* @param ASC 角色的技能系统组件* @param SaveGame 角色使用的存档指针** @return void ** @note 这个函数主要用于从存档里读取角色信息,并初始化*/UFUNCTION(BlueprintCallable, Category="RPGAbilitySystemLibrary|CharacterClassDefaults", meta=(DefaultToSelf = "WorldContextObject"))static void InitializeDefaultAttributesFromSaveData(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ULoadScreenSaveGame* SaveGame);

实现这里,获取到ASC的Avatar,我们将ASC的Avatar设置为了玩家角色实例,从数据资产里获取到SetByCaller的GE,通过SetByCaller设置角色的基础属性,然后通过玩家接口获取到次级属性的GE和额外属性的GE设置玩家的其它属性,我们就实现了对应的函数。

void URPGAbilitySystemLibrary::InitializeDefaultAttributesFromSaveData(const UObject* WorldContextObject, UAbilitySystemComponent* ASC, ULoadScreenSaveGame* SaveGame)
{AActor* AvatarActor = ASC->GetAvatarActor();const FRPGGameplayTags& GameplayTags = FRPGGameplayTags::Get();//从实例获取到关卡角色的配置const UCharacterClassInfo* CharacterClassInfo = GetCharacterClassInfo(WorldContextObject);if(CharacterClassInfo == nullptr) return;//*********************************初始化主要属性*********************************//创建GE的上下文句柄FGameplayEffectContextHandle EffectContextHandle = ASC->MakeEffectContext();EffectContextHandle.AddSourceObject(AvatarActor);//根据句柄和类创建GE实例,并可以通过句柄找到GE实例const FGameplayEffectSpecHandle PrimaryContextHandle = ASC->MakeOutgoingSpec(CharacterClassInfo->PrimaryAttributes_SetByCaller, 1.0f, EffectContextHandle);//通过标签设置GE使用的配置UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(PrimaryContextHandle, GameplayTags.Attributes_Primary_Strength, SaveGame->Strength);UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(PrimaryContextHandle, GameplayTags.Attributes_Primary_Intelligence, SaveGame->Intelligence);UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(PrimaryContextHandle, GameplayTags.Attributes_Primary_Resilience, SaveGame->Resilience);UAbilitySystemBlueprintLibrary::AssignTagSetByCallerMagnitude(PrimaryContextHandle, GameplayTags.Attributes_Primary_Vigor, SaveGame->Vigor);//应用GEASC->ApplyGameplayEffectSpecToSelf(*PrimaryContextHandle.Data.Get());if(AvatarActor->Implements<UPlayerInterface>()){//*********************************设置次级属性*********************************FGameplayEffectContextHandle SecondaryContextHandle = ASC->MakeEffectContext();SecondaryContextHandle.AddSourceObject(AvatarActor);const FGameplayEffectSpecHandle SecondarySpecHandle = ASC->MakeOutgoingSpec(IPlayerInterface::Execute_GetSecondaryAttributes(AvatarActor), 1.0f, SecondaryContextHandle);ASC->ApplyGameplayEffectSpecToSelf(*SecondarySpecHandle.Data.Get());//*********************************填充血量和蓝量*********************************FGameplayEffectContextHandle VitalContextHandle = ASC->MakeEffectContext();VitalContextHandle.AddSourceObject(AvatarActor);const FGameplayEffectSpecHandle VitalSpecHandle = ASC->MakeOutgoingSpec(IPlayerInterface::Execute_GetVitalAttributes(AvatarActor), 1.0f, VitalContextHandle);ASC->ApplyGameplayEffectSpecToSelf(*VitalSpecHandle.Data.Get());}
}

接下来,我们在玩家角色类里增加一个新的函数,用于从存档里读取玩家信息并设置。

	//角色加载存档保存的数值void LoadProgress() const;

然后我们取消之前在初始化ASC后设置属性的函数调用
在这里插入图片描述
然后在PossessedBy函数里,取消初始化技能,并在初始化完成ASC后,调用加载存档设置角色。PossessedBy只在服务器端执行。
在这里插入图片描述
接着我们将实现读取存档获取玩家属性,获取到PlayerState设置等级,经验,可分配的属性点和技能点。这里它没通过bFirstTimeLoadIn区分的原因是因为我们创建存档时,默认值就是初始值,所以可以直接设置。
然后我们判断是否为第一次加载存档(之前没有保存过存档数据),如果是第一次,我们将通过默认值初始化,也就是之前默认的那一套,然后初始化默认的角色技能。
如果玩家之前通过检查点保存过数据,我们通过函数库函数通过存档设置数据,然后调用默认初始化技能(方便测试)。

void ARPGHero::LoadProgress() const
{if(const ARPGGameMode* GameMode = Cast<ARPGGameMode>(UGameplayStatics::GetGameMode(this))){//获取存档ULoadScreenSaveGame* SaveGameData = GameMode->RetrieveInGameSaveData();if(SaveGameData == nullptr) return;//修改玩家相关if(ARPGPlayerState* RPGPlayerState = Cast<ARPGPlayerState>(GetPlayerState())){RPGPlayerState->SetLevel(SaveGameData->PlayerLevel, false);RPGPlayerState->SetXP(SaveGameData->XP);RPGPlayerState->SetAttributePoints(SaveGameData->AttributePoints);RPGPlayerState->SetSpellPoints(SaveGameData->SpellPoints);}//判断是否为第一次加载存档,如果第一次,属性没有相关内容if(SaveGameData->bFirstTimeLoadIn){//如果第一次加载存档,使用默认GE初始化主要属性InitializeDefaultAttributes();//初始化角色技能AddCharacterAbilities();}else{//如果不是第一次,将通过函数库函数通过存档数据初始化角色属性URPGAbilitySystemLibrary::InitializeDefaultAttributesFromSaveData(this, AbilitySystemComponent, SaveGameData);//初始化角色技能 TODO:还未实现通过存档获取保存的技能,现在测试使用。AddCharacterAbilities();}}
}

我们之前实现方式是直接使用GE初始化,这个可以在首次进入游戏时使用,后续使用存档初始化时,将无法使用。
在这里插入图片描述

设置蓝图实现属性保存读取

代码编写完毕,我们编译代码打开UE设置对应蓝图。
通过之前创建的角色默认初始化GE我们复制一个创建一个通过SetByCaller设置角色主要属性。
在这里插入图片描述
然后将GE里的属性设置都修改为SetByCaller的方式
在这里插入图片描述
并设置每个属性对应的标签
在这里插入图片描述
然后我们设置到角色初始化属性的资产数据里,方便后续使用。
在这里插入图片描述
最后,我们运行,击杀几只小怪,等级提升后,查看属性
在这里插入图片描述
然后在新的检查点保存存档。
在这里插入图片描述
重新进入查看存档等级是否正确。
在这里插入图片描述
然后进入地牢查看属性是否正确设置回去。
在这里插入图片描述
在这里插入图片描述

解决通过存档进入游戏弹框问题

我们现在发现通过存档进入场景时,会触发升级提示,我们想取消这个。
我们需要修改委托,在设置PlayerState等级后,触发委托广播,我们需要使用一个新的委托类型,可以返回当前是否需要触发等级提升广播。

DECLARE_MULTICAST_DELEGATE_TwoParams(FOnPlayerLevelChanged, int32, bool); //等级变动委托,返回新的等级和是否显示升级弹框

修改等级变动委托类型

FOnPlayerLevelChanged OnLevelChangedDelegate; //等级变动委托

设置等级这里可以在调用函数时,选择设置

	/*** 设置当前等级* @param InLevel 新的等级* @param bLevelUp 当前是否提升了等级*/void SetLevel(int32 InLevel, const bool bLevelUp); 

AddToLevel是在AS里等级提升后,会调用此函数,所以,我们广播返回true

void ARPGPlayerState::AddToLevel(const int32 InLevel)
{Level += InLevel;OnLevelChangedDelegate.Broadcast(Level, true);
}void ARPGPlayerState::SetLevel(const int32 InLevel, const bool bLevelUp)
{Level = InLevel;OnLevelChangedDelegate.Broadcast(Level, bLevelUp);
}void ARPGPlayerState::OnRep_Level(int32 OldLevel) const
{OnLevelChangedDelegate.Broadcast(Level, true); //上面修改委托只会在服务器触发,在此处设置是在服务器更新到客户端本地后触发
}

在主界面使用的Controller里,我们也需要同样的操作返回布尔值
在这里插入图片描述
最后在蓝图里,通过此值判断来是否要触发界面等级提示信息。
在这里插入图片描述

相关文章:

110. UE5 GAS RPG 实现玩家角色数据存档

在这篇&#xff0c;我们实现将玩家数据保存到存档内。 增加保存玩家属性 玩家属性默认的等级&#xff0c;经验值&#xff0c;可分配的技能点和属性点。还有一些角色基础属性也需要保存&#xff0c;回忆一下&#xff0c;我们是如何实现玩家的属性的&#xff0c;我们是通过多个…...

Excel - VLOOKUP函数将指定列替换为字典值

背景&#xff1a;在根据各种复杂的口径导出报表数据时&#xff0c;因为关联的表较多、数据量较大&#xff0c;一行数据往往会存在三个以上的字典数据。 为了保证导出数据的效率&#xff0c;博主选择了导出字典code值后&#xff0c;在Excel中处理匹配字典值。在查询百度之后&am…...

多线程并发造成的数据重复问题解决方案参考(笔记记录)

一、添加 MySQL 组合唯一索引&#xff0c;需要注意什么坑&#xff1f; 在 MySQL 中&#xff0c;创建组合唯一索引&#xff08;Composite Unique Index&#xff09;时&#xff0c;需要注意以下一些容易踩的坑&#xff1a; 1. 字段顺序影响索引使用 问题&#xff1a;组合唯一索…...

使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法

在使用uniapp开发微信小程序时候&#xff0c;过多的引入uni_modules的组件库&#xff0c;会导致主包文件过大&#xff0c;导致无法上传微信小程序&#xff0c;主包要求大小不超过1.5MB.分包大小每个不能超过2M。 解决方法&#xff1a;分包。 1.对每个除了主页面navbar的页面进…...

01_MinIO部署(Windows单节点部署/Docker化部署)

单节点-Windows环境安装部署 在Windows环境安装MinIO&#xff0c;主要包含两个东西&#xff1a; MinIO Server&#xff08;minio.exe&#xff09;&#xff1a;应用服务本身MinIO Client&#xff08;mc.exe&#xff09;&#xff1a;MinIO客户端工具&#xff08;mc&#xff09;…...

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…...

【AI知识】两类最主流AI应用(文生图、ChatGPT)中的目标函数

之前写过一篇 【AI知识】了解两类最主流AI任务中的目标函数&#xff0c;介绍了AI最常见的两类任务【分类、回归】的基础损失函数【交叉熵、均方差】&#xff0c;以初步了解AI的训练目标。 本篇更进一步&#xff0c;聊一聊流行的“文生图”、“聊天机器人ChatGPT”模型中的目标函…...

区块链入门—带你快速了解(通俗易懂)

读懂这篇文章需要有一定的数据结构与算法的基础。 本篇文章如果有不正确的地方&#xff0c;欢迎指正。 目录 一、区块链基础 1.基本概念 2.核心特性 3.区块链分类 4.区块链发展历程 二、区块链技术概念 1.技术架构 2.区块图解 3.共识机制 4.智能合约 5.密码学—哈…...

【数据库知识】mysql进阶-Mysql数据库的主从复制

mysql主从复制 概述一、数据同步机制二、复制流程三、保证数据一致性的措施四、复制拓扑结构五、应用场景与优势 双主复制的过程一、配置前的准备二、配置主服务器三、配置从服务器&#xff08;相对角色&#xff09;四、验证复制状态五、处理潜在的问题 双主复制如何解决冲突问…...

深度学习中的mAP

在深度学习中&#xff0c;mAP是指平均精度均值(mean Average Precision)&#xff0c;它是深度学习中评价模型好坏的一种指标(metric)&#xff0c;特别是在目标检测中。 精确率和召回率的概念&#xff1a; (1).精确率(Precision)&#xff1a;预测阳性结果中实际正确的比例(TP / …...

TB6612电机驱动模块使用指南

实物图&#xff1a; 简介&#xff1a;TB6612是一款双路H桥型直流电机驱动模块&#xff0c;可以控制两个直流电机的转速和方向 H桥&#xff1a;(双路H桥就是有两个这个结构) 引脚图&#xff1a;...

小试牛刀-Anchor安装和基础测试

目录 一、编写目的 二、安装步骤 2.1 安装Rust 设置rustup镜像 安装Rust 2.2 安装node.js 2.3 安装Solana-CLI 2.4 安装Anchor CLI 三、Program测试 四、可能出现的问题 Welcome to Code Blocks blog 本篇文章主要介绍了 [Anchor安装和基础测试] 博主广交技术好友&…...

基于FPGA(现场可编程门阵列)的SD NAND图片显示系统是一个复杂的项目,它涉及硬件设计、FPGA编程、SD卡接口、NAND闪存控制以及图像显示等多个方面

文章目录 0、前言 1、目标 2、图片的预处理 3、SD NAND的预处理 4、FPGA实现 4.1、详细设计 4.2、仿真 4.3、实验结果 前言 在上一篇文章《基于FPGA的SD卡的数据读写实现&#xff08;SD NAND FLASH&#xff09;》中&#xff0c;我们了解到了SD NAND Flash的相关知识&am…...

1.tree of thought (使用LangChain解决4x4数独问题)

本教程将介绍如何使用LangChain库和chatglm API来解决一个4x4的数独问题。我们将通过以下步骤实现这一目标&#xff1a; 初始化chatglm 的聊天模型。定义数独问题和解决方案。创建一个自定义的检查器来验证每一步的思考。使用ToTChain来运行整个思考过程。 1. 初始化chatglm4…...

对subprocess启动的子进程使用VSCode python debugger

文章目录 1 情况概要&#xff08;和文件结构&#xff09;2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…...

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…...

Android中常见内存泄漏的场景和解决方案

本文讲解Android 开发中常见内存泄漏场景及其解决方案&#xff0c;内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致&#xff0c;如果静态变量持有了对 Activity 或其他大对象的引用&#xff0c;就可能导致内存泄漏…...

爬取链家二手房房价数据存入mongodb并进行分析

感谢您的关注&#xff01;需要完整源码评论区获取~ 【实验目的】 1. 使用 python 将爬虫数据存入 mongodb&#xff1b; 2. 使用 python 读取 mongodb 数据并进行可视化分析。 【实验原理】 MongoDB 是文档数据库&#xff0c;采用 BSON 的结构来存储数据。在文档中可嵌套其…...

《TCP/IP网络编程》学习笔记 | Chapter 13:多种 I/O 函数

《TCP/IP网络编程》学习笔记 | Chapter 13&#xff1a;多种 I/O 函数 《TCP/IP网络编程》学习笔记 | Chapter 13&#xff1a;多种 I/O 函数send & recv 函数Linux 平台下的 send 和 recv 函数MSG_OOB&#xff1a;发送紧急消息紧急模式的工作原理检查输入缓冲 readv & w…...

详细介绍下oracle冷备(coolbackup)

冷备&#xff0c;也就说数据库不是运行&#xff08;热的状态&#xff09;的备份。有些时候我们的数据库比较小&#xff0c;进行同操作系统数据迁移和恢复的时候就比较好用。下面我们详细介绍下oracle数据库的冷备&#xff08;我们使用最简单的拷贝数据文件方式进行冷备&#xf…...

MYSQL——多表设计以及数据库中三种关系模型

大致介绍数据库中三种关系模型 一对多&#xff08;1:N&#xff09; 定义&#xff1a; 一个实体可以与另一个实体的多个实例相关联&#xff0c;而后者只能与前者的一个实例相关联。 例子&#xff1a; 学生和课程的关系。 学生&#xff08;1&#xff09;&#xff1a;每个学生…...

泷羽sec学习打卡-html基础

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于云技术基础的那些事儿-捕获帅照 html基础什么是html&#xff1f; 常用的html标签html示例 css基础什…...

国标GB28181摄像机接入EasyGBS国标GB28181设备管理软件:GB28181-2022媒体传输协议解析

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中&#xff0c;国标GB28181设备管理软件EasyGBS成为了这场技术变革的重要一环。 GB28181-2022媒体传输协议 媒体传输命令包括实时视音频点播、历史视音频回放/…...

鸿蒙网络编程系列50-仓颉版TCP回声服务器示例

1. TCP服务端简介 TCP服务端是基于TCP协议构建的一种网络服务模式&#xff0c;它为HTTP&#xff08;超文本传输协议&#xff09;、SMTP&#xff08;简单邮件传输协议&#xff09;等高层协议的应用程序提供了可靠的底层支持。在TCP服务端中&#xff0c;服务器启动后会监听一个或…...

JMeter监听器与压测监控之 InfluxDB

1. 简介 在本文中&#xff0c;我们将介绍如何在 Kali Linux 上通过 Docker 安装 InfluxDB&#xff0c;并使用 JMeter 对其进行性能监控。InfluxDB 是一个高性能的时序数据库&#xff0c;而 JMeter 是一个开源的性能测试工具&#xff0c;可以用于对各种服务进行负载测试和性能监…...

混合上下文学习 ;In-Context Learning(ICL)

目录 In-Context Learning(ICL) 混合上下文学习 核心内容 核心创新点的原理与理论 举例说明 In-Context Learning(ICL) 是一种在大语言模型(LLM)中使用的技术,它允许模型通过提供一组输入输出示例(即“demonstrations”)来适应新任务,而无需对模型参数进行显…...

【STM32】软件I2C读写MPU6050

文章目录 软件I2C读写MPU6050接线图代码整体框架MyI2C模块MyI2C.cMyI2C.h MPU6050模块MPU6050.cMPU6050_Reg.h MPU6050.h main.c 源程序 软件I2C读写MPU6050 要实现软件I2C读写MPU6050分为两个部分&#xff1a; 完成软件I2C协议时序基于I2C协议读写寄存器操控MPU6050 接线图…...

HarmonyOS鸿蒙系统上File文件常用操作

HarmonyOS鸿蒙系统上&#xff0c;file文件常用操作记录 1.创建文件 createFile(fileName: string, content: string): string {// 获取应用文件路径let context getContext(this) as common.UIAbilityContext;let filesDirPath context.filesDir / fileName;// 新建并打开…...

如何解决Java EasyExcel 导出报内存溢出

如何解决Java EasyExcel 导出报内存溢出 EasyExcel大数据量导出常见方法 1. 分批写入 EasyExcel支持分批写入数据&#xff0c;可以将数据分批加载到内存中&#xff0c;分批写入Excel文件&#xff0c;避免一次性将大量数据加载到内存中。 示例代码&#xff1a; String fileNa…...

[产品管理-91]:产品经理的企业运营的全局思维-1

目录 前言&#xff1a;企业架构图 产品经理的企业运营全局思维 1、用户 - 用户价值与体验&#xff1a;真正的需求&#xff0c;真正的问题&#xff0c;一切的原点 2、大势 - 顺应宏观大势&#xff1a;政策趋势、行业趋势、技术趋势 3、市场 - 知己知彼&#xff1a;市场调研…...

学习笔记——stm32看门狗

目录 一、WDG简介 二、IWDG框图 2.1独立看门狗结构 2.2键寄存器 2.3超时时间 三、WWDG框图 3.1窗口看门狗结构 3.2WWDG时序图 3.3最早、最晚时间 四、IWDG和WWDG对比 五、IWDG相关库函数和应用 5.1相关库函数 5.2应用 六、WWDG相关库函数和应用 6.1相关库函数 6…...

2411rust,cargo清理缓存

原文 Cargo最近在晚间通道上取得了一个不稳定的功能(从nightly-2023-11-17开始),它可自动清理Cargo主目录中的缓存内容. 总之,请求使用晚间通道的人启用此功能,并在Cargo问题跟踪器上报告问题.要启用它,请在你的一般在~/.cargo/config.toml或%USERPROFILE%\.cargo\config.tom…...

高级java每日一道面试题-2024年11月19日-基本篇-获取一个类Class对象的方式有哪些?

如果有遗漏,评论区告诉我进行补充 面试官: 获取一个类Class对象的方式有哪些? 我回答: 在 Java 中&#xff0c;获取一个类的 Class 对象有多种方式。这些方式各有优缺点&#xff0c;适用于不同的场景。以下是常见的几种方法及其详细解释&#xff1a; 1. 使用 new 关键字实…...

Vue 3与TypeScript集成指南:构建类型安全的前端应用

在Vue 3中使用TypeScript&#xff0c;可以让你的组件更加健壮和易于维护。以下是使用TypeScript与Vue 3结合的详细步骤和知识点&#xff1a; 1. 环境搭建 首先&#xff0c;确保你安装了Node.js&#xff08;推荐使用最新的LTS版本&#xff09;和npm或Yarn。然后&#xff0c;安…...

可视化建模与UML《活动图实验报告》

你当像鸟飞往你的山。 一、实验目的&#xff1a; 1、熟悉活动图的基本功能和使用方法。 2、掌握使用建模工具软件绘制协作图的方法 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; <1>绘制学生选课系统中添加课程(Add Course)用例的活动图…...

接雨水

接雨水 1、 题目描述2、解题思路 1、 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 2、解题思路 本题使用了双指针&#xff0c;根据下图可以得出&#xff0c;下标 i 处能接的雨水量由左边…...

i春秋-签到题

练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…...

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…...

考研倒计时30天丨和西电一起向前!再向前!

上岸后 就能来 西安电子科技大学 和学长学姐一起吃饭&#xff0c;XDU食堂都有你想要的一切 ①、海棠篇&#xff1a;海棠新生初入校园&#xff0c;还在犹豫吃什么&#xff1f;宿舍楼边的海棠餐厅物美价廉&#xff0c;满足你一日三餐的需求与期盼&#xff01; 俗话说&#xff1a…...

json数组写入文件每行一条数据

我们知道将json或json数组写入文件&#xff0c;一般是用JSON.stringify先将json或json数组转成字符串&#xff0c;再写入文件。JSON.stringify()的语法是这样的&#xff1a;JSON.stringify(value[, replacer[, space]]) JSON.stringify(value)调用则不带空格tab换行等分隔符&am…...

EasyExcel并行导出多个excel文件并压缩下载

EasyExcel并行导出多个excel文件并压缩下载 在SpringBoot应用中,采用同步方式导出Excel文件会导致服务器在生成文件期间阻塞,特别是在处理大量数据时,这种效率较低的方法会严重影响性能。为了解决这个问题,可以采用以下改进措施:首先将导出的数据进行拆分,然后利用Compl…...

hadoop3.x 新特性

hadoop3.x 新特性 FeaturesHadoop 2.xHadoop 3.xMinimum Required Java VersionJDK 6 and above.JDK 8 is the minimum runtime version of JAVA required to run Hadoop 3.x as many dependency library files have been used from JDK 8.Fault ToleranceFault Tolerance is …...

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…...

241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

Oracle 19C 安装RAC磁盘投票失败

ORACLE 19C 安装RAC第二个节点报错&#xff0c;没有找到足够的 voting 文件&#xff08;投票磁盘&#xff09; 1、磁盘投票失败分析 1.1、02节点报错日志 CRS-4123: Starting Oracle High Availability Services-managed resources CRS-2672: Attempting to start ora.mdnsd…...

vulfocus在线靶场:骑士cms_cve_2020_35339:latest 速通手册

目录 一、启动环境&#xff0c;访问页面&#xff0c;ip:端口号/index.php?madmin,进入后台管理页面&#xff0c;账号密码都是adminadmin 二、进入之后&#xff0c;根据图片所示&#xff0c;地址后追加一下代码&#xff0c;保存修改 ​三、新开标签页访问&#xff1a;①ip:端…...

【Linux内核深度解析】TCP协议栈之tcp_recvmsg

tcp_recvmsg 是 Linux 内核中用于处理 TCP 套接字接收数据的核心函数。它的主要任务是从接收队列中读取数据并将其复制到用户空间。 函数原型 int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_le…...

android-studio-4.2下载 、启动

下载 分享一个国内的android studio网站&#xff0c;可以下载SDK和一些Android studio开发工具 https://www.androiddevtools.cn/ 启动 JAVA_HOME/app/zulu17.48.15-ca-jdk17.0.10-linux_x64/ /app5/android-studio-home/android-studio-ide-201.6568795-linux-4.2C1/bin/s…...

Excel——宏教程(2)

Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量&#xff0c;这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I&#xff0c;并将I1的值…...

React Native 全栈开发实战班 - 性能与调试之打包与发布

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节将详细介绍 React Native 应用的打包与发布流程&#xff0c;包括 Android 和 iOS 平台的打包步骤、签名配置、发…...