《UE5_C++多人TPS完整教程》學習筆記22 ——《P23 記錄加入的玩家(Couting Incoming Players)》


本文為B站系列教學視頻 《UE5_C++多人TPS完整教程》 —— 《P23 記錄加入的玩家(Couting Incoming Players)》 的學習筆記,該系列教學視頻為 Udemy 課程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻譯版,UP主(也是譯者)為 游戲引擎能吃么。


文章目錄

  • P23 記錄加入的玩家
  • 23.1 游戲模式和游戲狀態
  • 23.2 追蹤加入或離開游戲的玩家
  • 23.3 使用 Lobby 游戲模式
  • 23.4 進行測試
  • 23.5 Summary


P23 記錄加入的玩家

本節課將創建一個游戲模式,以便追蹤(Track)加入游戲會話的玩家、打印游戲人數,之后我們就可以利用統計的人數來決定是否要從關卡 “Lobby” 過渡(Transition)到實際的匹配中。
在這里插入圖片描述


23.1 游戲模式和游戲狀態

  1. 在多人游戲中,兩個重要的類分別是游戲模式類和游戲狀態類:
  • 游戲模式規定了游戲規則,這涉及了很多方面,如何時將玩家移動至關卡中、選擇出生位等。游戲模式有幾個繼承的虛擬函數,可以在玩家加入或離開會話時進行追蹤,例如每當玩家加入游戲時都會調用 “PostLogin()” 訪問玩家的控制器;當玩家離開時調用 “Logout()” 函數。
  • 客戶端可以監控游戲狀態,游戲狀態將保存游戲的狀態信息,而非特定的單個玩家的信息。游戲狀態包含玩家狀態數組,玩家狀態類中保存了特定的單個玩家的信息,比如得分和勝利次數等。
  • 游戲模式類可以訪問游戲狀態類的玩家狀態數組,通過查看該數組的大小可以得出玩家的個數。
    在這里插入圖片描述

    兩個主要類負責處理進行中游戲的相關信息:Game Mode 和 Game State。
    即使最開放的游戲也擁有基礎規則,而這些規則構成了 Game Mode。在最基礎的層面上,這些規則包括:

    • 出現的玩家和觀眾數量,以及允許的玩家和觀眾最大數量。
    • 玩家進入游戲的方式,可包含選擇生成地點和其他生成/重生成行為的規則。
    • 游戲是否可以暫停,以及如何處理游戲暫停。
    • 關卡之間的過渡,包括游戲是否以動畫模式開場。

    基于規則的事件在游戲中發生,需要進行追蹤并和所有玩家共享時,信息將通過 Game State 進行存儲和同步。這些信息包括:

    • 游戲已運行的時間(包括本地玩家加入前的運行時間)。
    • 每個個體玩家加入游戲的時間和玩家的當前狀態。
    • 當前 Game Mode 的基類。
    • 游戲是否已開始。

    Game Modes
    特定的基礎(如進行游戲所需要的玩家數量,或玩家加入游戲的方法)在多種類型的游戲中具有共通性。可根據開發的特定游戲進行無窮無盡的規則變化。無論規則如何,Game Modes 的任務都是定義和實現規則。Game Modes 當前常用的基類有兩個。
    4.14 版本中加入了 AGameModeBase,這是所有 Game Mode 的基類,是經典的 AGameMode 簡化版本。AGameMode 是 4.14 版本之前的基類,仍然保留,功能 如舊,但現在是 AGameModeBase 的子類。由于其比賽狀態概念的實現,AGameMode 更適用于標準游戲類型(如多人射擊游戲)。AGameModeBase 簡潔高效,是新代碼項目中包含的全新默認游戲模式。


    Game State
    Game State 負責啟用客戶端監控游戲狀態。從概念上而言,Game State 應該管理所有已連接客戶端已知的信息(特定于 Game Mode 但不特定于任何個體玩家)。它能夠追蹤游戲層面的屬性,如已連接玩家的列表、奪旗游戲中的團隊得分、開放世界游戲中已完成的任務,等等。
    Game State 并非追蹤玩家特有內容(如奪旗比賽中特定玩家為團隊獲得的分數)的最佳之處,因為它們由 Player State 更清晰地處理。整體而言,Game State 應該追蹤游戲進程中變化的屬性。這些屬性與所有人皆相關,且所有人可見。Game Mode 只存在于服務器上,而 Game State 存在于服務器上且會被復制到所有客戶端,保持所有已連接機器的游戲進程更新。


    —— 虛幻引擎官方文檔《Game Mode 和 Game State》

  1. 打開虛幻引擎,在內容瀏覽器中展開 “C++類/MenuSystem”,添加游戲模式基礎(Game mode base)C++ 類,命名為 “LobbyGameMode”,選擇模塊為我們上節課新建的插件 “MenuSystem (Runtime)”。
    在這里插入圖片描述
    在這里插入圖片描述
  2. 點擊 “創建類” 按鈕,VS 中出現彈窗,選擇 “全部重新加載(A)”。
    在這里插入圖片描述

