虚幻引擎5 Gameplay框架(五)

Gameplay重要类及重要功能使用方法(四)

DeveloperSetting

  • DeveloperSetting是在虚幻引擎中是一个基类,主要用于创建和管理开发者设置相关的类。这类设置允许开发者自定义或调整项目中的各种配置选项,而无需直接修改代码或构建设置。这些设置可以是关于渲染、物理、输入、网络等多方面的,为游戏或应用的开发过程提供了高度的灵活性和可配置性。继承自UObject

  • 创建一个DeveloperSetting类,这种一般在企业级开发用的比较多,用于拓展

  • 写一个功能,用来理解,使用这个拓展类,让游戏设置选择是否保存游戏血量数据并写入到配置文件中
    在这里插入图片描述

  • 控制是否保存游戏数据的逻辑,默认为真
    在这里插入图片描述

  • 是否需要保存游戏数据逻辑
    在这里插入图片描述

  • 是否读取存档数据逻辑
    在这里插入图片描述

  • 运行结果,此时项目设置里面会出现一个GPPSetting的设置,默认保存游戏为真,此时就会默认保存游戏,读取游戏存档,如果去掉勾就不会默认保存与读取了
    在这里插入图片描述
    在这里插入图片描述

  • 通过引擎对配置文件做出实时改变只需要添加一个宏标记类说明符defaultconfig,能实时在配置文件ini中做出改变
    在这里插入图片描述

  • 运行结果
    在这里插入图片描述
    在这里插入图片描述

GameSession简介与重要方法的执行流程

GameSession简单介绍

  • 开发一个多人游戏中,客户端需要一个Session机制链接到服务器,在这个过程中以便服务器验证客户端的合法条件
  • GameSession可以看做是GamePlay框架与OnlineSession的接口
  • 使用GameSession过程当中主要依赖的方法就是虚幻引擎提供的接口,虚幻引擎中提供不同网络平台的接口
    在这里插入图片描述

重要方法的执行流程

  • 创建一个GameSession类,查看其中重要方法的执行顺序
    在这里插入图片描述
  • 重写这几个方法查看执行顺序
    在这里插入图片描述
    在这里插入图片描述
  • 注册GameSessionGameMode里面
    在这里插入图片描述
  • 使用服务器批处理脚本查看结果可以发现:RegisterServer早于BeginPlay也早于GameMode中的BenginPlay,然后这里面没有执行RegisterPlayer只注册了自己的服务器到游戏会话当中
    在这里插入图片描述
  • 然后在使用客户端批处理脚本查看结果:先执行RegisterPlayer了,服务器那边只执行注册服务器的,客户端这边执行注册角色的
    在这里插入图片描述
  • 实验结果说明:网络链接游戏会话创建就得创建两个,一个给客户端创建一个游戏会话,一个给服务器创建一个游戏会话,把它们共同注册到会话当中,这样客户端才能找到服务器,服务器也可以接受客户端链接。游戏会话就相当于是中间枢纽

为游戏大厅创建的框架类

  • 新建一个空白关卡做为游戏大厅
    在这里插入图片描述
  • 然后创建会话大厅的GameMode、Character、GameSession、HUD、PlayerController类,注册到GameMode里面
    在这里插入图片描述
    在这里插入图片描述

创建会话逻辑

  • 首先使用OnlineSubsystem是作为插件使用的,所以得在编译模块加入两个模块
    在这里插入图片描述
  • 在服务器GameSession类中添加两个函数与一个委托
    在这里插入图片描述
  • 编写逻辑
