UE学习日志#11GAS--ASC源码简要分析9 AbilitySystemGlobals分析2 初始化相关
1 static UAbilitySystemGlobals& Get()
保证了是单例,IGameplayAbilitiesModule继承了IModuleInterface
/** Gets the single instance of the globals object, will create it as necessary */static UAbilitySystemGlobals& Get(){return *IGameplayAbilitiesModule::Get().GetAbilitySystemGlobals();}
2 InitGlobalData相关
2.1 InitGlobalData
确保不会再次初始化
获取一些列初值
绑定到指定回调
void UAbilitySystemGlobals::InitGlobalData()
{// Make sure the user didn't try to initialize the system again (we call InitGlobalData automatically in UE5.3+).if (IsAbilitySystemGlobalsInitialized()){return;}bInitialized = true;LLM_SCOPE(TEXT("AbilitySystem"));GetGlobalCurveTable();GetGlobalAttributeMetaDataTable();InitAttributeDefaults();ReloadAttributeDefaults();GetGameplayCueManager();GetGameplayTagResponseTable();InitGlobalTags();PerformDeveloperSettingsUpgrade();InitTargetDataScriptStructCache();// Register for PreloadMap so cleanup can occur on map transitionsFCoreUObjectDelegates::PreLoadMapWithContext.AddUObject(this, &UAbilitySystemGlobals::HandlePreLoadMap);#if WITH_EDITOR// Register in editor for PreBeginPlay so cleanup can occur when we start a PIE sessionif (GIsEditor){FEditorDelegates::PreBeginPIE.AddUObject(this, &UAbilitySystemGlobals::OnPreBeginPIE);}
#endif
}
2.2 IsAbilitySystemGlobalsInitialized
朴实无华返回bInitialized
bool UAbilitySystemGlobals::IsAbilitySystemGlobalsInitialized() const
{return bInitialized;
}
2.3 GetGlobalCurveTable和GetGlobalAttributeMetaDataTable
从UGameplayAbilitiesDeveloperSettings中获取GlobalCurveTableName然后TryLoad
UCurveTable * UAbilitySystemGlobals::GetGlobalCurveTable()
{if (!GlobalCurveTable){const UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetDefault<UGameplayAbilitiesDeveloperSettings>();if (DeveloperSettings->GlobalCurveTableName.IsValid()){GlobalCurveTable = Cast<UCurveTable>(DeveloperSettings->GlobalCurveTableName.TryLoad());}}return GlobalCurveTable;
}
GetGlobalAttributeMetaDataTable同理
UDataTable * UAbilitySystemGlobals::GetGlobalAttributeMetaDataTable()
{ if (!GlobalAttributeMetaDataTable){const UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetDefault<UGameplayAbilitiesDeveloperSettings>();if (DeveloperSettings->GlobalAttributeMetaDataTableName.IsValid()){GlobalAttributeMetaDataTable = Cast<UDataTable>(DeveloperSettings->GlobalAttributeMetaDataTableName.TryLoad());}}return GlobalAttributeMetaDataTable;
}
2.4 InitAttributeDefaults/GetGlobalAttributeSetDefaultsTablePaths
2.4.1 InitAttributeDefaults
先获取AttributeSetDefaultsTable的路径软引用
然后依次遍历路径,尝试Load,TryLoad是同步加载,可能会阻塞,常用于小资源加载
void UAbilitySystemGlobals::InitAttributeDefaults()
{TArray<FSoftObjectPath> AttribSetDefaultsTables = GetGlobalAttributeSetDefaultsTablePaths();for (const FSoftObjectPath& AttribSetDefaultsTablePath : AttribSetDefaultsTables){if (AttribSetDefaultsTablePath.IsValid()){UCurveTable* AttribTable = Cast<UCurveTable>(AttribSetDefaultsTablePath.TryLoad());if (ensureMsgf(AttribTable, TEXT("Could not load Global AttributeSet Defaults Table: %s"), *AttribSetDefaultsTablePath.ToString())){GlobalAttributeDefaultsTables.AddUnique(AttribTable);}}}
}
2.4.2 GetGlobalAttributeSetDefaultsTablePaths
PRAGMA_DISABLE/ENABLE_DEPRECATION_WARNINGS关闭和开启警告,中间的部分弃用,单个的全局tablename,保留以兼容
之后还是通过UGameplayAbilitiesDeveloperSettings获取
TArray<FSoftObjectPath> UAbilitySystemGlobals::GetGlobalAttributeSetDefaultsTablePaths() const
{TArray<FSoftObjectPath> AttribSetDefaultsTables;PRAGMA_DISABLE_DEPRECATION_WARNINGS// Handle deprecated, single global table nameif (GlobalAttributeSetDefaultsTableName.IsValid()){AttribSetDefaultsTables.Add(GlobalAttributeSetDefaultsTableName);}PRAGMA_ENABLE_DEPRECATION_WARNINGSconst UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetDefault<UGameplayAbilitiesDeveloperSettings>();AttribSetDefaultsTables.Append(DeveloperSettings->GlobalAttributeSetDefaultsTableNames);return AttribSetDefaultsTables;
}
2.5 ReloadAttributeDefaults
重新加载GlobalAttributeDefaultsTables
如果在编辑器模式下,注册重新加载的回调
一个布尔变量确保只注册过一次
void UAbilitySystemGlobals::ReloadAttributeDefaults()
{if (!GlobalAttributeDefaultsTables.IsEmpty()){AllocAttributeSetInitter();GetAttributeSetInitter()->PreloadAttributeSetData(GlobalAttributeDefaultsTables);// Subscribe for reimports if in the editor
#if WITH_EDITORif (GIsEditor && !RegisteredReimportCallback){GEditor->GetEditorSubsystem<UImportSubsystem>()->OnAssetReimport.AddUObject(this, &UAbilitySystemGlobals::OnTableReimported);RegisteredReimportCallback = true;}
#endif}
}
2.6 GetGameplayCueManager
通过DeveloperSettings的Name或者Class来创建GlobalGameplayCueManager
回调OnCreated
判断是否要在Start加载ObjectLibraries
UGameplayCueManager* UAbilitySystemGlobals::GetGameplayCueManager()
{if (GlobalGameplayCueManager == nullptr){const UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetDefault<UGameplayAbilitiesDeveloperSettings>();// Loads mud specific gameplaycue manager object if specifiedif (GlobalGameplayCueManager == nullptr && DeveloperSettings->GlobalGameplayCueManagerName.IsValid()){GlobalGameplayCueManager = LoadObject<UGameplayCueManager>(nullptr, *DeveloperSettings->GlobalGameplayCueManagerName.ToString(), nullptr, LOAD_None, nullptr);if (GlobalGameplayCueManager == nullptr){ABILITY_LOG(Error, TEXT("Unable to Load GameplayCueManager %s"), *DeveloperSettings->GlobalGameplayCueManagerName.ToString() );}}// Load specific gameplaycue manager class if specifiedif ( GlobalGameplayCueManager == nullptr && DeveloperSettings->GlobalGameplayCueManagerClass.IsValid() ){UClass* GCMClass = LoadClass<UObject>(nullptr, *DeveloperSettings->GlobalGameplayCueManagerClass.ToString(), nullptr, LOAD_None, nullptr);if (GCMClass){GlobalGameplayCueManager = NewObject<UGameplayCueManager>(this, GCMClass, NAME_None);}}if ( GlobalGameplayCueManager == nullptr){// Fallback to base native classGlobalGameplayCueManager = NewObject<UGameplayCueManager>(this, UGameplayCueManager::StaticClass(), NAME_None);}GlobalGameplayCueManager->OnCreated();if (GetGameplayCueNotifyPaths().IsEmpty()){AddGameplayCueNotifyPath(TEXT("/Game"));ABILITY_LOG(Warning, TEXT("No GameplayCueNotifyPaths were specified in DefaultGame.ini under [/Script/GameplayAbilities.AbilitySystemGlobals]. Falling back to using all of /Game/. This may be slow on large projects. Consider specifying which paths are to be searched."));}if (GlobalGameplayCueManager->ShouldAsyncLoadObjectLibrariesAtStart()){StartAsyncLoadingObjectLibraries();}}check(GlobalGameplayCueManager);return GlobalGameplayCueManager;
}
2.7 GetGameplayTagResponseTable
还是从DeveloperSettings里获取
UGameplayTagReponseTable* UAbilitySystemGlobals::GetGameplayTagResponseTable()
{const UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetDefault<UGameplayAbilitiesDeveloperSettings>();if (GameplayTagResponseTable == nullptr && DeveloperSettings->GameplayTagResponseTableName.IsValid()){GameplayTagResponseTable = LoadObject<UGameplayTagReponseTable>(nullptr, *DeveloperSettings->GameplayTagResponseTableName.ToString(), nullptr, LOAD_None, nullptr);}return GameplayTagResponseTable;
}
2.8 InitGlobalTags
标记激活失败的原因的标签
void UAbilitySystemGlobals::InitGlobalTags()
{auto TagFromDeprecatedName = [](FGameplayTag& Tag, FName DeprecatedName){if (!Tag.IsValid() && !DeprecatedName.IsNone()){Tag = FGameplayTag::RequestGameplayTag(DeprecatedName);return true;}return false;};PRAGMA_DISABLE_DEPRECATION_WARNINGSTagFromDeprecatedName(ActivateFailIsDeadTag, ActivateFailIsDeadName);TagFromDeprecatedName(ActivateFailCooldownTag, ActivateFailCooldownName);TagFromDeprecatedName(ActivateFailCostTag, ActivateFailCostName);TagFromDeprecatedName(ActivateFailTagsBlockedTag, ActivateFailTagsBlockedName);TagFromDeprecatedName(ActivateFailTagsMissingTag, ActivateFailTagsMissingName);TagFromDeprecatedName(ActivateFailNetworkingTag, ActivateFailNetworkingName);
PRAGMA_ENABLE_DEPRECATION_WARNINGS
}
2.9 PerformDeveloperSettingsUpgrade
先定义一个lambda表达式用于同步标签
检查是否需要更新
若需要更新就把Settings里的标签同步到Globals里
void UAbilitySystemGlobals::PerformDeveloperSettingsUpgrade()
{auto SyncTag = [](FGameplayTag& DestinationTag, const FGameplayTag& OurTag){if (OurTag.IsValid() && DestinationTag != OurTag){DestinationTag = OurTag;return true;}return false;};UGameplayAbilitiesDeveloperSettings* DeveloperSettings = GetMutableDefault<UGameplayAbilitiesDeveloperSettings>();bool bUpgraded = false;bUpgraded |= SyncTag(DeveloperSettings->ActivateFailCooldownTag, ActivateFailCooldownTag);bUpgraded |= SyncTag(DeveloperSettings->ActivateFailCostTag, ActivateFailCostTag);bUpgraded |= SyncTag(DeveloperSettings->ActivateFailNetworkingTag, ActivateFailNetworkingTag);bUpgraded |= SyncTag(DeveloperSettings->ActivateFailTagsBlockedTag, ActivateFailTagsBlockedTag);bUpgraded |= SyncTag(DeveloperSettings->ActivateFailTagsMissingTag, ActivateFailTagsMissingTag);if (bUpgraded){UE_LOG(LogAbilitySystem, Warning, TEXT("AbilitySystemGlobals' Tags did not agree with GameplayAbilitiesDeveloperSettings. Updating GameplayAbilitiesDeveloperSettings Config to use Tags from AbilitySystemGlobals"));bool bSuccess = DeveloperSettings->TryUpdateDefaultConfigFile();if (!bSuccess){UE_LOG(LogAbilitySystem, Warning, TEXT("AbilitySystemGlobals config file (DefaultGame.ini) couldn't be saved. Make sure the file is writable to update it."));}}// Now that the upgrade is done, copy any settings set in the DeveloperSettings back to here (so calls to UAbilitySystemGlobals::Get().SomeTag work)SyncTag(ActivateFailCooldownTag, DeveloperSettings->ActivateFailCooldownTag);SyncTag(ActivateFailCostTag, DeveloperSettings->ActivateFailCostTag);SyncTag(ActivateFailNetworkingTag, DeveloperSettings->ActivateFailNetworkingTag);SyncTag(ActivateFailTagsBlockedTag, DeveloperSettings->ActivateFailTagsBlockedTag);SyncTag(ActivateFailTagsMissingTag, DeveloperSettings->ActivateFailTagsMissingTag);
}
2.10 InitTargetDataScriptStructCache
这个暂时还不太清楚作用,暂放一下
void UAbilitySystemGlobals::InitTargetDataScriptStructCache()
{TargetDataStructCache.InitForType(FGameplayAbilityTargetData::StaticStruct());EffectContextStructCache.InitForType(FGameplayEffectContext::StaticStruct());
}
相关文章:
UE学习日志#11GAS--ASC源码简要分析9 AbilitySystemGlobals分析2 初始化相关
1 static UAbilitySystemGlobals& Get() 保证了是单例,IGameplayAbilitiesModule继承了IModuleInterface /** Gets the single instance of the globals object, will create it as necessary */static UAbilitySystemGlobals& Get(){return *IGameplayAbi…...
SQL在DBA手里-改写篇
背景 最近运营需要做月报汇总交易情况,之前一直是他们手工出的数据,他们想做成月初自动发送邮件,从而减轻他们的工作量。于是他们提供SQL我们在邮件服务器配置做定时发送任务。 表介绍(表及字段已做脱敏处理) trans…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)
7.3. 查询计划相关操作符 38)Flow Distinct:该操作符扫描其输入并对其去重。该操作符从其输入得到每行数据时即将其返回(除非其为重复数据行,此时,该数据行会被抛弃),而Distinct操作符在产生任何输出前将消费所有输入。该操作符为逻辑操作符。该操作符具体如图7.2-38中…...
Autogen_core:Agent and Agent Runtime
目录 1. 代码2. 代码解释第一部分:定义消息类型和代理第二部分:定义助手代理第三部分:注册和运行代理第四部分:发送和停止消息处理总结 3. 类似的例子 1. 代码 from dataclasses import dataclassfrom autogen_core import Agent…...
vue(33) : 安装组件出错解决
1. request to https://registry.npm.taobao.org/semver/download/semver-6.1.1.tgz?cache0&other_urlshttps%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.1.1.tgz failed, reason: certificate has expired 这个错误提示表明你在尝试从https://reg…...
论文阅读(五):乳腺癌中的高斯图模型和扩展网络推理
1.论文链接:Network Inference in Breast Cancer with Gaussian Graphical Models and Extensions 摘要: 具有高相关性的聚类基因将具有接近表达谱的基因分组,确定共表达基因的聚类。然而,这种相关性并没有提供任何关于基因间信息…...
定时器按键tim_key模版
低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内,会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…...
Effective Objective-C 2.0 读书笔记—— objc_msgSend
Effective Objective-C 2.0 读书笔记—— objc_msgSend 文章目录 Effective Objective-C 2.0 读书笔记—— objc_msgSend引入——静态绑定和动态绑定OC之中动态绑定的实现方法签名方法列表 其他方法objc_msgSend_stretobjc_msgSend_fpretobjc_msgSendSuper 尾调用优化总结参考文…...
机器学习 vs 深度学习
目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…...
Vue中的动态组件是什么?如何动态切换组件?
什么是动态组件? 动态组件是 Vue.js 中的一项强大功能,它允许开发者根据程序的状态或用户的操作,动态地切换组件。动态组件的优势在于,开发者可以根据具体需求灵活地渲染不同的组件,从而提高应用的通用性和可维护性。…...
Spring IoC DI
目录 一. IoC & DI 入门 1. 重谈Spring 2. 容器 3. IoC ① 传统程序开发 ② IoC 程序开发 ③ IoC 的优势 4. DI 3. IoC & DI 使用 二. IoC & DI 详解 1. Bean的存储 2. Bean的重命名 3. 扫描路径 三. DI 详解 1. 属性注入 2. 构造方法注入 3. Se…...
【Linux】线程、线程控制、地址空间布局
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、Linux线程1.1 线程的优缺点1.2 线程异常和用途1.3 线程等待1.3 线程终止1.4 线程分离1.5 线程ID和地址空间布局1.6 线程栈 1、…...
【记录】日常|从零散记录到博客之星Top300的成长之路
文章目录 shandianchengzi 2024 年度盘点概述写作风格简介2024年的创作内容总结 shandianchengzi 2024 年度盘点 概述 2024年及2025年至今我创作了786即84篇文章,加上这篇就是85篇。 很荣幸这次居然能够入选博客之星Top300,这个排名在我之前的所有年份…...
网盘资源查找工具---AI功能
01 软件介绍 这是一款融入了ai技术的网盘搜索神器,可以让你更快,更精准的找到自己需要的文件,不管你是找影视,音乐,还是找软件或者学习资料都可以,欢迎前来使用。 02 功能展示 该软件非常简洁ÿ…...
LWJGL轻量级Java游戏库
LWJGL - Lightweight Java Game Library 基本介绍 LWJGL是一个Java库,它支持跨平台访问流行的本地api,这些api在图形(OpenGL, Vulkan)、音频(OpenAL)和并行计算(OpenCL)应用程序的…...
AI智能日志分析系统
文章目录 1.combinations-intelligent-analysis-starter1.目录结构2.pom.xml3.自动配置1.IntelligentAnalysisAutoConfiguration.java2.spring.factories 2.combinations-intelligent-analysis-starter-demo1.目录结构2.pom.xml3.application.yml4.IntelligentAnalysisApplicat…...
详解三种常用标准化:Batch Norm、Layer Norm和RMSNorm
在深度学习中,标准化技术是提升模型训练速度、稳定性和性能的重要手段。本文将详细介绍三种常用的标准化方法:Batch Normalization(批量标准化)、Layer Normalization(层标准化)和 RMS Normalization&#…...
数据压缩算法-差分编码(Delta Encoding)
Delta Encoding(差分编码)是一种数据压缩技术,其核心思想是存储数据之间的差异(delta),而不是原始数据本身。这种方法特别适用于数据序列中相邻元素之间变化较小的情况,可以显著减少存储空间或传…...
Nginx中部署多个前端项目
1,准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2,nginx里面的html文件夹中新建,tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3,编辑配置ngi…...
Level DB --- TableBuilder
TableBuilder是Level DB里面重要的类和模块,它描述了数据如何序列化到文件中,以及数据里面的格式逻辑。它里面包含了之前介绍的多个模块和类。 data block、filter block和index block block格式,之前已经介绍过Level DB --- BlockBuilder-…...
JVM堆空间
一、堆空间的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。堆可以处于物理上不连续的内存空间中ÿ…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.13 降维打击:扁平化操作的六种武器
1.13 降维打击:扁平化操作的六种武器 目录 #mermaid-svg-bbLxDryjxBbXe3tu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bbLxDryjxBbXe3tu .error-icon{fill:#552222;}#mermaid-svg-bbLxDryjxBbXe3tu…...
Doris Schema Change 常见问题分析
1. 什么是 Schema Change Schema Change 是在数据库中修改表结构的一种操作,例如添加列、删除列、更改列类型等。 ⚠️Schema Change 限制⚠️ 一张表在同一时间只能有一个 Schema Change 作业在运行。分区列和分桶列不能修改。如果聚合表中有 REPLACE 方式聚合的…...
数据结构之堆排序
文章目录 堆排序版本一图文理解 版本二向下调整建堆向上调整建堆 排升/降序升序 堆排序 版本一 基于已有数组建堆取堆顶元素并删除堆顶元素重新建大根堆,完成排序版本。 图文理解 版本二 前提:必须提供有现成的数据结构堆 数组建堆,首尾…...
实现桌面动态壁纸(三)—— 视频播放的策略
关于动态壁纸这边,其实已经不需要再谈什么东西了,现有的各种文章都在介绍相关的技术。可以说现如今要去制作一个桌面动态壁纸应该不是什么难事。我考虑了很久,决定还是开一篇单独谈谈。可能我说的也不全部正确,您有什么建议随时可…...
C语言程序设计十大排序—希尔排序
文章目录 1.概念✅2.希尔排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展…...
2023年版本IDEA复制项目并修改端口号和运行内存
2023年版本IDEA复制项目并修改端口号和运行内存 1 在idea中打开server面板,在server面板中选择需要复制的项目右键,点击弹出来的”复制配置…(Edit Configuration…)“。如果idea上没有server面板或者有server面板但没有springbo…...
Ubuntu 安装 QGIS LTR 3.34
QGIS官方提供了安装指南:https://qgis.org/resources/installation-guide/#linux。大多数linux发行版将QGIS拆分为几个包:qgis、qgis-python、qgis-grass、qgis-plugin-grass、qgis-server,有的包最初安装时被跳过,可以在需要使用…...
win32汇编环境,对话框程序中使用进度条控件
;运行效果 ;win32汇编环境,对话框程序中使用进度条控件 ;进度条控件主要涉及的是长度单位,每步步长,推进的时间。 ;比如你的长度是1000,步长是100,每秒走1次,则10秒走完全程 ;比如你的长度是1000,步长是10,每秒走1次,则100秒走完全程,但每格格子的长度与上面一样 ;以下…...
从ChatGPT热潮看智算崛起
2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…...
APISIX-API服务网关
一、简介 apisix是一款云原生微服务API网关,可以为API提供终极性能、安全性、开源和可扩展的平台。apisix基于Nginx和etcd实现,与传统API网关相比,apisix具有动态路由和插件热加载,特别适合微服务系统下的API管理。 Apisix 的诞生…...
NR_shell运行流程简析
nr_shell 是一套开源 shell 框架,基于框架可创建终端交互功能。 为了记录终端输入指令,以及进行解析处理,nr_shell 提供了一套 cmd 结构体,具体如下:typedef struct static_cmd_function_struct {char cmd[NR_SHELL_CM…...
leetcode_链表 876.链表的中间节点
876.链表的中间节点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。思路:快慢指针,创建两个指针fast和slow,fast指针每次移动两步,slow指针每次移动…...
idea实用设置
一.View 1.配置工具包方便按 二.File->Settings 点开设置然后进行后面的配置 1.这个看个人习惯 2.更新 3.更改菜单字体大小 4.鼠标控制字体大小 5.文件默认字体大小 6. 代码的智能提示功能 7.自动导包 8.编码 9.取消双击shift搜索...
ui-automator定位官网文档下载及使用
一、ui-automator定位官网文档简介及下载 AndroidUiAutomator:移动端特有的定位方式,uiautomator是java实现的,定位类型必须写成java类型 官方地址:https://developer.android.com/training/testing/ui-automator.html#ui-autom…...
Java数据结构方面的面试试题以及答案解析
Java数据结构是在计算机中存储和组织数据的方式,用于高效地处理和管理数据。 以下是一些常见的Java数据结构: 数组(Array):一种线性数据结构,允许通过索引快速访问元素。它存储固定大小的相同类型的元素集…...
微信小程序-点餐(美食屋)02开发实践
目录 概要 整体架构流程 (一)用户注册与登录 (二)菜品浏览与点餐 (三)订单管理 (四)后台管理 部分代码展示 1.index.wxml 2.list.wxml 3.checkout.wxml 4.detail.wxml 小结优点 概要…...
Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)
redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…...
DroneXtract:一款针对无人机的网络安全数字取证工具
关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件,该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…...
uniapp使用uni.navigateBack返回页面时携带参数到上个页面
我们平时开发中也经常遇到这种场景,跳转一个页面会进行一些操作,操作完成后再返回上个页面同时要携带着一些参数 其实也很简单,也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈,很简单: <t…...
2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 (1)研究背景 &#…...
python远程获取数据库中的相关数据并存储至json文件
1. conn中的5个变量的含义: ① Driver:数据库驱动程序,我使用的是SQL Server数据库。 ② Server:数据库所在的服务器地址。 ③ Database:要连接的数据库的名称。 ④ UID:登录 SQL Server 数据库的用户名…...
DeepSeek-R1解读:纯强化学习,模型推理能力提升的新范式?
DeepSeek-R1解读:纯强化学习,模型推理能力提升的新范式? 1. Impressive Points2. 纯强化学习,LLM推理能力提升新范式?2.1 DeepSeek-R1-Zero2.2 DeepSeek-R1 3. 端侧模型能力提升:蒸馏>强化学习 1. Impre…...
系统安全及应用
一:账号安全控制 1.1 系统账号清理 1.1.1 将非登陆用户的Shell 设置为 /sbin/nologin (设置为这个解释器,禁止用户登陆) [rootlocalhost ~]# usermod -s /sbin/nologin zhangsan #将用户zhangsan 的登录解释器 设置为 /sbin/n…...
ubuntu解决普通用户无法进入root
项目场景: 在RK3566上移植Ubuntu20.04之后普通用户无法进入管理员模式 问题描述 在普通用户使用sudo su试图进入管理员模式的时候报错 解决方案: 1.使用 cat /etc/passwd 查看所有用户.最后一行是 若无用户,则使用 sudo useradd -r -m -s /…...
Mac m1,m2,m3芯片使用nvm安装node14报错
使用nvm安装了node 12/16/18都没有问题,到14就报错了。第一次看到这个报错有点懵,查询资料发现是Mac芯片的问题。 Issue上提供了两个方案: 1、为了在arm64的Mac上安装node 14,需要使用Rosseta,可以通过以下命令安装 …...
IDEA工具下载、配置和Tomcat配置
1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载:https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址:https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…...
实战网络安全:渗透测试与防御指南
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在数字化时代,网络安全已成为企业和个人不可忽视的重要课题。网络攻击的复杂性与日俱增,从数据泄露…...
Vue 3 中的 toRef 与 toRefs:使用与案例解析
在 Vue 3 的响应式系统中,toRef 和 toRefs 是两个非常实用的工具函数。它们主要用于将响应式对象的属性转换为单独的 ref,以便在模板或逻辑中更方便地使用。本文将详细介绍 toRef 和 toRefs 的用法,并通过一个老师信息的案例来演示它们的实际…...
如何让Dev-C++支持C++11及以上标准
目录 问题描述解决方案步骤1:打开编译选项 问题描述 在Dev-C中使用C11/17/20新特性(如pop_back()等)时,可能出现编译错误: #include <iostream> #include<string> using namespace std; int main() {str…...