23.2 追蹤加入或離開游戲的玩家

  1. 在 “LobbyGameMode.h” 中添加頭文件 “GameFramework/GameStateBase.h” 和 “GameFramework/PlayerState.h”,避免出現錯誤 “使用了未定義類型 AGameStateBase” 和 “使用了未定義類型 APlayerState。接著,聲明重寫 “virtual void PostLogin()” 和 “virtual void Logout()”。

    // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
    #include "GameFramework/GameModeBase.h"/* P23 記錄加入的玩家(Couting Incoming Players)*/
    #include "GameFramework/GameStateBase.h"
    #include "GameFramework/PlayerState.h"
    /* P23 記錄加入的玩家(Couting Incoming Players)*/#include "LobbyGameMode.generated.h"/*** */
    UCLASS()
    class MENUSYSTEM_API ALobbyGameMode : public AGameModeBase
    {GENERATED_BODY()/* P23 記錄加入的玩家(Couting Incoming Players)*/
    public:// 成功登錄后調用。這是首個在 PlayerController 上安全調用復制函數之處。// OnPostLogin 可在藍圖中實現,以添加額外的邏輯。virtual void PostLogin(APlayerController* NewPlayer) override;	// 重寫 virtual void PostLogin()// 玩家離開游戲或被摧毀時調用。可實現 OnLogout 執行藍圖邏輯。virtual void Logout(AController* Exiting) override;				// virtual void Logout()
    /* P23 記錄加入的玩家(Couting Incoming Players)*/
    };
    
  2. 在 “LobbyGameMode.cpp” 中實現“virtual void PostLogin()” 和 “virtual void Logout()” 的覆寫。如果 “GameState” 和 “PlayerState” 標紅且錯誤提示為 “不允許指針指向不完整的類類型 AGameStateBase” 和 “不允許指針指向不完整的類類型 APlayerState”,則添加頭文件 “GameFramework/GameStateBase.h” 和 “GameFramework/PlayerState.h

    // Fill out your copyright notice in the Description page of Project Settings.#include "LobbyGameMode.h"/* P23 記錄加入的玩家(Couting Incoming Players)*/
    void ALobbyGameMode::PostLogin(APlayerController* NewPlayer)
    {Super::PostLogin(NewPlayer);if (GameState) {int32 NumberOfPlayers = GameState.Get()->PlayerArray.Num();if (GEngine) {GEngine->AddOnScreenDebugMessage(	// 添加調試信息到屏幕上1,				// Key 不是 -1 時,則更新現有消息60.f,			// 調試信息的顯示時間FColor::Red,	// 字體顏色:黃色FString::Printf(TEXT("Players in game: %d!"), NumberOfPlayers)	// 打印玩家人數);APlayerState* PlayerState = NewPlayer->GetPlayerState<APlayerState>();if (PlayerState) {FString PlayerName = PlayerState->GetPlayerName();GEngine->AddOnScreenDebugMessage(	// 添加調試信息到屏幕上2,				// Key 不是 -1 時,則更新現有消息60.f,			// 調試信息的顯示時間FColor::Cyan,	// 字體顏色:藍綠色FString::Printf(TEXT("%s has joined the game!"), *PlayerName)	// 打印進入游戲的玩家昵稱);}	}}
    }void ALobbyGameMode::Logout(AController* Exiting)
    {Super::Logout(Exiting);APlayerState* PlayerState = Exiting->GetPlayerState<APlayerState>();if (PlayerState) {int32 NumberOfPlayers = GameState.Get()->PlayerArray.Num();GEngine->AddOnScreenDebugMessage(	// 添加調試信息到屏幕上1,				// Key 不是 -1 時,則更新現有消息60.f,			// 調試信息的顯示時間FColor::Red,	// 字體顏色:紅色FString::Printf(TEXT("Players in game: %d!"), NumberOfPlayers - 1)	// 打印玩家人數,// 此時 PlayerArray.Num() 還未更新,這里進行減 1 操作只是為了方便測試時顯示正確的人數,在實際項目中不會如此操作);FString PlayerName = PlayerState->GetPlayerName();GEngine->AddOnScreenDebugMessage(	// 添加調試信息到屏幕上2,				// Key 不是 -1 時,則更新現有消息60.f,			// 調試信息的顯示時間FColor::Cyan,	// 字體顏色:藍綠色FString::Printf(TEXT("%s has exited the game!"), *PlayerName)	// 打印進入游戲的玩家昵稱);}}
    /* P23 記錄加入的玩家(Couting Incoming Players)*/
    

    這里可以復習一下函數 “AddOnScreenDebugMessage()” 第一個入參 “int32 Key” 取不同值的含義。這里 打印玩家人數打印進入或退出游戲的玩家昵稱 設置了不同的 “Key” 是為了都能在屏幕上顯示,如果設置為 -1 則 玩家人數消息 會被 進入或退出游戲的玩家昵稱消息 覆蓋。

    調用全局變量 GEngine 指針調用函數 AddOnScreenDebugMessage節點,進行屏幕輸出。

    void AddOnScreenDebugMessage {int32 Key,float TimeToDisplay,FColor Di splayColor,const FString & DebugMessage,bool bNewerOnTop,const FVector2D & TextScale
    }
    
    • Key = -1 時,則添加新的消息,不會覆蓋舊有消息(當 Key = -1 時,bNewerOnTop 有效,直接添加到隊列最上層)
    • Key != -1 時,則更新現有消息,效率更高。

    —— 《虛幻引擎基礎入門(C++) — 【日志輸出篇 03】》

  3. 在 “MultiplayerSessionsSubsystem.cpp” 的 “CreateSession()” 函數中加入一條會話設置的代碼行,用來設置唯一構建標識,防止不同的構建在搜索過程中可以互相搜索到。

    void UMultiplayerSessionsSubsystem::CreateSession(int32 NumpublicConnections, FString MatchType)
    {...// FOnlineSessionSettings 在頭文件 "OnlineSessionSettings.h" 中LastSessionSettings = MakeShareable(new FOnlineSessionSettings());	// 創建會話設置,利用函數 MakeShareable 初始化// 會話設置成員變量參閱及含義:https://docs.unrealengine.com/5.0/en-US/API/Plugins/OnlineSubsystem/FOnlineSessionSettings/LastSessionSettings->bIsLANMatch = IOnlineSubsystem::Get()->GetSubsystemName() == "NULL" ? true : false;	// 會話設置:如果找到的子系統名稱為 “NULL”,則使用 LAN 連接,否則不使用LastSessionSettings->NumPublicConnections = NumpublicConnections;	// 會話設置:設置最大公共連接數為函數輸入變量 NumpublicConnections.../* P23 記錄加入的玩家(Couting Incoming Players)*/LastSessionSettings->BuildUniqueId = 1;								// 會話設置:設置唯一構建標識,防止不同的構建在搜索過程中可以互相搜索到。/* P23 記錄加入的玩家(Couting Incoming Players)*/...}
    
  4. 在 “MenuSystem\Config” 目錄下打開 “DefaultGame.ini”,設置最大玩家數為 100。創建會話中設置最大公共連接數 “NumPublicConnections”區別開,設置最大公共連接數是指定加入會話的最大連接數,而設置最大玩家數是指定連接到游戲項目最大人數。

    [/Script/EngineSettings.GeneralProjectSettings]
    ProjectID=6A5F83AB4DEB75FB9BB586AC8DE40CDA
    ProjectName=Third Person Game Template[StartupActions]
    bAddPacks=True
    InsertPack=(PackSource="StarterContent.upack",PackName="StarterContent")[/Script/Engine.GameSession]
    MaxPlayers=100	
    
  5. (選做)注釋掉 “MenuSystemCharacter.cpp” 獲取在線子系統并打印在線子系統名稱到屏幕上的代碼,并刪除 “BP_ThirdPersonCharacter” 角色藍圖中按下數字鍵 “1” 和 “2” 對應的事件。

    // AMenuSystemCharacterAMenuSystemCharacter::AMenuSystemCharacter() :	// 為委托綁定回調函數CreateSessionCompleteDelegate(FOnCreateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnCreateSessionComplete)),FindSessionsCompleteDelegate(FOnFindSessionsCompleteDelegate::CreateUObject(this, &ThisClass::OnFindSessionsComplete)),JoinSessionCompleteDelegate(FOnJoinSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnJoinSessionComplete))
    {.../* P23 記錄加入的玩家(Couting Incoming Players)*///IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();			// 獲取當前的在線子系統指針//if (OnlineSubsystem) {													// 如果當前在線子系統有效//	OnlineSessionInterface = OnlineSubsystem->GetSessionInterface();	// 獲取會話接口智能指針//	if (GEngine) {//		GEngine->AddOnScreenDebugMessage(	// 添加調試信息到屏幕上//			-1,				// 使用 -1 不會覆蓋前面的調試信息//			15.f,			// 調試信息的顯示時間//			FColor::Blue,	// 字體顏色//			FString::Printf(TEXT("Found subsystem %s!"),//				*OnlineSubsystem->GetSubsystemName().ToString())	// 打印在線子系統的名稱//		);//	}//}/* P23 記錄加入的玩家(Couting Incoming Players)*/}
    

    在這里插入圖片描述


23.3 使用 Lobby 游戲模式

  1. 打開虛幻引擎,在內容瀏覽器中目錄 “/內容/ThirdPerson/Blueprints/” 下新建 “LobbyGameMode” 藍圖類,命名為 “BP_LobbyGameMode”。
    在這里插入圖片描述
    在這里插入圖片描述
  2. 雙擊 “BP_LobbyGameMode”,進入藍圖編輯器,在右側 “細節” 面板 “類” 選項卡下設置 “默認 pawn 類” 為 “BP_ThirdPersonCharacter”,編譯、保存。
    在這里插入圖片描述
  3. 在目錄 “/內容/ThirdPerson/Maps/” 下打開地圖 “Lobby”,在右下方 “世界場景設置” 面板設置 “游戲模式” 為“BP_LobbyGameMode”,保存。
    在這里插入圖片描述

    如果沒有看到右下方的 “世界場景設置” 面板,可以點擊工具欄右側 “項目和編輯器設置” 按鈕(虛幻引擎窗口右上方),在下拉菜單欄中選中 “世界場景設置”。
    在這里插入圖片描述


23.4 進行測試

  1. 將項目打包之后發送到另一臺設備上。在設備 1 上運行游戲(保證 Steam 已經運行),點擊 “Host” 按鈕,當前關卡跳轉至 “Lobby”,且左上角顯示會話創建成功消息。
    在這里插入圖片描述
    在這里插入圖片描述

  2. 在設備 2 上運行游戲(保證 Steam 已經運行且登錄的賬戶與設備1 上登錄的賬號不同),點擊 “Join” 按鈕,當前關卡跳轉至 “Lobby”,并且可以看到有兩個玩家存在,說明設備 2 成功找到并加入到了設備 1 創建的會話中,但是設備 2 屏幕左上角沒有顯示玩家人數和加入游戲信息,而創建會話的設備 1 上有顯示。
    在這里插入圖片描述
    在這里插入圖片描述

  3. 在設備 2 上退出游戲,可以看到設備 1 屏幕左上角顯示了設備 2 上的玩家離開游戲的消息,玩家人數也發生了變化。
    在這里插入圖片描述


23.5 Summary

本節課了解了游戲模式和游戲狀態的基本概念,并在虛幻引擎創建了游戲模式基礎(Game mode base)C++ 類 “LobbyGameMode”。接著我們在 “LobbyGameMode.cpp” 中實現“virtual void PostLogin()” 和 “virtual void Logout()” 的覆寫,以便能夠打印在線玩家人數以及玩家加入或退出游戲的消息。為了能夠使用這個游戲模式,我們以 “LobbyGameMode” 為父類新建了藍圖類 “BP_LobbyGameMode”,設置藍圖類的 “默認 pawn 類” 為 “BP_ThirdPersonCharacter”,并將地圖 “Lobby” 的 “游戲模式” 設置為“BP_LobbyGameMode”。最后,我們在兩臺設備上以玩家加入和退出游戲的方式進行來了測試,玩家人數以及玩家加入和退出游戲的消息都能正常顯示。
在這里插入圖片描述
23.2 追蹤加入或離開游戲的玩家步驟 2 中使用函數 AddOnScreenDebugMessage() 進行屏幕消息輸出時,若函數第一個入參 “int32 Key” 為 -1 ,則添加新的消息,不會覆蓋舊有消息(當 Key 為 -1 時,bNewerOnTop 有效,直接添加到隊列最上層),若 Key 不為 -1 ,則更新現有消息。這里打印 玩家人數 和 打印進入或退出游戲的玩家昵稱 設置了不同的 “Key” 是為了都能在屏幕上顯示,如果設置為 -1 則 玩家人數消息 會被 進入或退出游戲的玩家昵稱消息 覆蓋。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本)

前端面試問題(jwt/布局/vue數組下標/扁平化/菜單樹形/url api/新版本) 1. jwt鑒權邏輯 前端 JWT 鑒權邏輯通常涉及在發起請求時攜帶 JWT&#xff0c;并在接收到響應后處理可能的授權問題。 1. 用戶登錄&#xff1a; 用戶提供憑證&#xff1a; 用戶在登錄界面輸入用戶名和密碼…

如何使用Docker部署MongoDB并結合內網穿透實現遠程訪問本地數據庫

文章目錄 前言1. 安裝Docker2. 使用Docker拉取MongoDB鏡像3. 創建并啟動MongoDB容器4. 本地連接測試5. 公網遠程訪問本地MongoDB容器5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 正文開始前給大家推薦個網站&#xff0c;前些天發現了一個巨牛的 …

2024最佳住宅代理IP服務商有哪些?

跨境出海已成為了近幾年的最熱趨勢&#xff0c;大批量的企業開始開拓海外市場&#xff0c;而海外電商領域則是最受歡迎的切入口。新興的tiktok、Temu&#xff0c;老牌的Amazon、Ebay&#xff0c;熱門的Etsy、Mecari等等都是藍海一片。跨境入門并不難&#xff0c;前期的準備中不…

深入理解文件查看命令:cat、more、less、tail、head

在Linux系統中&#xff0c;有許多命令用于查看文件的內容&#xff0c;其中包括cat、more、less、tail和head。這些命令提供了不同的方式來瀏覽文本文件&#xff0c;適用于各種查看需求。在本篇博客中&#xff0c;我們將深入介紹這些命令&#xff0c;并通過示例演示它們的用法。…

Spring Boot打war包部署到Tomcat,訪問頁面404 !!!

水善利萬物而不爭&#xff0c;處眾人之所惡&#xff0c;故幾于道&#x1f4a6; 文章目錄 Spring Boot打war包部署到Tomcat&#xff0c;訪問頁面404 &#xff01;&#xff01;&#xff01;解決辦法&#xff1a;檢查Tomcat版本和Jdk的對應關系&#xff0c;我的Tomcat是6.x&#x…

Sping基礎篇----掌握Sping的控制反轉/依賴注入的概念【實戰案例總結】

作為一名對技術充滿熱情的學習者&#xff0c;我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代&#xff0c;我遠非專家&#xff0c;而是一位不斷追求進步的旅行者。通過這篇博客&#xff0c;我想分享我在某個領域的學習經驗&#xff0c;與大家共同探討、共…

SMMU介紹

SMMU&#xff08;System Memory Management Unit&#xff09;是一種硬件設備&#xff0c;其作用是在虛擬地址空間和物理地址空間之間提供地址轉換的功能。它通常用于處理虛擬化環境中的 I/O 設備&#xff0c;例如虛擬機中的設備訪問或者容器環境中的設備隔離。 SMMU 的主要作用…

KVM虛擬機的克隆方式

話不多說&#xff0c;直接上操作 首先確定我們要克隆的模板機器&#xff0c;這樣可以方便我們后續克隆許多機器 IP獲取最好就是dhcp模式&#xff0c;這樣克隆出來的機器就不需要自己再去改ip了 確定需要克隆的模板機以后&#xff0c;先關機再執行克隆操作 virsh shutdown ser…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目錄 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion&#xff08;own&#xff09;/ Future wo…

Android系統啟動流程

android的啟動流程是從底層開始進行的&#xff0c;具體如下所示&#xff1a; Android是基于Linux內核的系統&#xff0c;Android的啟動過程主要分為兩個階段&#xff0c;首先是Linux內核的啟動&#xff0c;然后是Android框架的啟動。 可以將Andorid系統的啟動流程分為以下五個…

【QT 5 +Linux下軟件桌面快捷方式+qt生成軟件創建桌面圖標+學習他人文章+第二篇:編寫桌面文件.desktop】

【QT 5 Linux下軟件桌面快捷方式qt生成軟件創建桌面圖標學習他人文章第二篇&#xff1a;編寫桌面文件.desktop】 1、前言2、實驗環境3、自我學習總結-本篇總結1、新手的疑問&#xff0c;做這件事目的2、了解.desktop3、三個關鍵目錄以及文件編寫1、目錄&#xff1a;/opt/2、目錄…

【鴻蒙 HarmonyOS 4.0】開發工具安裝

一、準備開發環境 1.1、安裝IDE 鴻蒙應用開發需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community&#xff08;IDEA社區版&#xff09;構建&#xff0c;為鴻蒙應用提供了一站式開發環境&#xff0c;集成了開發、運行、調試以及發布應用的…

【leetcode刷題之路】面試經典150題(3)——哈希表+區間

文章目錄 5 哈希表5.1 【哈希表】贖金信5.2 【數學】同構字符串5.3 【數學】單詞規律5.4 【哈希表】有效的字母異位詞5.5 【哈希表】字母異位詞分組5.6 【雙指針】兩數之和5.7 【數學】快樂數5.8 【哈希表】219. 存在重復元素 II5.9 【數學】最長連續序列 6 區間6.1 【數學】匯…

Stable Diffusion 模型分享:AstrAnime(Astr動畫)

本文收錄于《AI繪畫從入門到精通》專欄&#xff0c;專欄總目錄&#xff1a;點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五 下載地址 模型介紹 AstrAnime 是一個動漫模型&#xff0c;畫風色彩鮮明&#xff0c;擅長繪制漂亮的小姐姐。 條目內容類型大模型…

fastjson解析自定義get方法導致空指針問題

背景 為了在日志中把出入參打印出來&#xff0c;以便驗證鏈路和排查問題&#xff0c;在日志中將入參用fastjson格式化成字符串輸出&#xff0c;結果遇到了NPE。 問題復現 示例代碼 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

規模化強化學習 — 多任務強化學習

1 簡述 1.1 單任務強化學習&#xff08;STRL&#xff09; 在單任務強化學習中&#xff0c;一個無人機的AI系統可能被訓練來執行特定的任務&#xff0c;比如自主導航。在這個任務中&#xff0c;無人機需要學習如何有效地從起點飛行到終點&#xff0c;并避開障礙物。 舉例&#…

【Java多線程】分析線程加鎖導致的死鎖問題以及解決方案

目錄 1、線程加鎖 2、死鎖問題的三種經典場景 2.1、一個線程一把鎖 2.2、兩個線程兩把鎖 2.3、N個線程M把鎖&#xff08;哲學家就餐問題&#xff09; 3、解決死鎖問題 1、線程加鎖 其中 locker 可以是任意對象&#xff0c;進入 synchronized 修飾的代碼塊, 相當于加鎖&…

Java SourceDataLine 播放音頻

Java SourceDataLine 播放音頻 1 依賴2 接口3 實現4 測試 項目Value音頻格式 添加依賴*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持)*.mp3mp3spi.jar*.flacjflac-codec.jar 1 依賴 <dependency><groupId>com.googlecode.soundl…

?北郵復試刷題LCR 052. 遞增順序搜索樹__DFS (力扣119經典題變種挑戰)

LCR 052. 遞增順序搜索樹 給你一棵二叉搜索樹&#xff0c;請 按中序遍歷 將其重新排列為一棵遞增順序搜索樹&#xff0c;使樹中最左邊的節點成為樹的根節點&#xff0c;并且每個節點沒有左子節點&#xff0c;只有一個右子節點。 示例 1&#xff1a; 輸入&#xff1a;root [5,…

DataX - 全量數據同步工具

前言 今天是2024-2-21&#xff0c;農歷正月十二&#xff0c;相信今天開始是新的階段&#xff0c;盡管它不是新的周一、某月一日、某年第一天&#xff0c;盡管我是一個很講究儀式感的人。新年剛過去 12 天&#xff0c;再過 3 天就開學咯&#xff0c;開學之后我的大學時光就進入了…