bool AGPPGameSession::CreateSession()
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//拿接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){//进行一些必要设置FOnlineSessionSettings Settings;Settings.NumPublicConnections = 0;Settings.bShouldAdvertise = true;Settings.bAllowJoinInProgress = true;Settings.bIsDedicated = true;Settings.bIsLANMatch = true;Settings.bUsesPresence = false;Settings.bAllowInvites = true;Settings.bAllowJoinViaPresence = true;//设置游戏模式Settings.Set(SETTING_GAMEMODE, FString("StandMatch"), EOnlineDataAdvertisementType::ViaOnlineService);//设置游戏地图Settings.Set(SETTING_MAPNAME, GetWorld()->GetMapName(), EOnlineDataAdvertisementType::ViaOnlineService);//绑定委托句柄,回调函数OnCreateSessionCompleteDelegateHandle = SessionPtr->AddOnCreateSessionCompleteDelegate_Handle(FOnCreateSessionCompleteDelegate::CreateUObject(this, &AGPPGameSession::OnCreateSessionComplete));//创建GameSessionbool Result = SessionPtr->CreateSession(0, FName("NAME_GameSession2"), Settings);return Result;}}return false;
}void AGPPGameSession::OnCreateSessionComplete(FName IsSessionName, bool bWasSuccessful)
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//拿接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr){//拿到GameSession状态EOnlineSessionState::Type GameSessionState = SessionPtr->GetSessionState(IsSessionName);//清空句柄SessionPtr->ClearOnCreateSessionCompleteDelegate_Handle(OnCreateSessionCompleteDelegateHandle);}}
}
  • 这段代码解释
    请添加图片描述

  • FOnlineSessionSettings源码
    在这里插入图片描述

  • 添加头文件
    在这里插入图片描述

#include "Online.h"
#include "OnlineSubsystem.h"
#include "OnlineSubsystemUtils.h"
#include "OnlineSessionSettings.h"
#include "Online/OnlineSessionNames.h"
#include "OnlineSubsystemTypes.h"
#include "Interfaces/OnlineSessionDelegates.h"
  • 写完逻辑后,如果报错编译器反应不过来,可以到项目中重新编译建立项目
    在这里插入图片描述
  • 最后在RegisterServer函数中注册服务器
void AGPPGameSession::RegisterServer()
{Super::RegisterServer();UE_LOG(MyLog_GPPGameSession, Log, TEXT("----RegisterServer---- NetMode:%s"), *UBFL_LogManager::GetNetModeStr(this));//创建服务器CreateSession();
}

客户端_FindSession和JoinSession逻辑

  • 实现查找服务器与加入服务器,将之前直接在控制器中直接加入的服务器的代码逻辑注释掉
    在这里插入图片描述

HallPlayerController类中

  • 我们在HallPlayerController函数中创建三个函数,一个用来加入房间,查找房间与测试函数
    在这里插入图片描述

  • HallPlayerController::JoinSession的函数逻辑,GameSession->JoinSession(ID, SessionIndexInSerarchResults)这个函数逻辑还没有实现,放到后面去实现。先不管
    在这里插入图片描述

  • AHallPlayerController::FindSession的函数逻辑,GameSeesion->FindSession()这个函数逻辑还没有实现,放到后面去实现。先不管
    在这里插入图片描述

  • 测试函数,运行结果会自动进入第一个房间
    在这里插入图片描述

HallPlayerController.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "HallPlayerController.generated.h"/*** */
UCLASS()
class GAMEPLAYCODEPARSING_API AHallPlayerController : public APlayerController
{GENERATED_BODY()public://加入房间UFUNCTION(BlueprintCallable, Category = "PlayerNetSeesion")bool JoinSession(int32 SessionIndexInSerarchResults);//查找房间UFUNCTION(BlueprintCallable,Category = "PlayerNetSession")void FindSession();//测试函数UFUNCTION(BlueprintCallable,Category="PlayerNetSession")void FindSessionComplete();
};
HallPlayerController.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "HallPlayerController.h"
#include "HallGameSession.h"
#include "GameFramework/GameModeBase.h"bool AHallPlayerController::JoinSession(int32 SessionIndexInSerarchResults)
{if (GetNetMode() == NM_Standalone)//是否是单机状态{if (UWorld* const World = GetWorld())//拿取当前世界{if (AGameModeBase* const GM = World->GetAuthGameMode())//拿取当前世界的GameMode{if (AHallGameSession* GameSession = Cast<AHallGameSession>(GM->GameSession))//有了GameMode就可以拿到Session了{if (ULocalPlayer* LocalPlayer = GetLocalPlayer())//有了Session就可以拿到本地的玩家了{//通过本地玩家拿取玩家在网络中的IDconst TSharedPtr<const FUniqueNetId> ID = LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId();//ID与要加入的房间号传入到我们在GameSession中自定义函数中bool Result = GameSession->JoinSession(ID, SessionIndexInSerarchResults);return Result;}}}}}return false;
}void AHallPlayerController::FindSession()
{if (GetNetMode() == NM_Standalone)//是否是单机状态{if (UWorld* const World = GetWorld())//拿取当前世界{if (AGameModeBase* const GM = World->GetAuthGameMode())//拿到Session了{if (AHallGameSession* GameSeesion = Cast<AHallGameSession>(GM->GameSession))//拿到本地的玩家了{GameSeesion->FindSession();//调用我们在GameSession中的查找自定义房间函数}}}}
}void AHallPlayerController::FindSessionComplete()
{JoinSession(0);
}

