【unity之IMGUI实践】单例模式管理数据存储【二】
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unityUI专题篇
⭐单例模式管理面板对象⭐
文章目录
- ⭐单例模式管理面板对象⭐
- 🎶前言
- 🎶(==A==)常用关键API
- 🎶(==B==)需求分析
- 🎶(==C==)逻辑封装——游戏音乐数据存储
- 😶🌫️:步骤实现
- 实现音乐数据的同步更新——最终代码
- 🎶(==D==)逻辑封装——游戏排行榜数据存储
- 😶🌫️:**步骤实现**
- 总UML图
- 🎶(==E==)逻辑封装——音乐数据管理类
- 😶🌫️步骤:
- 结论:
- 👌结论:
🎶前言
🅰️
🎶(A)常用关键API
🎶(B)需求分析
🎶(C)逻辑封装——游戏音乐数据存储
😶🌫️:步骤实现
1.首先将音乐数据封装在类中,不采用单例模式
2. 而后封装一个游戏数据类为单例模式:功能:利用Playerfabs进行数据存储音乐数据
3.读取存盘中的数据更新游戏数据
1.首先将音乐数据封装在类中,不采用单例模式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 音乐相关数据存储类
//___________功能: 记录音乐相关的数据
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class MusicData
{//记录音乐,音效的开关状态和拖动条public bool musicSwitch;public bool soundSwitch;public float musicRoll;public float soundRoll;public bool isFirst;
}
2. 而后封装一个游戏数据类为单例模式:功能:利用Playerfabs进行数据存储音乐数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据类
//___________功能: 记录游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;private GameData(){musicData = new MusicData();musicData = PlayerfabsClass.Chats.GetDataMess(typeof(MusicData), "Music") as MusicData ;if ( !musicData.isFirst ) //如果是第一次进入游戏{musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 0.5f;musicData.soundRoll = 0.5f;PlayerfabsClass.Chats.SaveDataMess(musicData, "Music"); //设置为自定义的默认值后进行存储 }}}
3.读取存盘中的数据更新游戏数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 设置面板功能
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class SetPlane : BeginFather<SetPlane>
{//将功能控件拖拽对应的成员变量中public Button closeButt;public Slider sliderMusic;public Slider sliderSound;public ToggleM toggleMusic;public ToggleM toggleSound;private float toggle1;private float toggle2;private void Start(){//按钮中事件的添加closeButt.triggerEvent += () => {this.gameObject.SetActive(false);BeginPlane.SingleInstance.Show();};//滑条中事件的添加sliderMusic.triggerEvent += (value) =>{};sliderSound.triggerEvent += (value) =>{};//多选框中事件的添加toggleMusic.triggerEvent += (value) =>{};toggleSound .triggerEvent += (value) =>{};this.Hidden();}private void MusicDataUpdate(){MusicData data = GameData.DataContorl.musicData;sliderMusic.NowValue = data.musicRoll;sliderSound.NowValue = data.soundRoll;toggleMusic.IsSwitch = data.musicSwitch;toggleSound.IsSwitch = data.soundSwitch;}public override void Show(){base.Show(); //保留父类的封装逻辑MusicDataUpdate();}
}
实现音乐数据的同步更新——最终代码
目的: 将游戏游戏数据保存至硬盘,下次开启游戏实现数据同步
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据类
//___________功能: 记录游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;private GameData(){musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }}//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music");}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 设置面板功能
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class SetPlane : BeginFather<SetPlane>
{//将功能控件拖拽对应的成员变量中public Button closeButt;public Slider sliderMusic;public Slider sliderSound;public ToggleM toggleMusic;public ToggleM toggleSound;private float toggle1;private float toggle2;private MusicData musicData;private void Start(){//按钮中事件的添加closeButt.triggerEvent += () => {Hidden();BeginPlane.SingleInstance.Show();};//多选框中事件的添加toggleMusic.triggerEvent += (value) => GameData.DataContorl.ChangeMusicS(value);toggleSound.triggerEvent += (value) => GameData.DataContorl.ChangeSoundS(value);//滑条中事件的添加sliderMusic.triggerEvent += (value) => GameData.DataContorl.ChangeMusicR(value);sliderSound.triggerEvent += (value) => GameData.DataContorl.ChangeSoundR(value);Hidden();}private void MusicDataUpdate() //将已存盘的数据读取后更新{MusicData data = GameData.DataContorl.musicData;toggleMusic.IsSwitch = data.musicSwitch;toggleSound.IsSwitch = data.soundSwitch;sliderMusic.NowValue = data.musicRoll;sliderSound.NowValue = data.soundRoll;}public override void Show(){base.Show(); //保留父类的封装逻辑MusicDataUpdate(); //在展示时更新}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 开始面板类
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class BeginPlane : BeginFather<BeginPlane>
{// 获取开始面板中的各个按钮控件public Button but1;public Button but2;public Button but3;public Button but4;private void Start(){but1.triggerEvent += () => { SceneManager.LoadScene("Start"); }; //点击“开始游戏”but2.triggerEvent += () => { Hidden(); SetPlane.SingleInstance.Show(); }; //点击“游戏设置”but3.triggerEvent += () => { Application.Quit(); }; //点击“退出游戏”but4.triggerEvent += () => { Hidden(); }; //点击“排行榜”}}
🎶(D)逻辑封装——游戏排行榜数据存储
界面设计
- 效果演示:
😶🌫️:步骤实现
-
1.封装排行榜数据类(无参构造做new ,有参构造做一键赋值)
-
2.以数据管理类为载体进行更新API封装——只存储排行榜中的数据到盘(注册表)中
-
3.封装排行榜面板类进行实时显示
-----
封装排行榜数据类(无参构造做new ,有参构造做一键赋值)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:
//___________功能: 排行榜数据的载体
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class RankData
{ public string name;public int score;public int time;public RankData() //用来new{}public RankData(string name, int score, int time ) //用来一键赋值{this.name = name ;this.score = score ;this.time = time;}
}
----------------------
以数据管理类为载体进行更新API封装
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据管理类
//___________功能: 记录和更新游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;public List<RankData> rankTopData;//固定承载前六名的数据信息private GameData(){//初始化读取音乐数据musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;//初始化读取排行榜数据rankTopData = PlayerPrefsDataMgr.Instance.LoadData(typeof(List<RankData>), "Rank") as List<RankData>;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }} //------------------------排行榜数据的更新封装-------------------------------//在排行榜中添加数据public void SaveRankData(string name, int score, int time){rankTopData.Add(new RankData(name, score, time));Debug.Log(rankTopData);rankTopData.Sort((a, b) => { return a.score > b.score ? -1 : 1; }); //添加排序规则//但list大于6时for (int i = rankTopData.Count - 1 ; i > 5; i--){rankTopData.RemoveAt(i); //删除}PlayerPrefsDataMgr.Instance.SaveData(rankTopData, "Rank" );}//------------------------音乐数据的更新封装------------------------------//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music");}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}
}
-----------
3.封装排行榜面板类进行实时显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 排行榜面板
//___________功能: 掌控排行榜面板相关控件
//___________创建者: 秩沅_______________
//_____________________________________
//-------------------------------------public class RankPlane : BeginFather<RankPlane >
{public Button closeButton;//采用列表的方式进行排行数据的暂时存储private List<Label> RK_Name = new List<Label>();private List<Label> RK_Score = new List<Label>();private List<Label> RK_Time = new List<Label>();private void Start(){//通过API获取排行榜中的标签for (int i = 1; i <= 6; i++){ RK_Name.Add(this.transform.Find("RKName/player" + i ).GetComponent<Label>());RK_Score.Add(this.transform.Find("RKScore/Score" + i ).GetComponent<Label>());RK_Time.Add(this.transform.Find("RKTime/time" + i ).GetComponent<Label>()); } //为按钮中的事件添加方法closeButton .triggerEvent += ()=>{Hidden(); BeginPlane.SingleInstance.Show();};Hidden(); }public override void Show(){base.Show();ShowRankData();}public void ShowRankData() //读盘排行榜数据并显示{GameData.DataContorl .SaveRankData("nibb", 100, 342);List<RankData> data = GameData.DataContorl.rankTopData;for (int i = 0; i < data.Count; i++){string showTime = "";int hour, min, second;print(data[i].name);RK_Name[i].ContorlContent.text = data[i].name;RK_Score[i].ContorlContent.text = data[i].score.ToString();RK_Time[i].ContorlContent.text = "";//时间格式转化hour = data[i].time / 3600;min = data[i].time / 60 % 60;second = data[i].time % 60;showTime = $"{hour}小时{min}分钟{second}秒";RK_Time[i].ContorlContent.text = showTime;}}
}
总UML图
🎶(E)逻辑封装——音乐数据管理类
😶🌫️步骤:
- 1.封装音乐数据管理类——单例
- 2.在游戏数据管理类中,更新音乐数据更新方法
封装音乐数据类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 更新音乐
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class MusicContol : MonoBehaviour
{static private MusicContol singleMusicContol;static public MusicContol SingleMusicContol => singleMusicContol;private AudioSource beginAudio;private MusicData nowMusicData;void Awake(){singleMusicContol = this;//达到一运行游戏就有音乐的效果beginAudio = GetComponent<AudioSource>(); //从盘中读取nowMusicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData;beginAudio.enabled = nowMusicData.musicSwitch;beginAudio.volume = nowMusicData.musicRoll;}//----将其变成外界可调用的方法------ public void ChangeMusicSwitch(bool value) //改变音乐开关{beginAudio.enabled = value;}public void ChangeMusicRoll(float value) //改变音乐大小{beginAudio.volume = value;}public void ChangeSoundSwitch(bool value) //改变音效开关{}public void ChangeSoundRoll(float value) //改变音效大小{}
}
游戏数据管理类,也需要更新——在方法中更新逻辑
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________脚本名: 游戏数据管理类
//___________功能: 记录和更新游戏的数据并用PlayerFabs存储
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------public class GameData
{static private GameData dataContorl = new GameData ();static public GameData DataContorl => dataContorl ;public MusicData musicData ;public List<RankData> rankTopData;//固定承载前六名的数据信息private GameData(){//初始化读取音乐数据musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData ;//初始化读取排行榜数据rankTopData = PlayerPrefsDataMgr.Instance.LoadData(typeof(List<RankData>), "Rank") as List<RankData>;if ( !musicData.isFirst ) //如果是第一次进入游戏(表示注册表中第一次存该类型数据时){musicData.isFirst = true;musicData.musicSwitch = true;musicData.soundSwitch = true;musicData.musicRoll = 1f;musicData.soundRoll = 1f;PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music"); }} //【------------------------排行榜数据的更新封装----------------------------------】//在排行榜中添加数据public void SaveRankData(string name, int score, int time){rankTopData.Add(new RankData(name, score, time));Debug.Log(rankTopData);rankTopData.Sort((a, b) => { return a.score > b.score ? -1 : 1; }); //添加排序规则//但list大于6时for (int i = rankTopData.Count - 1 ; i > 5; i--){rankTopData.RemoveAt(i); //删除}PlayerPrefsDataMgr.Instance.SaveData(rankTopData, "Rank" );}//【------------------------音乐数据的更新(存盘)封装----------------------------------】//音乐开关数据的更新存储public void ChangeMusicS( bool value){musicData.musicSwitch = value;MusicContol.SingleMusicContol.ChangeMusicSwitch(value); //实时改变音乐大小_下同PlayerPrefsDataMgr.Instance.SaveData(musicData,"Music"); //实时进行音乐数据存盘_下同}//音效开关数据的更新存储public void ChangeSoundS(bool value){musicData.soundSwitch = value;MusicContol.SingleMusicContol.ChangeSoundSwitch(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音乐滑条数据的更新存储public void ChangeMusicR(float value){musicData.musicRoll = value;MusicContol.SingleMusicContol.ChangeMusicRoll(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}//音效滑条数据的更新存储public void ChangeSoundR(float value){musicData.soundRoll = value;MusicContol.SingleMusicContol.ChangeSoundRoll(value);PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");}}
过程中的错误——优化思维
进行优化__________==>
结论:
👌结论:
- 1.进行模块化处理,数据管理就是数据管理,面板显示就是面板显示,各司其职,员工不得乱工作
- 2.抽象行为,分配行为,你就是掌控者
- 3.如果某个行为/操作,不仅限于一个对象,要将其封装成外界可以调用的API
(例如修改主界面音频时,自己直接获取,却没想到将其封装成外界调用的方法)
⭐相关文章⭐
⭐【2023unity游戏制作-mango的冒险】-6.关卡设计
⭐【2023unity游戏制作-mango的冒险】-5.攻击系统的简单实现
⭐【2023unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随
⭐【2023unity游戏制作-mango的冒险】-3.基础动作和动画API实现
⭐【2023unity游戏制作-mango的冒险】-2.始画面API制作
⭐【2023unity游戏制作-mango的冒险】-1.场景搭建
⭐“狂飙”游戏制作—游戏分类图鉴(网易游学)
⭐本站最全-unity常用API大全(万字详解),不信你不收藏
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!
相关文章:

【unity之IMGUI实践】单例模式管理数据存储【二】
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...

【C++】开源:Linux端ALSA音频处理库
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Linux端ALSA音频处理库。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令
目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令,…...

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现
功能介绍 以51单片机作为主控系统;液晶显示当前信息和状态;通过语音识别模块对当前垃圾种类进行语音识别; 通过蜂鸣器进行声光报警提醒垃圾桶已满;采用舵机控制垃圾桶打开关闭;超声波检测当前垃圾桶满溢程度࿱…...

最新版本docker 设置国内镜像源 加速办法
解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…...

深度学习——LSTM解决分类问题
RNN基本介绍 概述 循环神经网络(Recurrent Neural Network,RNN)是一种深度学习模型,主要用于处理序列数据,如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构,允许…...

three.js入门二:相机的zoom参数
环境: threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)vscodewindowedge 透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。 注意:…...
sql语法树(select)实例
在SELECT节点下,将"*"(表示选择所有列)添加为子节点。下面是一个简单的SQL语句示例: SELECT * FROM customers WHERE age > 25 AND city New York;语法树(Syntax Tree)是由SQL解析器构建的…...

爬虫002_python程序的终端运行_文件运行_ipython的使用---python工作笔记020
用python运行一个文件,就是要写一个.py结尾的文件 然后保存 然后直接cmd中,python 然后写上py文件的路径就可以了 然后看一下内容 看一下终端中运行,直接输入python进入python环境,然后写python代码 回车运行 退出可以用exit()...

智融SW3518S降压协议IC一款适合车充控制芯片
描述 SW3518S 是一款高集成度的多快充协议双口充电芯片, 支持 AC 口任意口快充输出, 支持双口独立限流。 其集成了 5A 高效率同步降压变换器, 支持 PPS/PD/QC/AFC/FCP/SCP/PE/SFCP/VOOC等多种快充协议, 最大输出 PD 100Wÿ…...

虹科活动 | 虹科ADAS自动驾驶研讨会
虹科ADAS/自动驾驶研讨会将于8月7日在上海闵行展开——加快ADAS/AD开发步伐! 期待您的参与!...
LeetCode-每日一题-将数组和减半的最少操作次数
2208. 将数组和减半的最少操作次数 提示 中等 49 相关企业 给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返…...
97、Kafka的性能好在什么地方
Kafka的性能好在什么地方 一、顺序写二、零拷贝三、额外补充 kafka不基于内存,而是硬盘存储,因此消息堆积能力更强 一、顺序写 顺序写 : 利用磁盘的顺序访问速度可以接近内存,kafka的消息都是append操作,partition是有序的&#…...

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述
SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…...
GO学习之切片操作
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 文章目录 GO系列前言一、什么是切片(和数组有什么关系)二、切片基本操作2.1 切片定义2.2 添加元素2.3 删除元素2.4 遍历2.5 自定…...

YOLOv8实战口罩佩戴检测(视频教程)
课程链接:https://edu.csdn.net/course/detail/38827 口罩佩戴检测可以应用于公共场所的安全管理、疫情防控监测等多种场景。YOLOv8是前沿的目标检测技术,它基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程使用…...

SiddonGpu编译过程记录
1. 还是想要能够快速生成DRR,用了这个up的代码GitHub - fabio86d/CUDA_DigitallyReconstructedRadiographs: GPU accelerated python library for generation of Digitally Reconstructed Radiographs (March 2018) 在看步骤的时候不是很清晰。尤其是procedure to…...
Ubuntu 20.04使用 VNC远程桌面连接避坑指南
自从开始使用Ubuntu 20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的…...

STM32MP157驱动开发——按键驱动(定时器)
内核函数 定时器涉及函数参考内核源码:include\linux\timer.h 给定时器的各个参数赋值: setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data):设置定时器:主要是初始化 timer_list 结…...

基于Centos 7虚拟机的磁盘操作(添加磁盘、分区、格式分区、挂载)
目录 一、添加硬盘 二、查看新磁盘 三、磁盘分区 3.1新建分区 3.2 格式分区 3.3 挂载分区 3.4 永久挂载新分区 3.5 取消挂载分区 一、添加硬盘 1.在虚拟机处选择编辑虚拟机设置,然后选择添加 2.选择硬盘,然后选择下一步 3.默认即可,下一步…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...