当前位置: 首页 > news >正文

unity 保存场景功能 可以保存运行时候地形变化和动态生成得物体,点击加载进来后可以继续上次退出时得场景

直接上代码了

using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;[System.Serializable]
public class TerrainSaveData
{public int heightmapResolution;public float terrainWidth;public float terrainLength;public float terrainHeight;// 改为使用一维数组和尺寸信息来存储高度图public float[] heightmapDataFlat;public int heightmapSizeX;public int heightmapSizeY;
}[System.Serializable]
public class DynamicObjectData
{public string prefabName;public Vector3 position;public Quaternion rotation;public Vector3 scale;
}[System.Serializable]
public class SceneSaveData
{public TerrainSaveData terrainData;public List<DynamicObjectData> dynamicObjects = new List<DynamicObjectData>();
}public class SceneSaveLoadSystem : MonoBehaviour
{public Terrain terrain;public TerrainEditor terrainEditor; // 引用您的地形编辑器public string saveFileName = "terrainSave";[Header("UI References")]public InputField saveNameInput;public Button saveButton;public Button loadButton;// public Text statusText;private void Start(){if (saveButton != null) saveButton.onClick.AddListener(SaveTerrain);if (loadButton != null) loadButton.onClick.AddListener(LoadTerrain);}public void SaveTerrain(){try{if (terrain == null){throw new NullReferenceException("terrain引用未设置");}SceneSaveData saveData = new SceneSaveData();// 保存地形数据saveData.terrainData = SaveTerrainData();// 添加这行:保存动态物体SaveDynamicObjects(saveData); // <-- 这是关键修复// 检查数据有效性if (saveData.terrainData.heightmapDataFlat == null){throw new Exception("高度图数据为空");}if (saveData.dynamicObjects == null){throw new Exception("动态物体列表为空");}string jsonData = JsonUtility.ToJson(saveData, true);string savePath = Path.Combine(Application.persistentDataPath, GetSaveFileName() + ".json");Directory.CreateDirectory(Path.GetDirectoryName(savePath));File.WriteAllText(savePath, jsonData);Debug.Log($"保存成功,动态物体数量: {saveData.dynamicObjects.Count}");UpdateStatus($"场景已保存,包含 {saveData.dynamicObjects.Count} 个动态物体");}catch (Exception e){Debug.LogError($"保存失败: {e.Message}\n{e.StackTrace}");UpdateStatus($"保存失败: {e.Message}");}}public void LoadTerrain(){string fileName = GetSaveFileName();string savePath = Path.Combine(Application.persistentDataPath, fileName + ".json");Debug.Log($"正在从路径加载: {savePath}");// 检查文件是否存在且非空if (!File.Exists(savePath)){Debug.LogError($"文件不存在: {savePath}");UpdateStatus("错误: 存档文件不存在");return;}if (new FileInfo(savePath).Length == 0){Debug.LogError($"文件为空: {savePath}");UpdateStatus("错误: 存档文件为空");return;}try{string jsonData = File.ReadAllText(savePath);Debug.Log($"读取的JSON数据(前100字符): {jsonData.Substring(0, Math.Min(100, jsonData.Length))}");SceneSaveData saveData = JsonUtility.FromJson<SceneSaveData>(jsonData);// 详细检查反序列化结果if (saveData == null){throw new Exception("反序列化失败,saveData为null");}if (saveData.terrainData == null){throw new Exception("地形数据为null");}if (saveData.terrainData.heightmapDataFlat == null){throw new Exception("高度图数据为null");}Debug.Log($"即将加载地形数据,分辨率: {saveData.terrainData.heightmapResolution}");// 确保地形引用有效if (terrain == null || terrain.terrainData == null){throw new Exception("地形引用无效");}LoadTerrainData(saveData.terrainData);LoadDynamicObjects(saveData);UpdateStatus($"场景已从 {fileName} 加载成功");}catch (Exception e){Debug.LogError($"加载失败: {e.GetType()} - {e.Message}\n堆栈跟踪:\n{e.StackTrace}");UpdateStatus($"加载失败: {e.Message}");}}private TerrainSaveData SaveTerrainData(){TerrainData tData = terrain.terrainData;int resolution = tData.heightmapResolution;float[,] heights = tData.GetHeights(0, 0, resolution, resolution);// 将二维数组转换为一维数组float[] flatHeights = new float[resolution * resolution];for (int y = 0; y < resolution; y++){for (int x = 0; x < resolution; x++){flatHeights[y * resolution + x] = heights[x, y];}}return new TerrainSaveData{heightmapResolution = resolution,heightmapDataFlat = flatHeights,heightmapSizeX = resolution,heightmapSizeY = resolution,terrainWidth = tData.size.x,terrainLength = tData.size.z,terrainHeight = tData.size.y};}private void LoadTerrainData(TerrainSaveData terrainData){TerrainData tData = terrain.terrainData;// 验证数据if (terrainData.heightmapDataFlat == null || terrainData.heightmapDataFlat.Length == 0){throw new Exception("高度图数据为空");}int targetResolution = tData.heightmapResolution;float[,] heights;// 如果分辨率匹配if (targetResolution == terrainData.heightmapResolution){heights = new float[targetResolution, targetResolution];for (int y = 0; y < targetResolution; y++){for (int x = 0; x < targetResolution; x++){heights[x, y] = terrainData.heightmapDataFlat[y * targetResolution + x];}}}else{// 分辨率不匹配时需要重新采样heights = ResampleHeightmap(terrainData);}tData.SetHeights(0, 0, heights);}private float[,] ResampleHeightmap(TerrainSaveData terrainData){int sourceRes = terrainData.heightmapResolution;int targetRes = terrain.terrainData.heightmapResolution;float[,] result = new float[targetRes, targetRes];float ratio = (float)sourceRes / targetRes;for (int y = 0; y < targetRes; y++){for (int x = 0; x < targetRes; x++){float srcX = x * ratio;float srcY = y * ratio;int x1 = Mathf.FloorToInt(srcX);int y1 = Mathf.FloorToInt(srcY);int x2 = Mathf.Min(x1 + 1, sourceRes - 1);int y2 = Mathf.Min(y1 + 1, sourceRes - 1);// 双线性插值float fx = srcX - x1;float fy = srcY - y1;float h11 = terrainData.heightmapDataFlat[y1 * sourceRes + x1];float h21 = terrainData.heightmapDataFlat[y1 * sourceRes + x2];float h12 = terrainData.heightmapDataFlat[y2 * sourceRes + x1];float h22 = terrainData.heightmapDataFlat[y2 * sourceRes + x2];result[x, y] = Mathf.Lerp(Mathf.Lerp(h11, h21, fx),Mathf.Lerp(h12, h22, fx),fy);}}return result;}private float[,] ResampleHeightmap(float[,] source, int sourceSize, int targetSize){float[,] result = new float[targetSize, targetSize];float ratio = (float)sourceSize / targetSize;for (int y = 0; y < targetSize; y++){for (int x = 0; x < targetSize; x++){float srcX = x * ratio;float srcY = y * ratio;int x1 = Mathf.FloorToInt(srcX);int y1 = Mathf.FloorToInt(srcY);int x2 = Mathf.Min(x1 + 1, sourceSize - 1);int y2 = Mathf.Min(y1 + 1, sourceSize - 1);// 双线性插值float fx = srcX - x1;float fy = srcY - y1;result[x, y] = Mathf.Lerp(Mathf.Lerp(source[x1, y1], source[x2, y1], fx),Mathf.Lerp(source[x1, y2], source[x2, y2], fx),fy);}}return result;}private void SaveDynamicObjects(SceneSaveData saveData){GameObject[] dynamicObjects = GameObject.FindGameObjectsWithTag("DynamicObject");foreach (var obj in dynamicObjects){saveData.dynamicObjects.Add(new DynamicObjectData{prefabName = GetPrefabName(obj),position = obj.transform.position,rotation = obj.transform.rotation,scale = obj.transform.localScale});}}private void LoadDynamicObjects(SceneSaveData saveData){// 先清除现有动态物体GameObject[] existingObjects = GameObject.FindGameObjectsWithTag("DynamicObject");foreach (var obj in existingObjects){Destroy(obj);}// 重新生成保存的动态物体foreach (var objData in saveData.dynamicObjects){// 实际项目中应该从资源管理系统加载预制体var prefab = Resources.Load<GameObject>("ModePrefab/" + objData.prefabName);if (prefab != null){var newObj = Instantiate(prefab, objData.position, objData.rotation);newObj.transform.localScale = objData.scale;newObj.tag = "DynamicObject";}}}private string GetPrefabName(GameObject obj){// 简化版本 - 实际项目中可能需要更复杂的逻辑return obj.name.Replace("(Clone)", "").Trim();}private string GetSaveFileName(){return string.IsNullOrEmpty(saveNameInput?.text) ? saveFileName : saveNameInput.text;}private void UpdateStatus(string message){//   if (statusText != null) statusText.text = message;Debug.Log(message);}// 编辑器快捷方式
#if UNITY_EDITOR[ContextMenu("Quick Save")]private void QuickSave(){SaveTerrain();}[ContextMenu("Quick Load")]private void QuickLoad(){LoadTerrain();}
#endif// 修改后的动态物体生成方法public GameObject SpawnDynamicObject(GameObject prefab, Vector3 position){if (prefab == null) return null;GameObject newObj = Instantiate(prefab, position, Quaternion.identity);newObj.tag = "DynamicObject"; // 确保设置标签newObj.name = prefab.name; // 保持名称一致// 添加唯一标识组件(可选)if (!newObj.GetComponent<DynamicObjectID>()){newObj.AddComponent<DynamicObjectID>();}return newObj;}// 唯一标识组件public class DynamicObjectID : MonoBehaviour{public string originalPrefabName;void Awake(){originalPrefabName = gameObject.name.Replace("(Clone)", "").Trim();}}
}
```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1052b5a6087d40c8ad2bc2eb8a957754.png)还有地形编辑脚本```csharp```csharp
using UnityEngine;
using UnityEngine.EventSystems; // 添加这个命名空间public class TerrainEditor : MonoBehaviour
{public Terrain terrain; // 地形对象public float strength = 0.01f; // 拉伸强度public float brushSize = 10f; // 笔刷大小public bool useCircleBrush = true; // 是否使用圆形笔刷void Update(){// 检查鼠标是否在UI上if (EventSystem.current.IsPointerOverGameObject()){return; // 如果在UI上,则不执行地形编辑}// 鼠标左键提升地形,右键降低地形if (Input.GetMouseButton(0)){EditTerrain(true); // 提升地形}else if (Input.GetMouseButton(1)){EditTerrain(false); // 降低地形}// 使用鼠标滚轮调整笔刷大小float scroll = Input.GetAxis("Mouse ScrollWheel");if (scroll != 0){brushSize += scroll * 5f;brushSize = Mathf.Clamp(brushSize, 1f, 50f);Debug.Log("Brush Size: " + brushSize);}// 按 B 键切换笔刷形状if (Input.GetKeyDown(KeyCode.B)){useCircleBrush = !useCircleBrush;Debug.Log("Brush Shape: " + (useCircleBrush ? "Circle" : "Square"));}}void EditTerrain(bool raise){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){if (hit.collider.GetComponent<Terrain>()){// 将鼠标点击的世界坐标转换为地形局部坐标Vector3 terrainPos = hit.point - terrain.transform.position;int x = (int)(terrainPos.x / terrain.terrainData.size.x * terrain.terrainData.heightmapResolution);int y = (int)(terrainPos.z / terrain.terrainData.size.z * terrain.terrainData.heightmapResolution);// 计算笔刷范围int size = (int)brushSize;int offsetX = x - size / 2;int offsetY = y - size / 2;// 检查边界,确保不会超出地形范围offsetX = Mathf.Clamp(offsetX, 0, terrain.terrainData.heightmapResolution - size);offsetY = Mathf.Clamp(offsetY, 0, terrain.terrainData.heightmapResolution - size);// 获取当前高度图数据float[,] heights = terrain.terrainData.GetHeights(offsetX, offsetY, size, size);// 修改高度图数据for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){// 计算当前点到笔刷中心的距离float distance = Mathf.Sqrt((i - size / 2) * (i - size / 2) + (j - size / 2) * (j - size / 2));// 如果是圆形笔刷且距离大于半径,则跳过if (useCircleBrush && distance > size / 2){continue;}// 根据 raise 参数提升或降低地形if (raise){heights[i, j] += strength * Time.deltaTime;}else{heights[i, j] -= strength * Time.deltaTime;}heights[i, j] = Mathf.Clamp01(heights[i, j]);}}// 应用修改后的高度图数据terrain.terrainData.SetHeights(offsetX, offsetY, heights);}}}
}

相关文章:

unity 保存场景功能 可以保存运行时候地形变化和动态生成得物体,点击加载进来后可以继续上次退出时得场景

直接上代码了 using System; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI;[System.Serializable] public class TerrainSaveData {public int heightmapResolution;public float terrainWidth;public float terrainLength;p…...

光谱相机的关键技术参数

光谱相机的关键技术参数直接影响其数据获取能力和应用场景适配性。以下是核心参数的详细解析&#xff0c;涵盖光谱性能、空间性能、硬件性能及环境适应性&#xff1a; 一、光谱性能参数‌ ‌1. 光谱范围&#xff08;Spectral Range&#xff09;‌ ‌定义‌&#xff1a;相机可…...

Linux系统管理与编程12: FTP服务配置

(本实验在CentOS7/8上完成&#xff0c;OpenEuler上暂时未实现) 兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1 实验目标 1)理解FTP服务器原理 2) 掌握FTP服务器的配置文件 3)具备安装部署VSFTP的能力 4) 具备FTP的故障排除能…...

乐观锁与悲观锁的使用场景

悲观锁的应用场景 悲观锁的基本思想是假设并发冲突会发生&#xff0c;因此在操作数据时会先锁定数据&#xff0c;直到完成操作并提交事务后才释放锁。这种方式适用于写操作较多、并发冲突可能性较高的场景。 高写入比例的数据库操作&#xff1a;如果系统中有很多写操作&#x…...

金融级隐私安全之DeepSeek R1 模型去中心化存储和推理实现方案

目录 DeepSeek R1 进入去中心化存储网络意味着什么? 它是如何工作的? Atoma、Walrus和 Sui Atoma Network 已成功将 DeepSeek R1 670B 参数推理模型上传到 Walrus 去中心化存储网络。这标志着这种规模的模型首次在去中心化存储层上可用,确保无需依赖中心化基础设施即可实…...

基于django大数据平台的交通数据可视化设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;基于大数据平台的交通数据可视化系统当然不能排除在外。基于大数据平台的交通数据可视化系统是在实际应用和软件工程的开发原理之上&#…...

STM32 vs ESP32:如何选择最适合你的单片机?

引言 在嵌入式开发中&#xff0c;STM32 和 ESP32 是两种最热门的微控制器方案。但许多开发者面对项目选型时仍会感到困惑&#xff1a;到底是选择功能强大的 STM32&#xff0c;还是集成无线的 ESP32&#xff1f; 本文将通过 硬件资源、开发场景、成本分析 等多维度对比&#xf…...

柳宗元经典的10首唐诗

1、最孤独的诗&#xff1a;《江雪》 江雪 千山鸟飞绝&#xff0c;万径人踪灭。 孤舟蓑笠翁&#xff0c;独钓寒江雪。 这首诗被誉为“唐诗五绝最佳”之作。 富于理想的“永贞革新”失败后&#xff0c;柳宗元被贬永州&#xff0c;母亲也在半年后离世。年届三十&#xff0c;政…...

Windows11介绍(中英文版)

一、Windows 11 的发布背景与发展历程 Windows 11 是微软公司推出的一款重要的操作系统&#xff0c;它是 Windows 操作系统系列的最新版本之一。微软在操作系统领域拥有悠久的历史和丰富的经验&#xff0c;从早期的 Windows 95 开启了图形化操作系统的新时代&#xff0c;到 Wi…...

使用 VSCode 本地历史记录‌恢复误删除文件

vsCode未知操作意外删除项目根目录入口代码文件 使用vsCode多年&#xff0c; 第一次遇见这种情况&#xff0c; 只是下载了几个插件&#xff0c; 可能打开的窗口太多&#xff0c; 有几个代码版本比对的页面&#xff0c; 在没有察觉的时候&#xff0c; 意外删除了项目根目…...

前端面试宝典---数据类型

基本数据类型 对于基本类型在创建时无需使用 new 关键字 Bigint在实际开发不常用&#xff0c;如果对于精度要求高可以使用第三方库&#xff0c;如decimal.js 基本数据类型介绍 undefined&#xff1a;当变量被声明但未赋值&#xff0c;或者函数没有返回值时&#xff0c;就会呈现…...

Dinky 和 Flink CDC 在实时整库同步的探索之路

摘要&#xff1a;本文整理自 Dinky 社区负责人&#xff0c;Apache Flink CDC contributor 亓文凯老师在 Flink Forward Asia 2024 数据集成&#xff08;二&#xff09;专场中的分享。主要讲述 Dinky 的整库同步技术方案演变至 Flink CDC Yaml 作业的探索历程&#xff0c;并深入…...

【Proteus仿真】【32单片机-A008】MPX4115压力检测系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、压力检测与LCD显示 2、超过上限&#xff0c;降压模块启动 3、压力检测范围15kpa-115kpa 4、压力阈值设置 5、超限报警 二、使用步骤 系统运行后&#xff0c;LCD160…...

银河麒麟系统虚拟机网络ping不通的解决方法

问题描述&#xff1a;使用NAT模式搭建了银河麒麟系统虚拟主机&#xff0c;虚拟机内部可以联网&#xff0c;可以查询到具体的ip地址&#xff0c;同时也可以在虚拟机内部ping同宿主机ip&#xff0c;但使用宿主机却无法ping同银河麒麟虚拟机ip&#xff0c;使用ssh、ftp、sftp等工具…...

spark数据清洗案例:流量统计

一、项目背景 在互联网时代&#xff0c;流量数据是反映用户行为和业务状况的重要指标。通过对流量数据进行准确统计和分析&#xff0c;企业可以了解用户的访问习惯、业务的热门程度等&#xff0c;从而为决策提供有力支持。然而&#xff0c;原始的流量数据往往存在格式不规范、…...

关于AIGC stable diffusion 在图像超分上的算法整理

参考文档&#xff1a; c论文阅读基于Stable Diffusion的图像超分 - 知乎 十分钟读懂Stable Diffusion运行原理 - 知乎 1.difussion model 扩散模型的基本原理 diffusion model 扩散模型是一类生成模型的统称&#xff0c;基于扩散过程生成数据。这类模型的核心是通过逐步加噪…...

Stable Diffusion ComfyUI 基础教程(一) ComfyUI安装与常用插件

前言&#xff1a; 相信大家玩 Stable Diffusion&#xff08;以下简称SD&#xff09;都是用的 web UI 操作界面吧&#xff0c;不知道有没有小伙伴听说过 ComfyUI。ComfyUI 是 一个基于节点流程的 Stable Diffusion 操作界面&#xff0c;可以通过流程&#xff0c;实现了更加精准…...

[leetcode]差分算法

一.差分算法性质 1.1计算差分数组&#xff1a; b[i] a[i] - a[i - 1] 1.2差分数组的性质 1.2.1对差分数组的每一项作前缀和&#xff0c;可以得到原来的数组 ai ​a1​∑j1i−1​dj​ 1.2.2将差分数组的某一项加i,那么其后面的所有项都会相对于原数组加i 让2~4项加3 这个第三…...

大数据技术之SPARK

Spark Core 什么是 RDD 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性&#xff1a;内存与磁盘的自动切换&#xff1b; 容错的弹性&#xff1a;数据丢失可以自动恢复&#xff1b; 计算的弹性&#xff1a;…...

S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域

在开发平台软件的时候代码中超出了64K的内存&#xff0c;单纯在ld文件中&#xff0c;增加m_data_2的存储长度&#xff0c;原先是0x00007000,我将长度修改为0x00008000,起始地址还是0x20000000,软件编译没有报错堆栈超出&#xff0c;但是软件下载到单片机中之后&#xff0c;144不…...

Spyder、PyCharm、VS Code 和 Jupyter Notebook 对比分析

在进行 Python 编程时&#xff0c;Spyder、PyCharm、VS Code 和 Jupyter Notebook 是最常用的几款开发工具&#xff08;IDE/编辑器&#xff09;。以下是它们在不同维度下的对比分析 &#x1f527; 一、基础介绍 软件类型主要特点Spyder科学计算IDE类似 MATLAB&#xff0c;集成…...

vue3腾讯云直播 前端拉流(前端页面展示直播)

1、引入文件&#xff0c;在index.html <link href"https://tcsdk.com/player/tcplayer/release/v5.3.2/tcplayer.min.css" rel"stylesheet" /><!--播放器脚本文件--><script src"https://tcsdk.com/player/tcplayer/release/v5.3.2/t…...

应急物资仓库管理系统|基于GAV仓库管理的应用

基于AGV应用的应急物资管理系统(智物资DW-S300)建设的目标是实现应急物资管理的信息化、智能化、规范化,保证应急物资的安全性和使用时的高效性&#xff0c;做到应急物资可追踪、可溯源。 构建一个应急物资仓储管理系统实现包括系统基本信息管理、入库管理、出库管理、筹措管理…...

ArkTS语言入门之接口、泛型、空安全、特殊运算符等

前言 臭宝们&#xff0c;今天我们来学习ArkTS中最后的一些内容。 实现接口 包含implements子句的类必须实现列出的接口中定义的所有方法&#xff0c;但使用默认实现定义的方法除外。 interface DateInterface {now(): string; } class MyDate implements DateInterface {no…...

蓝桥杯c++每日刷题(洛谷)

目录 P10385 [蓝桥杯 2024 省 A] 艺术与篮球 - 洛谷 (luogu.com.cn) P8706 [蓝桥杯 2020 省 AB1] 解码 - 洛谷 (luogu.com.cn) P8711 [蓝桥杯 2020 省 B1] 整除序列 - 洛谷 (luogu.com.cn) P8722 [蓝桥杯 2020 省 AB3] 日期识别 - 洛谷 (luogu.com.cn) P10385 [蓝桥杯 2024…...

Python+Requests 企业级接口测试入门(1~3天)

PythonRequests 企业级接口测试入门 1、GET接口简单案例 我的答案&#xff1a; import time import requestsdef get_all_users():try:response requests.get(urlhttps://reqres.in/api/users, #接口地址timeout10 #超时时间)respons…...

【android bluetooth 框架分析 01】【关键线程 3】【bt_jni_thread 线程介绍】

1. bt_jni_thread 职责介绍 bt_jni_thread 这个线程的作用是专门负责处理蓝牙 JNI 层的消息循环&#xff0c;也可以说是 C 层和 Java 层交互的桥梁线程。 1.1 什么是 JNI 层&#xff1f;为什么需要这个线程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …...

CCF - GESP Python三级考试题目示例

CCF - GESP Python三级考试题目示例&#xff0c;你可以根据实际需求进行调整。 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 以下关于Python中函数的说法&#xff0c;错误的是&#xff08; &#xff09; A. 函数定义使用def关键字 B. 函数必须有返回值 C.…...

Windows10系统更改盘符

Windows10系统更改盘符 导航 文章目录 Windows10系统更改盘符导航更改盘符 更改盘符 按下wini,再按k进入磁盘管理器 右击你想更改的磁盘&#xff0c;选择“更改驱动器号”和路径&#xff0c;选择好驱动器号后确定即可...

软件功能性测试有多重要?功能性测试工具有哪些?

软件功能性测试是指对软件应用程序进行的测试&#xff0c;旨在验证软件的每一个功能是否按预定要求正常运作。功能性测试通常基于软件的需求文档&#xff0c;从用户的角度出发&#xff0c;确保所有功能都能够满足用户的需求。 软件功能性测试在软件开发生命周期中扮演着至关重…...

未来生态映像:杭州的科技自然协奏曲

故事背景 故事发生在2050年的中国杭州&#xff0c;这座千年古城已蜕变为科技与自然完美交融的未来生态之城。从晨曦微露的西湖到暮色中的良渚文化村&#xff0c;每个角落都上演着人类智慧与自然韵律的动人对话。 故事摘要 当第一缕阳光亲吻西湖的生态浮岛&#xff0c;无人机携带…...

电商核心指标解析与行业趋势:数据驱动的增长策略【大模型总结】

电商核心指标解析与行业趋势&#xff1a;数据驱动的增长策略 在电商领域&#xff0c;数据是决策的核心。从流量监测到用户行为分析&#xff0c;从价格策略到技术赋能&#xff0c;每一个环节的优化都离不开对核心指标的深度理解。本文结合行业最新趋势与头部平台实践&#xff0…...

ubuntu自动更新--unattended-upgrades

ubuntu自动更新--unattended-upgrades 1 介绍2 发展历程3 配置与使用4 disable Auto update服务命令 参考 1 介绍 Unattended-Upgrades 是一个用于自动更新 Debian 及其衍生系统&#xff08;如 Ubuntu&#xff09;的工具。它的主要功能是自动检查、下载并安装系统更新&#xf…...

在Ubuntu 22.04上配置【C/C++编译环境】

在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序&#xff0c;首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤&#xff0c;帮助你快速搭建开发环境。 准备工作 在开始之前&#xff0c;确保你的系统可以通过终…...

费马小定理

快速幂 理论 a n a a ⋯ a a^n a a \cdots a anaa⋯a&#xff0c;暴力的计算需要 O(n) 的时间。 快速幂使用二进制拆分和倍增思想&#xff0c;仅需要 O(logn) 的时间。 对 n 做二进制拆分&#xff0c;例如&#xff0c; 3 13 3 ( 1101 ) 2 3 8 ⋅ 3 4 ⋅ 3 1 3^{13}…...

什么是音频预加重与去加重,预加重与去加重的原理是什么,在什么条件下会使用预加重与去加重?

音频预加重与去加重是音频处理中的两个重要概念&#xff0c;以下是对其原理及应用条件的详细介绍&#xff1a; 1、音频预加重与去加重的定义 预加重&#xff1a;在音频信号的发送端&#xff0c;对音频信号的高频部分进行提升&#xff0c;增加高频信号的幅度&#xff0c;使其在…...

程序代码篇---时间复杂度空间复杂度

文章目录 前言一、时间复杂度&#xff08;Time Complexity&#xff09;定义1. 常见时间复杂度类型2. 计算规则忽略常数项保留最高阶项循环嵌套递归算法 3. 代码示例&#xff08;1&#xff09;&#x1d442;(1)&#xff1a;常数时间&#xff08;2&#xff09;&#x1d442;(&…...

化工企业数字化转型:从数据贯通到生态重构的实践路径

一、战略定位&#xff1a;破解行业核心痛点 化工行业面临生产安全风险高&#xff08;全国危化品企业事故率年增5%&#xff09;、能耗与排放压力大&#xff08;占工业总能耗12%&#xff09;、供应链协同低效&#xff08;库存周转率低于制造业均值30%&#xff09;三大挑战。《石…...

Mysql备忘记录

1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…...

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…...

【Proteus仿真】【32单片机-A009】矩阵按键系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、按键值与LCD显示 2、矩阵按键 二、使用步骤 系统运行后&#xff0c;LCD1602显示当前的按键值&#xff1b; 当按下不同按键后显示屏更新对应的按键值。 三、硬件资…...

【11408学习记录】英语语法精析:主从复合句之定语从句完全指南——从规则到实战例句一网打尽

定语从句 英语语法总结——主从复合句定语从句定语从句的写法先行词的作用分类定语从句的使用补充 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a;断开第三步&#xff1a;简化第一句第二句第三句第四句 英语 语法总结——主从复合句 定语从句 定语从句就是一个句子…...

go游戏后端开发31:麻将游戏的碰牌与胡牌逻辑

以下是润色后的版本&#xff1a; 1. 碰牌逻辑 1.1 触发碰牌 当一个玩家弃牌后&#xff0c;其他玩家可以选择碰牌。如果当前玩家决定碰牌&#xff0c;系统需要通知所有玩家这一操作。碰牌操作完成后&#xff0c;当前玩家需要出一张牌&#xff0c;系统同样需要通知所有玩家。 …...

vLLM实战:多机多卡大模型分布式推理部署全流程指南

1. 环境准备与基础配置 1.1 系统要求 依赖组件&#xff1a; # 基础工具安装 sudo apt-get install -y lsof git-lfs nvidia-cuda-toolkit1.2 虚拟环境配置 使用conda创建隔离环境&#xff0c;避免依赖冲突&#xff1a; conda create -n vllm python3.10 -y conda activate…...

RAI Toolbox详解

RAI Toolbox详解 摘要 RAI Toolbox是一个综合性的工具集&#xff0c;旨在帮助开发者和AI系统利益相关者更负责任地开发和监控AI系统&#xff0c;并做出更好的数据驱动决策。本文将详细介绍RAI Toolbox的功能、使用场景以及与类似AI项目的对比&#xff0c;帮助读者全面了解RAI…...

Python高级爬虫之js逆向+安卓逆向1.3节:Python数据类型

目录 引言&#xff1a; 1.3.1 两大数据类型 1.3.2 不可变数据类型 1.3.3 可变数据类型 1.3.4 再不跳槽就老了 引言&#xff1a; 大神薯条老师的高级爬虫安卓逆向教程&#xff1a; 这套爬虫教程会系统讲解爬虫的初级&#xff0c;中级&#xff0c;高级知识&#xff0c;涵盖…...

The 2024 CCPC National Invitational Contest (Changchun),第17届吉林省赛 C

补题链接 题解是什么意思呢&#xff0c;首先我们需要知道的是&#xff0c;斐波那契数列可以用矩阵快速幂和矩阵乘法求解 ( F ( n 1 ) F ( n ) ) ( 1 1 1 0 ) ( F ( n ) F ( n − 1 ) ) M ( F ( n ) F ( n − 1 ) ) \begin{pmatrix}F(n1) \\ F(n)\end{pmatrix} \begin{pma…...

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天&#xff0c;智创聚合API率先突破多模态创作边界&#xff0c;正式发布集成GPT-4o-image模型的创作平台&#xff0c;以“文生图-图生图-循环编辑”三位一体的技术矩阵&#xff0c;重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…...

Java流程控制【if分支三种形式】

if分支三种形式 ①if(条件表达式) 代码&#xff1b; }②if(条件表达式){ 代码1&#xff1b; }else{ 代码2&#xff1b; }③if(条件表达式1){ 代码1&#xff1b; }else if(条件表达式2){ 代码2&#xff1b; }else if(条件表达式3){ 代码3&#xff1b;...... }else{ 代码n&#…...

2025 年陕西消防设施操作员考试攻略:历史文化名城的消防传承与创新​

陕西拥有丰富的历史文化遗产&#xff0c;众多古建筑分布其中&#xff0c;同时也在不断推进现代化建设&#xff0c;消防工作面临传承与创新的双重任务&#xff0c;这在考试中也有所体现。​ 考点融合与特色&#xff1a;一方面&#xff0c;古建筑的消防保护是重点&#xff0c;包…...