HallGameSession类中

  • 然后在HallGameSession类中去实现查找房间发现房间的逻辑
  • 新建几个函数与委托
    在这里插入图片描述
  • AHallGameSession::FindSession函数逻辑
    在这里插入图片描述
  • AHallGameSession::OnFindSessionComplete函数逻辑
    在这里插入图片描述
  • AHallGameSession::JoinSession函数逻辑
    在这里插入图片描述
  • AHallGameSession::OnJoinSessionComplete函数逻辑
    在这里插入图片描述
  • BeginPlay中的逻辑,在BeginPlay中去查找房间,这样就会自动化运行上面的所有逻辑了
    在这里插入图片描述
HallGameSession.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once#include "CoreMinimal.h"
#include "GameFramework/GameSession.h"
#include "OnlineSessionSettings.h"
#include "Interfaces/OnlineSessionInterface.h"
#include "HallGameSession.generated.h"/*** */
UCLASS()
class GAMEPLAYCODEPARSING_API AHallGameSession : public AGameSession
{GENERATED_BODY()
public:virtual void BeginPlay() override;//查找房间void FindSession();//加入房间bool JoinSession(TSharedPtr<const FUniqueNetId> UserId, int32 SessionIndexInSerarchResults);//回调函数void OnJoinSessionComplete(FName InSessionName, EOnJoinSessionCompleteResult::Type Result);void OnFindSessionComplete(bool bWasSuccessful);private://委托FDelegateHandle OnFindSessionCompleteDelegateHandle;FDelegateHandle OnJoinSessionCompleteDelegateHandle;//缓存查找结果TSharedPtr<FOnlineSessionSearch> SearchSetting;
};
HallGameSession.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "HallGameSession.h"
#include "OnlineSubsystem.h"
#include "Online.h"
#include "OnlineSubsystemUtils.h"
#include "OnlineSessionSettings.h"
#include "Online/OnlineSessionNames.h"
#include "OnlineSubsystemTypes.h"
#include "Interfaces/OnlineSessionDelegates.h"
#include "../GPProjectGameInstance.h"
#include "HallPlayerController.h"
#include "../Utils/BFL_LogManager.h"DEFINE_LOG_CATEGORY_STATIC(MyLog_HallGameSession, Log, All)void AHallGameSession::BeginPlay()
{Super::BeginPlay();if (GetNetMode() == NM_Standalone){FindSession();}
}void AHallGameSession::FindSession()
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//拿接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){SearchSetting = SearchSetting = MakeShareable(new FOnlineSessionSearch());SearchSetting->TimeoutInSeconds = 30.;//等待搜索结果的时间SearchSetting->bIsLanQuery = true;//查询用于局域网匹配//回调  在完成对在线会话的搜索时触发OnFindSessionCompleteDelegateHandle = SessionPtr->AddOnFindSessionsCompleteDelegate_Handle(FOnFindSessionsCompleteDelegate::CreateUObject(this, &AHallGameSession::OnFindSessionComplete));//拿取GameInstanceif (UGPProjectGameInstance* GI = Cast<UGPProjectGameInstance>(GetWorld()->GetGameInstance())){if (ULocalPlayer* LocalPlayer = GI->GetFirstGamePlayer())//拿取本地玩家{//通过本地玩家拿取在服务器中的IDconst TSharedPtr<const FUniqueNetId> UserID = LocalPlayer->GetPreferredUniqueNetId().GetUniqueNetId();TSharedRef<FOnlineSessionSearch> SearchSettingRef = SearchSetting.ToSharedRef();//查找房间SessionPtr->FindSessions(*UserID, SearchSettingRef);}}}}
}void AHallGameSession::OnFindSessionComplete(bool bWasSuccessful)
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//拿接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){//清空句柄SessionPtr->ClearOnFindSessionsCompleteDelegate_Handle(OnFindSessionCompleteDelegateHandle);}}if (UGPProjectGameInstance* GI = Cast<UGPProjectGameInstance>(GetWorld()->GetGameInstance())){if (AHallPlayerController* PC = Cast<AHallPlayerController>(GI->GetFirstLocalPlayerController())){UE_LOG(MyLog_HallGameSession, Log, TEXT("OnFindSessionComplete-------bWasSuccessful:%d"), bWasSuccessful);//调用测试函数PC->FindSessionComplete();}}
}bool AHallGameSession::JoinSession(TSharedPtr<const FUniqueNetId> UserId, int32 SessionIndexInSerarchResults)
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){	//获取接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){//回调  在联机会话的加入过程完成时触发的委托OnJoinSessionCompleteDelegateHandle = SessionPtr->AddOnJoinSessionCompleteDelegate_Handle(FOnJoinSessionCompleteDelegate::CreateUObject(this, &AHallGameSession::OnJoinSessionComplete));//发现的房间int32 FindNum = SearchSetting->SearchResults.Num();if (SessionIndexInSerarchResults > -1 && SessionIndexInSerarchResults < FindNum){UE_LOG(MyLog_HallGameSession, Log, TEXT("----JoinSession---- SearchResults:%d"), SearchSetting->SearchResults.Num());//将转房间ID数据换成FOnlineSessionSearchResult&数据const FOnlineSessionSearchResult& SearchResult = SearchSetting->SearchResults[SessionIndexInSerarchResults];bool Result = SessionPtr->JoinSession(*UserId, FName("NAME_GameSession2"), SearchResult);//加入房间return Result;}}}return false;
}void AHallGameSession::OnJoinSessionComplete(FName InSessionName, EOnJoinSessionCompleteResult::Type Result)
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//获取接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){//清空句柄SessionPtr->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle);if (Result == EOnJoinSessionCompleteResult::Success){if (AHallPlayerController* PC = Cast<AHallPlayerController>(GetWorld()->GetFirstPlayerController())){//充当之前在GamePlayPlayerController直连服务器中的FURL map 的作用FString ConnectString;//GetResolvedConnectString:返回用于加入匹配的特定于平台的连接信息。从连接完成的委托调用此函数if (SessionPtr->GetResolvedConnectString(FName("NAME_GameSession2"), ConnectString)){FString PlayerName = "Null";//获取命令行中的角色名字if (FParse::Value(FCommandLine::Get(), TEXT("PlayerName="), PlayerName)) {}//旅行到不同的地图或者地址PC->ClientTravel(ConnectString + "?PN=" + PlayerName, TRAVEL_Absolute);UE_LOG(MyLog_HallGameSession, Log, TEXT("----OnJoinSessionComplete---- NetMode:%s"), *UBFL_LogManager::GetNetModeStr(this));UE_LOG(MyLog_HallGameSession, Log, TEXT("----OnJoinSessionComplete---- ConnectString:%s"), *ConnectString);}}}}}
}

