4.1-泛型编程深入指南
4.1 泛型编程深入指南
本节将带您深入探索C#泛型机制在游戏开发中的高级应用。通过游戏对象池、数据管理器、事件系统等实际案例,您将学习如何运用泛型构建高效、灵活的游戏系统。掌握这些知识将帮助您开发出性能更好、架构更清晰的游戏。
前置知识
在学习本节内容前,您应该已经掌握:
- 基础篇 3.7 泛型入门中的基本概念
- Unity游戏开发基础知识
- 游戏系统架构设计原则
- 面向对象编程的核心概念
学习目标
通过本节的学习,您将能够:
- 使用泛型实现高效的游戏对象池系统
- 构建类型安全的游戏数据管理器
- 设计灵活的游戏事件系统
- 实现可重用的游戏组件系统
- 优化游戏性能,减少内存分配
- 掌握游戏开发中的泛型设计模式
- 理解并避免游戏开发中的泛型陷阱
知识地图
1. 游戏对象管理
1.1 泛型对象池系统
对象池是游戏开发中最重要的优化技术之一。使用泛型可以构建一个类型安全、高效的对象池系统:
public class ObjectPool<T> where T : Component
{private readonly T prefab;private readonly Transform container;private readonly Stack<T> pool;private readonly List<T> activeObjects;public ObjectPool(T prefab, int initialSize = 10){this.prefab = prefab;this.container = new GameObject($"Pool_{typeof(T).Name}").transform;this.pool = new Stack<T>(initialSize);this.activeObjects = new List<T>(initialSize);// 预实例化对象for (int i = 0; i < initialSize; i++){CreateNewInstance();}}private void CreateNewInstance(){var obj = GameObject.Instantiate(prefab, container);obj.gameObject.SetActive(false);pool.Push(obj);}public T Get(){if (pool.Count == 0){CreateNewInstance();}var obj = pool.Pop();obj.gameObject.SetActive(true);activeObjects.Add(obj);return obj;}public void Release(T obj){if (activeObjects.Remove(obj)){obj.gameObject.SetActive(false);pool.Push(obj);}}public void ReleaseAll(){foreach (var obj in activeObjects.ToArray()){Release(obj);}}
}// 使用示例
public class BulletPool : MonoBehaviour
{[SerializeField] private Bullet bulletPrefab;private ObjectPool<Bullet> bulletPool;private void Awake(){bulletPool = new ObjectPool<Bullet>(bulletPrefab, 20);}public void FireBullet(Vector3 position, Vector3 direction){var bullet = bulletPool.Get();bullet.transform.position = position;bullet.Initialize(direction);}
}
1.2 泛型资源管理器
资源管理是游戏开发中的另一个重要方面。使用泛型可以构建一个统一的资源加载系统:
public class ResourceManager<T> where T : UnityEngine.Object
{private readonly Dictionary<string, T> cache = new Dictionary<string, T>();private readonly string basePath;public ResourceManager(string basePath){this.basePath = basePath;}public async Task<T> LoadAsync(string path){if (cache.TryGetValue(path, out var cached)){return cached;}var fullPath = Path.Combine(basePath, path);var resource = await Resources.LoadAsync<T>(fullPath) as T;if (resource == null){Debug.LogError($"Failed to load resource: {fullPath}");return null;}cache[path] = resource;return resource;}public void Unload(string path){if (cache.TryGetValue(path, out var resource)){Resources.UnloadAsset(resource);cache.Remove(path);}}public void UnloadAll(){foreach (var resource in cache.Values){Resources.UnloadAsset(resource);}cache.Clear();}
}// 使用示例
public class GameResourceManager : MonoBehaviour
{private ResourceManager<GameObject> prefabManager;private ResourceManager<AudioClip> audioManager;private ResourceManager<Material> materialManager;private void Awake(){prefabManager = new ResourceManager<GameObject>("Prefabs");audioManager = new ResourceManager<AudioClip>("Audio");materialManager = new ResourceManager<Material>("Materials");}public async Task<GameObject> SpawnEnemyAsync(string enemyType){var prefab = await prefabManager.LoadAsync($"Enemies/{enemyType}");return Instantiate(prefab);}
}
2. 游戏数据系统
2.1 泛型数据管理器
游戏中的数据管理需要类型安全和高效的处理。使用泛型可以构建一个灵活的数据管理系统:
public class DataManager<T> where T : class, new()
{private static T instance;private readonly Dictionary<string, object> dataStore = new Dictionary<string, object>();public static T Instance{get{if (instance == null){instance = new T();}return instance;}}public void SetData<TData>(string key, TData data){dataStore[key] = data;}public TData GetData<TData>(string key, TData defaultValue = default){if (dataStore.TryGetValue(key, out var value) && value is TData data){return data;}return defaultValue;}public bool HasData(string key){return dataStore.ContainsKey(key);}public void ClearData(string key){dataStore.Remove(key);}public void ClearAll(){dataStore.Clear();}
}// 使用示例
public class GameData : DataManager<GameData>
{public PlayerStats PlayerStats { get; set; }public GameSettings Settings { get; set; }public Inventory Inventory { get; set; }
}public class PlayerStats
{public int Health { get; set; }public int MaxHealth { get; set; }public float Speed { get; set; }public int Level { get; set; }
}// 在游戏中使用
public class GameManager : MonoBehaviour
{private void Start(){// 初始化游戏数据var gameData = GameData.Instance;gameData.PlayerStats = new PlayerStats{Health = 100,MaxHealth = 100,Speed = 5f,Level = 1};// 保存临时数据gameData.SetData("CurrentLevel", 1);gameData.SetData("Score", 1000);// 读取数据var currentLevel = gameData.GetData<int>("CurrentLevel");var score = gameData.GetData<int>("Score");}
}
2.2 泛型配置系统
游戏配置系统需要支持不同类型的数据,使用泛型可以构建一个灵活的配置管理系统:
public class GameConfig<T>
{private readonly Dictionary<string, T> configs = new Dictionary<string, T>();private readonly string configPath;public GameConfig(string configPath){this.configPath = configPath;LoadConfigs();}private void LoadConfigs(){var files = Directory.GetFiles(configPath, "*.json");foreach (var file in files){var configName = Path.GetFileNameWithoutExtension(file);var json = File.ReadAllText(file);var config = JsonUtility.FromJson<T>(json);configs[configName] = config;}}public T GetConfig(string configName){if (configs.TryGetValue(configName, out var config)){return config;}throw new KeyNotFoundException($"Config not found: {configName}");}public void SaveConfig(string configName, T config){var json = JsonUtility.ToJson(config, true);var filePath = Path.Combine(configPath, $"{configName}.json");File.WriteAllText(filePath, json);configs[configName] = config;}
}// 使用示例
[Serializable]
public class EnemyConfig
{public string Name;public int Health;public float Speed;public int Damage;public string[] Abilities;
}public class GameConfigManager : MonoBehaviour
{private GameConfig<EnemyConfig> enemyConfigs;private void Awake(){enemyConfigs = new GameConfig<EnemyConfig>("Configs/Enemies");}public void SpawnEnemy(string enemyType){var config = enemyConfigs.GetConfig(enemyType);// 使用配置生成敌人Debug.Log($"Spawning enemy: {config.Name} with {config.Health} HP");}
}
3. 游戏事件系统
3.1 泛型事件总线
事件系统是游戏开发中实现模块间通信的重要工具。使用泛型可以构建一个类型安全的事件系统:
public class EventBus
{private static readonly Dictionary<Type, List<object>> eventHandlers = new Dictionary<Type, List<object>>();public static void Subscribe<T>(Action<T> handler){var eventType = typeof(T);if (!eventHandlers.ContainsKey(eventType)){eventHandlers[eventType] = new List<object>();}eventHandlers[eventType].Add(handler);}public static void Unsubscribe<T>(Action<T> handler){var eventType = typeof(T);if (eventHandlers.ContainsKey(eventType)){eventHandlers[eventType].Remove(handler);}}public static void Publish<T>(T eventData){var eventType = typeof(T);if (eventHandlers.TryGetValue(eventType, out var handlers)){foreach (var handler in handlers.ToArray()){((Action<T>)handler)(eventData);}}}
}// 使用示例
public class GameEvents
{public class PlayerDamaged{public int Damage { get; set; }public int CurrentHealth { get; set; }}public class EnemySpawned{public Vector3 Position { get; set; }public string EnemyType { get; set; }}
}public class GameEventSystem : MonoBehaviour
{private void OnEnable(){// 订阅事件EventBus.Subscribe<GameEvents.PlayerDamaged>(OnPlayerDamaged);EventBus.Subscribe<GameEvents.EnemySpawned>(OnEnemySpawned);}private void OnDisable(){// 取消订阅事件EventBus.Unsubscribe<GameEvents.PlayerDamaged>(OnPlayerDamaged);EventBus.Unsubscribe<GameEvents.EnemySpawned>(OnEnemySpawned);}private void OnPlayerDamaged(GameEvents.PlayerDamaged evt){Debug.Log($"Player took {evt.Damage} damage. Health: {evt.CurrentHealth}");}private void OnEnemySpawned(GameEvents.EnemySpawned evt){Debug.Log($"Enemy spawned at {evt.Position} of type {evt.EnemyType}");}
}
4. 游戏组件系统
4.1 泛型组件基类
Unity的组件系统可以通过泛型进行扩展,创建更强大的组件基类:
public abstract class GameComponent<T> : MonoBehaviour where T : GameComponent<T>
{private static T instance;public static T Instance{get{if (instance == null){instance = FindObjectOfType<T>();if (instance == null){var go = new GameObject(typeof(T).Name);instance = go.AddComponent<T>();DontDestroyOnLoad(go);}}return instance;}}protected virtual void Awake(){if (instance == null){instance = this as T;}else if (instance != this){Destroy(gameObject);}}
}// 使用示例
public class GameManager : GameComponent<GameManager>
{public GameState CurrentState { get; private set; }public void ChangeState(GameState newState){CurrentState = newState;// 处理状态变化}
}public class AudioManager : GameComponent<AudioManager>
{private Dictionary<string, AudioClip> audioClips = new Dictionary<string, AudioClip>();public void PlaySound(string soundName){if (audioClips.TryGetValue(soundName, out var clip)){AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position);}}
}
性能优化建议
-
对象池优化
- 预分配足够的对象
- 使用栈而不是列表存储空闲对象
- 避免频繁的GC
-
资源管理优化
- 实现资源引用计数
- 异步加载资源
- 及时释放未使用的资源
-
事件系统优化
- 使用对象池管理事件对象
- 避免在事件处理中创建垃圾
- 及时取消订阅不需要的事件
-
数据管理优化
- 使用结构体代替类存储简单数据
- 实现数据缓存机制
- 使用内存映射文件处理大型数据
常见问题与解决方案
- Q: 如何避免泛型对象池中的内存泄漏?
// 解决方案:实现IDisposable接口public class ObjectPool<T> : IDisposable where T : Component{public void Dispose(){ReleaseAll();// 清理其他资源}}
- Q: 如何处理泛型约束与Unity组件的兼容性?
// 解决方案:使用接口约束public interface IGameComponent{void Initialize();void Cleanup();}public class GameComponent<T> : MonoBehaviour where T : IGameComponent{// 实现}
- Q: 如何优化泛型事件系统的性能?
// 解决方案:使用对象池和缓存 public class EventBus {private static readonly ObjectPool<object> eventPool = new ObjectPool<object>();public static void Publish<T>(T eventData){// 使用对象池获取事件对象var pooledEvent = eventPool.Get();// 处理事件// 释放事件对象eventPool.Release(pooledEvent);} }
实战练习
练习1:实现一个泛型技能系统
创建一个支持不同类型技能效果的技能系统:
public abstract class SkillEffect<T>
{public abstract void Apply(T target);
}public class DamageEffect : SkillEffect<Enemy>
{public int Damage { get; set; }public override void Apply(Enemy target){target.TakeDamage(Damage);}
}public class HealEffect : SkillEffect<Player>
{public int HealAmount { get; set; }public override void Apply(Player target){target.Heal(HealAmount);}
}public class Skill<T>
{public string Name { get; set; }public float Cooldown { get; set; }public List<SkillEffect<T>> Effects { get; set; }public void Cast(T target){foreach (var effect in Effects){effect.Apply(target);}}
}
练习2:实现一个泛型状态机系统
创建一个可以管理任何类型状态的状态机系统:
public interface IState<T>
{void Enter(T entity);void Update(T entity);void Exit(T entity);
}public class StateMachine<T>
{private IState<T> currentState;private readonly Dictionary<Type, IState<T>> states = new Dictionary<Type, IState<T>>();public void AddState(IState<T> state){states[state.GetType()] = state;}public void ChangeState<TState>() where TState : IState<T>{currentState?.Exit(default);currentState = states[typeof(TState)];currentState?.Enter(default);}public void Update(T entity){currentState?.Update(entity);}
}// 使用示例
public class PlayerState : IState<Player>
{public void Enter(Player player) { }public void Update(Player player) { }public void Exit(Player player) { }
}public class EnemyState : IState<Enemy>
{public void Enter(Enemy enemy) { }public void Update(Enemy enemy) { }public void Exit(Enemy enemy) { }
}
总结
泛型编程在游戏开发中扮演着重要角色,通过合理使用泛型,我们可以:
- 构建高效的对象池系统
- 实现灵活的资源管理
- 创建类型安全的事件系统
- 设计可重用的组件系统
- 优化游戏性能
- 提高代码的可维护性
掌握这些泛型编程技巧,将帮助您开发出更高效、更灵活的游戏系统。
返回目录 | 继续学习:4.2 集合与LINQ深入指南
相关文章:
4.1-泛型编程深入指南
4.1 泛型编程深入指南 本节将带您深入探索C#泛型机制在游戏开发中的高级应用。通过游戏对象池、数据管理器、事件系统等实际案例,您将学习如何运用泛型构建高效、灵活的游戏系统。掌握这些知识将帮助您开发出性能更好、架构更清晰的游戏。 前置知识 在学习本节内容…...
《K230 从熟悉到...》识别机器码(AprilTag)
《K230 从熟悉到...》识别机器码(aprirltag) tag id 《庐山派 K230 从熟悉到...》 识别机器码(AprilTag) AprilTag是一种基于二维码的视觉标记系统,最早是由麻省理工学院(MIT)在2008年开发的。A…...
操作系统(二):实时系统介绍与实例分析
目录 一.概念 1.1 分类 1.2 主要指标 二.实现原理 三.主流实时系统对比 一.概念 实时系统(Real-Time System, RTS)是一类以时间确定性为核心目标的计算机系统,其设计需确保在严格的时间约束内完成任务响应。 1.1 分类 根据时间约束的严…...
虚拟电商-话费充值业务(六)话费充值业务回调补偿
一、话费充值回调业务补偿 业务需求:供应商对接下单成功后充吧系统将订单状态更改为:等待确认中,此时等待供应商系统进行回调,当供应商系统回调时说明供应商充值成功,供应商回调充吧系统将充吧的订单改为充值成功&…...
加密解密工具箱 - 专业的在线加密解密工具
加密解密工具箱 - 专业的在线加密解密工具 您可以通过以下地址访问该工具: https://toolxq.com/static/hub/secret/index.html 工具简介 加密解密工具箱是一个功能强大的在线加密解密工具,支持多种主流加密算法,包括 Base64、AES、RSA、DES…...
印度股票实时数据API接口选型指南:iTick.org如何成为开发者优选
在全球金融数字化浪潮中,印度股票市场因其高速增长潜力备受关注。对于量化交易开发者、金融科技公司而言,稳定可靠的股票报价API接口是获取市场数据的核心基础设施。本文将深度对比主流印度股票API,并揭示iTick在数据服务领域的独特优势。 一…...
使用python实现视频播放器(支持拖动播放位置跳转)
使用python实现视频播放器(支持拖动播放位置跳转) Python实现视频播放器,在我早期的博文中介绍或作为资料记录过 Python实现视频播放器 https://blog.csdn.net/cnds123/article/details/145926189 Python实现本地视频/音频播放器https://bl…...
Python星球日记 - 第2天:数据类型与变量
🌟引言: 上一篇:Python星球日记 - 第1天:欢迎来到Python星球 名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和…...
CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景
CyclicBarrier、Semaphore 和 CountDownLatch 是 Java 并发包中用于线程协作的工具类,它们虽然都与线程同步相关,但设计目的和使用场景有显著差异。以下是它们的核心区别和典型应用场景: 1. CountDownLatch 核心机制 一次性计数器…...
【愚公系列】《高效使用DeepSeek》050-外汇交易辅助
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
java短连接,长连接
在网络通信中,短连接(Short Connection)是指客户端与服务器建立连接后,仅完成一次或几次数据交互就立即断开连接的通信方式。以下是关于短链接的详细说明: 一、短链接的核心特点 连接短暂 数据传输完成后立即关闭连接…...
从零开始训练Codebook:基于ViT的图像重建实践
完整代码在文末,可以一键运行。 1. 核心原理 Codebook是一种离散表征学习方法,其核心思想是将连续特征空间映射到离散的码本空间。我们的实现方案包含三个关键组件: 1.1 ViT编码器 class ViTEncoder(nn.Module):def __init__(self, codebo…...
每日一题洛谷P8664 [蓝桥杯 2018 省 A] 付账问题c++
P8664 [蓝桥杯 2018 省 A] 付账问题 - 洛谷 (luogu.com.cn) 思路:要使方差小,那么钱不能一下付的太多,可以让钱少的全付玩,剩下还需要的钱再让钱多的付(把钱少的补上)。 将钱排序,遍历一遍&…...
蓝桥杯真题——传送阵
原题连接:蓝桥杯2024年第十五届省赛真题-传送阵 - C语言网 知识点:并查集 题目描述 小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了 n 个传送阵,进入第 i 个传送阵会被传送到第 ai 个传送阵前,并且可以随时选择…...
解释回溯算法,如何应用回溯算法解决组合优化问题?
一、回溯算法核心原理 回溯算法本质是暴力穷举的优化版本,采用"试错剪枝"策略解决问题。其核心流程如下: 路径构建:记录当前选择路径选择列表:确定可用候选元素终止条件:确定递归结束时机剪枝优化…...
opencv连接vs2015
需要改的地方: 1.debug x64 2.vc目录 包含目录:D:\softword\opencv\opencv3416\opencv\build\include 3.vc目录 库目录:D:\softword\opencv\opencv3416\opencv\build\x64\vc14\lib 4.链接器——输入:D:\softword\ope…...
用matlab搭建一个简单的图像分类网络
文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData,每个数字文件夹里包含1000张对应这个数字的图片,图片的尺寸都是 28281 像素的,如下图所示…...
移动端六大语言速记:第6部分 - 错误处理与调试
移动端六大语言速记:第6部分 - 错误处理与调试 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在错误处理与调试方面的特性,帮助开发者理解和掌握各语言的异常处理机制。 6. 错误处理与调试 6.1 异常处理 各语言异常处理的语法对比:…...
【数据库】达梦arm64安装
话不多说,快速开始~ 1.下载 进入官网: 产品下载 | 达梦在线服务平台 下载安装包。 选飞腾、鲲鹏都可以,都是arm架构的。我选择的是: 直接下载地址是https://download.dameng.com/eco/adapter/DM8/202502/dm8_20250117_HWarm920…...
QTableWidget 中insertRow(0)(头插)和 insertRow(rowCount())(尾插)的性能差异
一、目的 在 Qt 的 QTableWidget 中,insertRow(0) (头插)和 insertRow(rowCount())(尾插)在性能上存在显著差异。 二、QAbstractItemModel:: insertRows 原文解释 QAbstractItemModel Class | Qt Core 5.15.18 AI 解…...
使用MFC ActiveX开发KingScada控件(OCX)
最近有个需求,要在KingScada上面开发一个控件。 原来是用的WinCC,WinCC本身是支持调用.net控件,就是winform控件的,winform控件开发简单,相对功能也更丰富。奈何WinCC不是国产的。 话说KingScada,国产组态软…...
大模型学习二:DeepSeek R1+蒸馏模型组本地部署与调用
一、说明 DeepSeek R1蒸馏模型组是基于DeepSeek-R1模型体系,通过知识蒸馏技术优化形成的系列模型,旨在平衡性能与效率。 1、技术路径与核心能力 基础架构与训练方法 DeepSeek-R1-Zero:通过强化学习(RL)训练&…...
通过 Markdown 改进 RAG 文档处理
通过 Markdown 改进 RAG 文档处理 作者:Tableau 原文地址:https://zhuanlan.zhihu.com/p/29139791931 通过 Markdown 改进 RAG 文档处理https://mp.weixin.qq.com/s/LOBOKNA71dANXHuwxe7yxw 如何将 PDF 转换为 Markdown 以获得更好的 LLM RAG 结果 Mar…...
Java学习总结-IO流
什么IO流? 以内存为主体。input:磁盘向内存输入内容。output:内存向磁盘输入内容。 IO流的分类:...
python发送qq邮件
1.发送邮件的前提是你的qq邮箱设置能够用程序访问 这个服务点打开 就在 设置->账号 中 可以找到 # 导入 smtplib 库,用于实现 SMTP 协议,可实现邮件的发送功能 import smtplib # 从 email.mime.multipart 模块导入 MIMEMultipart 类,用…...
使用Deployment运行无状态应用
使用Deployment运行无状态应用 文章目录 使用Deployment运行无状态应用[toc]一、工作负载资源与控制器二、ReplicationController、ReplicaSet和Deployment1. ReplicationController(已淘汰)2. ReplicaSet(ReplicationController 的增强版&am…...
QT Quick(C++)跨平台应用程序项目实战教程 6 — 弹出框
目录 1. Popup组件介绍 2. 使用 上一章内容完成了音乐播放器程序的基本界面框架设计。本小节完成一个简单的功能。单击该播放器顶部菜单栏的“关于”按钮,弹出该程序的相关版本信息。我们将使用Qt Quick的Popup组件来实现。 1. Popup组件介绍 Qt 中的 Popup 组件…...
Design Compiler:库特征分析(ALIB)
相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 在使用Design Compiler时,可以对目标逻辑库进行特征分析,并创建一个称为ALIB的伪库(可以被认为是缓存)&…...
2025高频面试设计模型总结篇
文章目录 设计模型概念单例模式工厂模式策略模式责任链模式 设计模型概念 设计模式是前人总结的软件设计经验和解决问题的最佳方案,它们为我们提供了一套可复用、易维护、可扩展的设计思路。 (1)定义: 设计模式是一套经过验证的…...
41. 评论日记
越复杂的结构越脆弱,你不能因为有智驾有只能,你就全交给它了,手机永久了还发热呢,你全交给它那你要死了也怪不了谁。 这年头的手机基本都有防水,但是你天天拿着这个在泳池里玩,哪天炸了我都只能说炸的响炸的…...
Python第七章09:自定义python包.py
# 自定义python包# 从物理上看,包就是一个文件夹,在该文件夹下包含了一个_init_.py文件,该文件夹可用于包含多个模块文件 # 从逻辑上看,包的本质依然是模块 # _init_.py 标识python包,没有就是普通文件夹࿰…...
基于大模型预测升主动脉瘤的多维度诊疗研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的与意义 二、升主动脉瘤概述 2.1 定义与分类 2.2 发病原因与机制 2.3 流行病学现状 三、大模型技术原理及应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用进展 3.3 针对升主动脉瘤预测的独特价值 四、术前大模型预测方案…...
Lua中table函数使用详解
目录 1. table.concat(list [, sep [, i [, j]]])2. table.insert(list, [pos,] value)3. table.move(src, a, b, dest [, dest_pos]) (Lua 5.3)4. table.pack(...) (Lua 5.2)5. table.remove(list [, pos])6. table.sort(list [, comp])7. table.unpack(list [, i [, j]])总结…...
如何在Windows上找到Python安装路径?两种方法快速定位
原文:如何在Windows上找到Python安装路径?两种方法快速定位 | w3cschool笔记 在 Windows 系统上找到 Python 的安装路径对于设置环境变量或排查问题非常重要。本文将介绍两种方法,帮助你找到 Python 的安装路径:一种是通过命令提…...
图形库 EasyX - EasyX 初识(EasyX 概述、EasyX 下载与安装、打开一个窗口、打开一个彩色窗口、绘制简易图形、输出文字)
一、EasyX 概述 EasyX 是一款专为 C 开发者设计的轻量级图形库,主要面向 Windows 平台,它有如下特点 EasyX 的 API 设计简洁直观,易学易用,绘图效果所见即所得 二、EasyX 下载与安装 1、EasyX 下载 官方网址:https…...
《深度探秘:SQL助力经典Apriori算法实现》
在数据的广袤世界里,隐藏着无数有价值的信息,等待着我们去挖掘和发现。关联规则挖掘算法,作为数据挖掘领域的关键技术,能够从海量数据中找出事物之间潜在的关联关系,为商业决策、学术研究等诸多领域提供有力支撑。其中…...
AVR128单片机红外遥控8*8LED点阵屏显示
1)将接收到的红外解码信号用LCD液晶显示屏显示。 2)将接收到的5种红外解码信号分别控制88的液晶点阵屏MATRIX-88-GREEN (颜色可以自定)进行不同的显示:整行从上到下、从下到上轮流显示;整列从左到右、从右到左轮流显示;…...
前端Uniapp接入UviewPlus详细教程!!!
相信大家在引入UviewPlusUI时遇到很头疼的问题,那就是明明自己是按照官网教程一步一步的走,为什么到处都是bug呢?今天我一定要把这个让人头疼的问题解决了! 1.查看插件市场 重点: 我们打开Dcloud插件市场搜素uviewPl…...
【c++深入系列】:类与对象详解(中)
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 不是因为看到希望才坚持,而是坚持了才能看到希望 那么上一篇博客我讲解了什么是类和对象以及类和对象是怎么定义的࿰…...
【Linux】远程登录时,使用图形界面报错:MoTTY X11 proxy: Unsupported authorisation protocol
1、问题描述 使用 MobaXterm 远程登录Ubuntu后,使用sudo权限运行图形界面程序报错: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服务端配置,…...
作用域与上下文:JavaScript魔法森林探秘
在JavaScript的魔法森林里,作用域和上下文是两位神秘的守护者,它们掌控着代码的逻辑流向和变量的生杀大权。今天,就让我们一起踏入这片神奇的土地,揭开全局作用域、函数作用域和闭包的神秘面纱,看它们如何影响我们的代…...
虚拟电商-话费充值业务(五)充值成功逻辑和网络异常重试逻辑
一、网络异常重试逻辑编写 如果在对接供应商的过程中出现了网络异常,我们需要做一个补偿机制,在任务类型枚举类:TaskTypeEnum中有一种业务状态码是针对远程调用失败的 步骤一:在对接供应商的方法:SupplierServiceImp…...
42.评论日记
怎么看待算命? 我能算到你今晚睡觉前会上一次厕所。 你可以选择相信我算的内容,也可以不信。 你也可以有感觉要上厕所的时候不去拉兜里。 也可以选择相信,早早的拿好纸做准备。 你今晚可能不止上一次,也可能今晚没吃没喝早早…...
MTK-GMS版本国内WIFI受限问题
MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品,出现WIFI受限显示,但是网络是通畅的。 GMS 版本,在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…...
C# System.Text.Json 中 JsonConverter 使用详解
总目录 前言 在 C# 开发中,System.Text.Json 是一个高性能的 JSON 处理库,广泛用于序列化和反序列化对象。当默认的序列化行为无法满足需求时,JsonConverter 提供了强大的自定义能力。本文将详细讲解 JsonConverter 的使用方法,帮…...
Leetcode 857 -- 贪心 | 数学
题目描述 雇佣 K 名工人的最低成本 思路 参考官方题解和这里。 代码1(正确) class Solution { public:double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k) {int n wage.size();double res 0, totalq …...
基于 SpringBoot 的社区维修平台
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
maven项目添加第三方JAR包
项目开发过程中,不可避免的需要用到一些maven库(公共库、司库等)中没有的冷门jar包依赖,这时,可以将这些第三方JAR包安装到本地maven仓库中,实现项目依赖的一致性。具体步骤如下: 1、下载jar包 …...
C#:接口(interface)
目录 接口的核心是什么? 1. 什么是接口(Interface),为什么要用它? 2. 如何定义和使用接口? 3.什么是引用接口? 如何“引用接口”? “引用接口”的关键点 4. 接口与抽象类的区…...
c#和c++脚本解释器科学运算
说明: 我希望用c#和c写一个脚本解释器,用于科学运算 效果图: step1: c# C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs using System; using System.Collections.Generic; using System.Data; using System.Tex…...