运行结果

  • 将客户端中的批处理脚本进行修改,进入地图改成我们会话大厅的地图
    在这里插入图片描述
  • 最后在去GPPGameSession类中,将我们之前写的这个公共可连接数量改为1,之前写的0。
    在这里插入图片描述
  • 打开服务器与客户端脚本,运行结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

客户端本地获取房间信息逻辑

  • 首先在HallGameSession类中创建一个结构体用来保存查找到的房间结果里面的数据
    在这里插入图片描述
  • 删除HallPlayerController类中的测试函数,改为在蓝图中实现的函数,传入我们需要的房间结果的数据信息
    在这里插入图片描述
  • HallGameSessionOnFindSessionComplete函数中提取房间信息
    在这里插入图片描述
  • AHallGameSession::OnFindSessionComplete(bool bWasSuccessful)函数
void AHallGameSession::OnFindSessionComplete(bool bWasSuccessful)
{IOnlineSubsystem* OnlineSub = Online::GetSubsystem(GetWorld());if (OnlineSub){//拿接口IOnlineSessionPtr SessionPtr = OnlineSub->GetSessionInterface();if (SessionPtr.IsValid()){//清空句柄SessionPtr->ClearOnFindSessionsCompleteDelegate_Handle(OnFindSessionCompleteDelegateHandle);}}if (UGPProjectGameInstance* GI = Cast<UGPProjectGameInstance>(GetWorld()->GetGameInstance())){if (AHallPlayerController* PC = Cast<AHallPlayerController>(GI->GetFirstLocalPlayerController())){TArray<FUISessionInfo> UISessionList;//用来保存结果信息的自定义结构体数组TArray<FOnlineSessionSearchResult> ResultList = SearchSetting->SearchResults;//拿取信息for (int32 SearchIdx = 0; SearchIdx < ResultList.Num(); SearchIdx++){//查找的房间结果数据const FOnlineSessionSearchResult& SearchResult = ResultList[SearchIdx];FUISessionInfo UISession;UISession.SearchResultIndex = SearchIdx;//房间序号UISession.SessionName = SearchResult.Session.OwningUserName; //会话的名字//玩家数量 = 公共的链接 + 私有的链接 - 已经公开的链接 - 已经公开的私有链接UISession.PlayerNum = SearchResult.Session.SessionSettings.NumPublicConnections +SearchResult.Session.SessionSettings.NumPrivateConnections -SearchResult.Session.NumOpenPublicConnections - SearchResult.Session.NumOpenPrivateConnections;//房间最大数量 = 公共的链接 + 私有的链接UISession.PlayerMaxNum = SearchResult.Session.SessionSettings.NumPublicConnections +SearchResult.Session.SessionSettings.NumPrivateConnections;//PingUISession.Ping = SearchResult.PingInMs;//游戏模式SearchResult.Session.SessionSettings.Get(SETTING_GAMEMODE, UISession.GameType);//游戏地图SearchResult.Session.SessionSettings.Get(SETTING_MAPNAME, UISession.MapName);//赋值到我们的自定义结构体数组中UISessionList.Emplace(UISession);}UE_LOG(MyLog_HallGameSession, Log, TEXT("OnFindSessionComplete-------bWasSuccessful:%d"), bWasSuccessful);//调用测试函数PC->FindSessionComplete(UISessionList);}}
}
  • 新建HallGameMode与HUD、PlayerController的蓝图类,填入世界设置
    在这里插入图片描述
  • HallPlayerController蓝图中去获取房间信息
    在这里插入图片描述

通过按钮点击进入房间

  • 创建会话大厅的UI界面
    在这里插入图片描述
    在这里插入图片描述
  • HallHUD蓝图中创建这个UI
    在这里插入图片描述
  • HallPlayerController蓝图中勾选显示鼠标
    在这里插入图片描述
  • 点击进入房间按钮的时候就加入到房间逻辑
    在这里插入图片描述
  • 使用服务器与客户端的批处理脚本,运行结果
    在这里插入图片描述
    在这里插入图片描述

通过按钮点击查找房间

  • 制作游戏大厅的显示列表的UI
    在这里插入图片描述

  • 创建房间列表的UI蓝图进行制作
    在这里插入图片描述

  • 然后在创建一个函数进行读取这些变量的逻辑进行赋值到UI上
    在这里插入图片描述

  • 添加这个UI蓝图到列表中
    在这里插入图片描述

  • 刷新按钮逻辑
    在这里插入图片描述

  • 使用服务器与客户端的批处理脚本,运行结果
    在这里插入图片描述
    在这里插入图片描述

客户端点击加入选中条目房间

  • 将列表UI重新调整一下
    在这里插入图片描述
  • 给背景创建一个事件
    在这里插入图片描述
  • 创建一个BPUI_HallSession的实例变量,打开可编辑实例与生成时公开
    在这里插入图片描述
  • BPUI_HallSession蓝图中,将创建列表UI控件的节点刷新一下,将自己的引用传入进去
    在这里插入图片描述
  • 创建一个传入房间的变量和一个更新这个房间变量的函数
    在这里插入图片描述
    在这里插入图片描述
  • 点击背景事件逻辑
    在这里插入图片描述
  • 在更新房间变量处也添加一个测试打印,打印房间号
    在这里插入图片描述
  • 将加入房间的默认0号换成我们的传入的房间号
    在这里插入图片描述
  • 将列表蓝图中的垂直框也就是信息栏改为非可命中测试(自身和所有子项),这样就点击文字信息栏也选中这个房间
    在这里插入图片描述
  • 使用服务器与客户端的批处理脚本,运行结果
    在这里插入图片描述
    在这里插入图片描述

选中房间条目UI颜色变化

  • BP_HallSingleList蓝图的InitData函数中添加两个线性颜色变量,InitData函数每次刷新房间后,就会给房间默认的颜色
    在这里插入图片描述

  • 然后创建两个函数,一个是恢复颜色,一个是选择后改变颜色
    在这里插入图片描述
    在这里插入图片描述

  • 当我们点击服务器的时候就改变颜色
    在这里插入图片描述

  • 在更新更新房间序号函数里面存一下BP_HallSingleList蓝图变量,这样就知道点击了那个房间了
    在这里插入图片描述

  • BP_HallSingleList蓝图里面的点击背景的事件中,将更新的更新房间号函数的自己传入参数,告诉主UI,现在点击的是自己,保存自己,这样就拿到上一个房间了
    在这里插入图片描述

  • 更新房间序号函数添加一个判断逻辑,如果上一个点击的房间对象还有效就改成默认颜色,否则还是原本逻辑执行,第一次运行,这个地方因为没有点击房间,这里必定为空,所以执行原本的逻辑
    在这里插入图片描述

  • 启动两个服务器测试运行结果
    在这里插入图片描述

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

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

相关文章

大模型应用开发框架LangChain

LangChain是什么&#xff1f; 它是针对大语言模型开发的一个开源的抽象框架。下图以github的流行度为例&#xff0c;可以看到langchain在很短的时间流行度达到Pytorch框架的高度&#xff0c;在AI燤火的当下&#xff0c;非常的流行。 上图&#xff0c;可以看到短短不到1年&…

AMD在行动:揭示应用程序跟踪和性能分析的力量

AMD in Action: Unveiling the Power of Application Tracing and Profiling — ROCm Blogs 导言 Rocprof是一款强大的工具&#xff0c;设计用于分析和优化基于AMD ROCm平台上运行的HIP程序的性能&#xff0c;帮助开发者找出并解决性能瓶颈。Rocprof提供了多种性能数据&#x…

每日一题——Python实现PAT乙级1099 性感素数(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 时间复杂度分析 空间复杂度分析 综合点评 我要更强 优化点 …

人事信息管理系统(Java+MySQL)

一、项目背景 在现代企业中&#xff0c;管理大量员工的工作信息、薪资、请假、离职等事务是一项非常繁琐和复杂的任务。传统的手工管理方式不仅效率低下&#xff0c;而且容易出错。为了提高人事管理的效率&#xff0c;减少人工操作带来的错误&#xff0c;企业迫切需要一个高效…

【JAVASE】详讲java案例(中)

这篇接着讲用java语言写程序&#xff0c;本篇文章要讲三道题&#xff1a; &#xff08;1&#xff09;数字加密 &#xff08;2&#xff09;数组拷贝 &#xff08;3&#xff09;打印乘法表 一&#xff1a;数字加密 需求&#xff1a;某系统的数字密码是一个四位数&#xff0c…

【Leetcode】881. 救生艇

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 点击打开题目链接&#x1f517; 给定数组 p e o p l e people people 。 p e o p l e [ i ] people[i] people[i]表示第 i i i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重…

【李宏毅-生成式 AI】Spring 2024, HW5:LLM Fine-tuning 实验记录

文章目录 1. Task Overview2. Overall Workflow3. Dataset 介绍4. 代码介绍4.1 环境介绍4.2 下载 dataset4.3 下载并加载模型4.2 Notebook 代码1&#xff09;import 部分2&#xff09;固定 seed3&#xff09;加载 LLM4&#xff09;加载 tokenizer5&#xff09;设置解码参数6&am…

tcp协议的延迟应答(介绍+原则),拥塞控制(拥塞窗口,网络出现拥塞时,滑动窗口的大小如何确定,慢启动,阈值)

目录 延迟应答 引入 介绍 原则 拥塞控制 引入 网络出现拥塞 引入 介绍 介绍 拥塞窗口 介绍 决定滑动窗口的大小 慢启动 介绍 为什么要有慢启动 阈值 算法 总结 延迟应答 引入 发送方一次发送更多的数据,发送效率就越高 因为要写入网卡硬件的io速度很慢,尽量…

conda 创建环境失败

conda create -n pylableimg python3.10在conda &#xff08;base&#xff09;环境下&#xff0c;创建新的环境&#xff0c;失败。 报错&#xff1a; LookupError: didn’t find info-scipy-1.11.3-py310h309d312_0 component in C:\Users\Jane.conda\pkgs\scipy-1.11.3-py310h…

英伟达:史上最牛一笔天使投资

200万美元的天使投资&#xff0c;让刚成立就面临倒闭风险的英伟达由危转安&#xff0c;并由此缔造了一个2.8万亿美元的市值神话。 这是全球风投史上浓墨重彩的一笔。 前不久&#xff0c;黄仁勋在母校斯坦福大学的演讲中&#xff0c;提到了人生中的第一笔融资——1993年&#x…

刷代码随想录有感(98):动态规划——爬楼梯

题干&#xff1a; 代码&#xff1a; class Solution { public:int climbStairs(int n) {if(n 1)return 1;if(n 2)return 2;vector<int>dp(n 1);dp[0] 0;dp[1] 1;dp[2] 2;for(int i 3; i < n; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 其实就是斐波…

liquibase做数据库版本管理

通过这个配置就会自动启动liquibase 比对 https://www.cnblogs.com/ludangxin/p/16676701.html https://zhuyizhuo.github.io/2020/07/04/spring-boot/spring-boot-liquibase-database-version-control/

上市公司短视主义数据集(2001-2022年)

数据简介&#xff1a;上市公司短视主义是指公司管理层过于关注短期业绩和股价表现&#xff0c;而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误&#xff0c;影响公司的长期竞争力。 在上市公司年度报告年度中&#xff0c;通过已有的反映管理者“短…

Excel 将同一分类下的值依次填进分类格右边的格中

表格的第2列是分类&#xff0c;第3列是明细&#xff1a; ABC1S.noAccountProduct21AAAQatAAG32BAAQbIAAW43BAAQkJAAW54CAAQaAAP65DAAQaAAX76DAAQbAAX87DAAQcAAX 需要将同一分类下的值依次填入分类格右边的格中&#xff1a; ABCD1S.noAccountProduct21AAAQatAAG32BAAQbIAAWkJ…

快速安装Windows和Ubuntu双系统

一、参考资料 用UltraISO制作Ubuntu16.04 U盘启动盘 DiskPart Command-Line Options 二、相关介绍 1. MBR和GPT分区模式 MBR分区模式 MBR最大仅支持2TB磁盘&#xff0c;超过2TB不可识别。 MBR&#xff08;Master Boot Record&#xff09;&#xff0c;即硬盘的主引导记录分…

【激光雷达】

激光雷达 机械式360扫描雷达半固态激光雷达二维扫描一维扫描 固态激光雷达OPA固态激光雷达&#xff08; 光学相控阵技术&#xff09; FMCW 激光雷达 激光雷达技术在近几年可以说是蓬勃发展&#xff0c;新能源汽车的大量使用&#xff0c;给雷达技术的发展提供了肥沃的土壤&#…

嵌入式作业6

1、利用SysTick定时器编写倒计时程序&#xff0c;如初始设置为2分30秒&#xff0c;每秒在屏幕上输出一次时间&#xff0c;倒计时为0后&#xff0c;红灯亮&#xff0c;停止屏幕输出&#xff0c;并关闭SysTick定时器的中断。 2、利用RTC显示日期&#xff08;年月日、时分秒&…

【C++类和对象中篇】(构造函数和析构函数)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.默认成员函数的概念&#xff1a; &#x1f369;2.构造函数&#xff1a; 2.1特性&…

从零开始理解AdaBoost算法:设计思路与算法流程(二)【权值更新与加权表决、数学公式】

设计思路 AdaBoost算法属于Boosting算法家族中的一种&#xff0c;其基本思路是将多个弱分类器组合成一个强分类器。 “强分类器”是指一个分类准确率较高的模型“弱分类器”则是指分类准确率略高于随机猜测的简单模型。 AdaBoost的核心思想是通过 加权 的方式逐步提高分类器…

黑马es学习

es 0. 基础概念0.1 倒排索引0.2 文档、索引0.3 与mysql对比 1 基本操作1.1 mapping 索引库操作1.2 单个文档CRUD 3. DSL查询3.1 查询所有3.2 全文检索3.3 精确查询3.4 复合查询-相关性得分3.5 分页3.6 高亮3.7 总结 2. RestClientmysql与es数据同步es集群去重 黑马视频 官方使…