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

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24
关于游戏中文件输入输出(IO)操作的讨论。主要分为两类:

  1. 只读资产的加载

    • 这部分主要涉及游戏中用于展示和运行的只读资源,例如音乐、音效、美术资源(如 3D 模型和纹理)等。
    • 这些文件从磁盘加载到内存中供游戏使用,但不会被修改。
    • 在现代游戏中,这些数据可能非常庞大(数千兆字节),通常通过后台流式加载的方式避免加载屏幕过长,从而提升用户体验。
  2. 游戏状态的保存和加载

    • 这部分与游戏配置和进度相关,例如窗口模式设置、声音音量设置、解锁状态、存档文件等。
    • 这些文件既需要写入磁盘,也需要在后续运行时从磁盘中读取。
    • 通常这些数据量相对较小,因此可以通过简单的平面调用加载,不需要复杂的流式处理。

文件的读写过程因数据类型和用途的不同有不同的处理方式:

  • 只读资源需要注重性能优化(如流式加载),以避免影响游戏运行。
  • 状态数据则关注正确性和持久性,确保配置和进度能在多次运行中保持一致。

在过去的开发中,文件操作通常是通过以下步骤完成的:

打开文件:
使用文件名调用 openFile 函数,获得文件句柄(file handle)。
读取文件内容:
提供一个缓冲区(如 128 字节),通过 read 函数从文件中读取指定字节的数据。
根据返回值判断读取是否成功,如果失败,需要处理错误。
关闭文件:
在操作完成后,清理文件句柄。

// 定义文件名为 "test.bmp",指向字符串的指针
char *Filename = "test.bmp";// 打开文件并获取文件句柄
file_handle *File = OpenFile(Filename);// 定义一个大小为 128 字节的缓冲区
uint8 Buffer[128];// 尝试从文件中读取缓冲区大小的数据
if(Read(File, sizeof(Buffer), Buffer)) {// 如果读取成功,执行相应操作
} else {// 如果读取失败,执行失败处理逻辑
}// 关闭文件以释放资源
closeFile(File);

文件 I/O 操作的策略,特别是针对流式文件处理(streaming-based file I/O)是否适合某些目的进行了详细分析。以下是内容的要点总结和理解:


GetFileSize 是 Windows API 中用于获取文件大小的函数。


功能

返回指定文件的大小(以字节为单位)。


参数说明

  1. hFile

    • 输入参数,文件的句柄(HANDLE 类型)。
    • 句柄必须是由支持文件读取的函数(如 CreateFile)返回的,且文件不能是管道。
  2. lpFileSizeHigh

    • 可选参数,指向一个 DWORD 类型的变量,用于存储文件大小的高 32 位(适用于大于 4GB 的文件)。
    • 如果为 NULL,则忽略高 32 位。

返回值

  1. 成功

    • 返回文件大小的低 32 位。
    • 如果 lpFileSizeHigh 非空,则其指向的值存储文件大小的高 32 位。
  2. 失败

    • 返回 INVALID_FILE_SIZE(0xFFFFFFFF)。
    • 此时需要调用 GetLastError() 检查是否确实发生错误(如文件大小正好等于 INVALID_FILE_SIZE,不会返回错误)。

注意事项

  • 对于超过 4GB 的文件,需要结合 lpFileSizeHigh 计算完整文件大小:
    uint64_t fullFileSize = ((uint64_t)lpFileSizeHigh << 32) | fileSizeLow;
    
  • 如果文件句柄不可读,函数会失败。

示例代码

#include <windows.h>
#include <stdio.h>int main() {// 打开文件HANDLE hFile = CreateFileA("example.txt",          // 文件路径GENERIC_READ,           // 读取权限0,                      // 不共享NULL,                   // 默认安全属性OPEN_EXISTING,          // 打开现有文件FILE_ATTRIBUTE_NORMAL,  // 普通文件属性NULL                    // 无模板文件);if (hFile == INVALID_HANDLE_VALUE) {printf("Failed to open file. Error: %lu\n", GetLastError());return 1;}// 获取文件大小DWORD fileSizeLow;DWORD fileSizeHigh;fileSizeLow = GetFileSize(hFile, &fileSizeHigh);if (fileSizeLow == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) {printf("Failed to get file size. Error: %lu\n", GetLastError());CloseHandle(hFile);return 1;}// 计算完整文件大小uint64_t fullFileSize = ((uint64_t)fileSizeHigh << 32) | fileSizeLow;printf("File size: %llu bytes\n", fullFileSize);// 关闭句柄CloseHandle(hFile);return 0;
}

CloseHandle 是 Windows API 中用于关闭对象句柄的函数。


功能

关闭一个打开的句柄,释放与之关联的系统资源。


参数说明

  • hObject
    • 输入参数,要关闭的句柄(HANDLE 类型)。
    • 句柄可以是文件、线程、进程、同步对象(如互斥量、信号量)等。

返回值

  • 成功
    返回 TRUE

  • 失败
    返回 FALSE。可以调用 GetLastError() 获取错误码以确定失败原因(例如句柄无效)。


注意事项

  1. 句柄无效时调用
    如果传入的句柄已经被关闭或未初始化,会导致函数失败。

  2. 重复调用
    不应多次关闭同一个句柄,否则可能导致程序异常。

  3. 文件句柄
    文件操作完成后,必须调用 CloseHandle 关闭文件句柄以避免资源泄漏。

  4. 句柄类型
    确保关闭的是正确类型的句柄,错误的操作可能会影响其他系统资源。


示例代码

#include <windows.h>
#include <stdio.h>int main() {// 打开文件HANDLE hFile = CreateFileA("example.txt",          // 文件路径GENERIC_READ,           // 读取权限0,                      // 不共享NULL,                   // 默认安全属性OPEN_EXISTING,          // 打开现有文件FILE_ATTRIBUTE_NORMAL,  // 普通文件属性NULL                    // 无模板文件);if (hFile == INVALID_HANDLE_VALUE) {printf("Failed to open file. Error: %lu\n", GetLastError());return 1;}printf("File opened successfully.\n");// 关闭文件句柄if (CloseHandle(hFile)) {printf("Handle closed successfully.\n");} else {printf("Failed to close handle. Error: %lu\n", GetLastError());}return 0;
}

用途

  1. 关闭文件、进程、线程、同步对象等句柄。
  2. 释放资源,防止资源泄漏或句柄耗尽。
  3. 适用于清理已完成的操作,保持程序高效运行。

常见场景

  • 文件操作结束后调用。
  • 线程或进程执行完毕后释放句柄。
  • 锁或事件对象不再使用时销毁句柄。

用途

  1. 获取文件大小用于内存分配或文件操作。
  2. 确保文件未超出特定大小限制。
  3. 用于处理大文件时计算高低 32 位文件大小。

核心内容:

  1. 流式文件 I/O 不适用当前目标

    • 对于作者的特定目标,流式文件 I/O 并不合适,因为他们的需求是针对文件块的明确读取,而不是从一个大型流中逐块拉取数据。
    • 他们需要读取的文件数据通常是固定大小的、可以预知的,不需要使用流的逐步处理。
  2. 当前需求是高效读取

    • 他们的重点是加载完整的文件或资产(例如加载一个完整的位图文件)。
    • 读取操作是“全或无”,即一次性加载整个数据块,而非逐步处理。
  3. 未来可能的优化

    • 在目前开发阶段,他们选择简单直接的 I/O 操作策略,而不会为复杂流式操作进行过多优化。
    • 将来,当需要加载一个打包的资源文件时(例如包含多个资产的文件),可以使用类似流式读取的系统,但需要支持多线程。
  4. 日志文件写入的例外

    • 唯一可能需要流式处理的场景是调试日志的写入,但目前并没有计划实现这一功能。

对比分析:

  1. 流式文件 I/O 的优势

    • 适用于处理超大文件或实时数据流的场景,比如从网络中逐步拉取视频数据。
    • 资源占用较少(按需读取),避免一次性加载整个文件而导致内存压力。
  2. 当前策略的选择

    • 出于效率和简单性,作者选择直接一次性读取所需的文件块,而不是处理流式数据。这种方法适合加载固定大小、结构明确的文件内容。
  3. 未来策略的演变

    • 随着需求升级,例如加载复杂的打包资源,可能需要采用更高级的策略,比如使用多线程支持的分块流式读取。

关键总结:

  • 当前任务:简单高效地加载文件,无需使用流式文件处理。
  • 未来可能:在需要复杂的打包文件读取时,会考虑实现多线程和流式文件处理。
  • 优化方向:现阶段优先选择易于实现的直接文件读取,而不是为复杂功能增加开发成本。
    CreateFileA 是 Windows API 中用于创建、打开文件、设备、管道或通信资源的函数。其作用和用途如下:

功能

  1. 打开一个现有文件以进行读取、写入或两者操作。
  2. 创建一个新文件。
  3. 打开设备(如磁盘驱动器、控制台等)。
  4. 创建/打开管道或通信端口。

参数说明

  • lpFileName
    指向一个以空字符结尾的字符串,表示文件或设备的路径名。

  • dwDesiredAccess
    指定所需的访问模式(如读取、写入或两者)。常见值:

    • GENERIC_READ: 读取访问权限
    • GENERIC_WRITE: 写入访问权限
  • dwShareMode
    指定文件或设备共享模式。常见值:

    • FILE_SHARE_READ: 允许其他进程读取
    • FILE_SHARE_WRITE: 允许其他进程写入
    • 0: 不共享
  • lpSecurityAttributes
    可选参数,指定安全属性。如果为 NULL,使用默认设置。

  • dwCreationDisposition
    指定文件的行为,如是否创建新文件或覆盖现有文件。常见值:

    • CREATE_NEW: 如果文件不存在,则创建;存在时失败
    • CREATE_ALWAYS: 始终创建新文件(覆盖现有文件)
    • OPEN_EXISTING: 打开现有文件,文件不存在时失败
    • OPEN_ALWAYS: 打开文件,文件不存在时创建
    • TRUNCATE_EXISTING: 打开文件并清空其内容
  • dwFlagsAndAttributes
    指定文件或设备的标志和属性(如文件是否为隐藏或系统文件)。

  • hTemplateFile
    可选参数,仅用于创建文件时,指定模板文件句柄。


返回值

  • 成功:返回文件或设备的句柄(HANDLE 类型)。
  • 失败:返回 INVALID_HANDLE_VALUE(可通过 GetLastError() 获取具体错误码)。

常见用途

  1. 打开文件进行读取或写入。
  2. 创建新的日志文件。
  3. 打开串口通信设备(如 COM1)。
  4. 操作管道或共享资源。

示例

HANDLE fileHandle = CreateFileA("example.txt",            // 文件路径GENERIC_READ | GENERIC_WRITE, // 读取和写入权限0,                        // 不共享NULL,                     // 默认安全属性CREATE_ALWAYS,            // 始终创建新文件FILE_ATTRIBUTE_NORMAL,    // 普通文件属性NULL                      // 不使用模板文件
);if (fileHandle == INVALID_HANDLE_VALUE) {printf("Failed to create or open file. Error: %lu\n", GetLastError());
} else {printf("File created/opened successfully.\n");CloseHandle(fileHandle); // 关闭文件句柄
}

ReadFile 是 Windows API 中用于从文件或 I/O 设备读取数据的函数。


功能

从文件或输入/输出设备(如文件、管道、串口等)中读取指定数量的字节数据到缓冲区。


参数说明

  1. hFile

    • 输入参数,文件或设备的句柄(HANDLE 类型)。
    • 该句柄必须是由支持读取的函数(如 CreateFile)打开的,并具有读取权限。
  2. lpBuffer

    • 输出参数,指向一个缓冲区,用于存储读取到的数据。
    • 如果此参数为 NULL,表示无效的缓冲区,函数将失败。
  3. nNumberOfBytesToRead

    • 输入参数,要读取的字节数。
    • 指定读取操作期望完成的最大字节数。
  4. lpNumberOfBytesRead

    • 输出参数,指向一个变量,用于接收实际读取的字节数。
    • 如果设置为 NULL,则调用方必须使用重叠(OVERLAPPED)结构处理字节计数。
  5. lpOverlapped

    • 输入/输出参数,指向一个 OVERLAPPED 结构,用于异步操作。
    • 如果未使用异步操作,此参数必须为 NULL

返回值

  • 成功

    • 返回 TRUE
    • *lpNumberOfBytesRead 包含实际读取的字节数。
  • 失败

    • 返回 FALSE。可以通过调用 GetLastError() 获取具体错误码。
    • 如果读取操作被挂起(如使用异步操作),则错误码可能为 ERROR_IO_PENDING

注意事项

  1. 同步与异步操作

    • 如果句柄未设置为异步模式(如未指定 FILE_FLAG_OVERLAPPED),操作将以同步方式执行,函数在读取完成前不会返回。
    • 如果句柄为异步模式,则必须提供 lpOverlapped,以便跟踪操作状态。
  2. 管道或设备的特殊性

    • 对于管道或设备,ReadFile 的行为可能会根据数据可用性发生变化(如阻塞或非阻塞模式)。
  3. 缓冲区大小

    • 确保 lpBuffer 有足够的大小存储 nNumberOfBytesToRead 字节数据。

示例代码

同步读取文件
#include <windows.h>
#include <stdio.h>int main() {// 打开文件HANDLE hFile = CreateFileA("example.txt",          // 文件路径GENERIC_READ,           // 读取权限0,                      // 不共享NULL,                   // 默认安全属性OPEN_EXISTING,          // 打开现有文件FILE_ATTRIBUTE_NORMAL,  // 普通文件属性NULL                    // 无模板文件);if (hFile == INVALID_HANDLE_VALUE) {printf("Failed to open file. Error: %lu\n", GetLastError());return 1;}// 读取文件内容char buffer[128] = {0};    // 缓冲区DWORD bytesRead = 0;       // 实际读取字节数if (ReadFile(hFile, buffer, sizeof(buffer) - 1, &bytesRead, NULL)) {printf("Read %lu bytes: %s\n", bytesRead, buffer);} else {printf("Failed to read file. Error: %lu\n", GetLastError());}// 关闭文件句柄CloseHandle(hFile);return 0;
}

用途

  1. 从文件中读取数据用于处理或存储。
  2. 从管道或串口读取输入数据。
  3. 结合异步 I/O 提高性能,处理多任务数据读取。

常见场景

  • 文件数据解析。
  • 读取串口通信内容。
  • 处理日志或流数据。

VirtualAlloc 是 Windows API 中用于分配虚拟内存的函数。


功能

分配、保留或提交一个虚拟内存区域,并可设置该内存区域的访问权限。


参数说明

  1. lpAddress

    • 输入参数,指定内存区域的首地址(可选)。
    • 如果为 NULL,系统将自动选择合适的地址。
    • 如果非 NULL,则表示请求分配特定的地址,但需要符合内存对齐要求。
  2. dwSize

    • 输入参数,要分配的内存大小(以字节为单位)。
    • 必须为系统页面大小(通常为 4KB)的倍数。
  3. flAllocationType

    • 输入参数,指定内存分配的类型。常见值:
      • MEM_COMMIT: 提交内存,分配实际的物理内存或交换文件空间。
      • MEM_RESERVE: 保留内存地址空间,但不分配物理内存。
      • MEM_RESET: 将指定内存标记为已重置,但保留其保留状态。
      • MEM_RESET_UNDO: 撤销 MEM_RESET 操作。
  4. flProtect

    • 输入参数,指定内存区域的访问保护类型。常见值:
      • PAGE_READONLY: 只读访问权限。
      • PAGE_READWRITE: 可读可写访问权限。
      • PAGE_EXECUTE: 可执行但不可读写权限。
      • PAGE_EXECUTE_READWRITE: 可执行、可读、可写权限。

返回值

  • 成功
    返回分配的内存区域的起始地址(LPVOID 类型)。

  • 失败
    返回 NULL。可以调用 GetLastError() 获取具体错误码。


注意事项

  1. 内存释放

    • 使用 VirtualFree 释放通过 VirtualAlloc 分配的内存,避免内存泄漏。
  2. 内存类型

    • 如果同时指定 MEM_COMMIT | MEM_RESERVE,表示既保留地址空间又提交内存。
  3. 页面大小对齐

    • 分配的内存大小和地址必须符合页面大小对齐要求(通常为 4KB)。
  4. 分配失败

    • 可能由内存不足、无效参数或地址冲突导致分配失败。

示例代码

分配和释放内存
#include <windows.h>
#include <stdio.h>int main() {// 分配 16KB 内存SIZE_T size = 16 * 1024; // 16KBLPVOID lpMemory = VirtualAlloc(NULL,               // 系统选择地址size,               // 分配大小MEM_COMMIT | MEM_RESERVE, // 提交和保留内存PAGE_READWRITE      // 可读可写权限);if (lpMemory == NULL) {printf("Memory allocation failed. Error: %lu\n", GetLastError());return 1;}printf("Memory allocated at address: %p\n", lpMemory);// 使用分配的内存char *data = (char *)lpMemory;for (int i = 0; i < size; i++) {data[i] = 'A';}printf("Memory written successfully.\n");// 释放内存if (!VirtualFree(lpMemory, 0, MEM_RELEASE)) {printf("Memory release failed. Error: %lu\n", GetLastError());return 1;}printf("Memory released successfully.\n");return 0;
}

用途

  1. 创建大内存块以供动态使用。
  2. 管理内存保护以实现安全或性能优化(如只读、只执行内存)。
  3. 实现内存映射文件、动态加载器或自定义内存分配器。

常见场景

  • 高性能计算时分配大内存块。
  • 动态管理虚拟内存。
  • 实现内存保护和访问权限控制。

在这里插入图片描述

相关文章:

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…...

【机器学习】聚类算法原理详解

聚类算法 性能度量&#xff1a; 外部指标 jaccard系数&#xff08;简称JC&#xff09;FM指数&#xff08;简称FMI&#xff09;Rand指数&#xff08;简称RI&#xff09; 内部指标 DB指数&#xff08;简称DBI&#xff09;Dunn指数&#xff08;简称DI&#xff09; 距离计算&am…...

android 使用MediaPlayer实现音乐播放--基础介绍

Android 多媒体框架支持播放各种常见媒体类型&#xff0c;因此 可轻松地将音频、视频和图片集成到您的应用中。你可以播放音频或 从存储在应用资源&#xff08;原始资源&#xff09;的媒体文件&#xff08;原始资源&#xff09;中获取独立文件 或从通过网络连接到达的数据流中&…...

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…...

transformer.js(二):关于pipe管道的一切

前面的章节 transformer.js&#xff08;一&#xff09;&#xff1a;这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景介绍了transformer.js的应用场景。 pipe 管道&#xff08;Pipeline&#xff09; 作为 Transformer.js 的核心功能之一&#xf…...

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…...

设计模式的学习思路

学习设计模式确实需要一定的时间和实践&#xff0c;尤其是对于刚入门的人来说&#xff0c;因为一开始可能会感到有些混淆&#xff0c;尤其是当多个设计模式看起来有相似之处时。本博客是博主学习设计模式的思路历程&#xff0c;大家可以一起学习进步。设计模式学习-CSDN博客 1…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写&#xff0c;也就是说程序在执行的时候生成可以执行的代码&#xff0c;然后执行它。在介绍JIT之前&#xff0c;需要说下两种执行方式&#xff1a;解释执行和编译执行。其中解释执行是通过解释器&#xff0c;将代码逐…...

比rsync更强大的文件同步工具rclone

背景 多个复制&#xff0c;拷贝&#xff0c;同步文件场景&#xff0c;最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份&#xff0c;单次性数据备份。 rsync是单线程的&#xff0c;开源的mrsync是多线程的&#xff0c;但适用范围没…...

【eNSP】OSPF、RIP与静态路由互通实验(四)

OSPF、RIP与静态路由互通实验 实验目的实验要求实验步骤步骤 1&#xff1a;配置R1、R2、R3、R4、R5、R6、R7的端口ip步骤 2&#xff1a;配置R1、R2、R3的OSPF动态路由协议步骤 3&#xff1a;配置R3、R4、R5的RIP动态路由协议步骤 4&#xff1a;配置R3作为边界路由器&#xff0c…...

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…...

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展&#xff0c;旗下人形机器人Figure 02在生产线上的性能得到了显著提升&#xff0c;机器人组成自主舰队&#xff0c;依托端到端技术&#xff0c;速度提高了400%&#xff0c;执行任务成功率提…...

Linux tcpdump 详解教程

简介 tcpdump 是一款在 Linux 平台上广泛使用的网络抓包工具。它可以捕获整个 TCP/IP 协议族的数据包&#xff0c;并支持对网络层、协议、主机、端口等进行过滤。tcpdump 提供了强大的过滤功能&#xff0c;允许使用 and、or、not 等逻辑语句来筛选数据包&#xff0c;非常适合用…...

o1的风又吹到多模态,直接吹翻了GPT-4o-mini

开源LLaVA-o1&#xff1a;一个设计用于进行自主多阶段推理的新型VLM。与思维链提示不同&#xff0c;LLaVA-o1独立地参与到总结、视觉解释、逻辑推理和结论生成的顺序阶段。 LLaVA-o1超过了一些更大甚至是闭源模型的性能&#xff0c;例如Gemini-1.5-pro、GPT-4o-mini和Llama-3.…...

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求&#xff0c;绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口&#xff0c;这个接口的页面入口被隐藏掉了&#xff0c;不能通过页面调用&#xff0c;幸好之前有想过逆向破解通过账号密码模拟登录后拿到token&#xff0c;请求该…...

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…...

SpringBootTest启动时出现循环依赖问题

在公司项目开发中由于SpringBoot启动类配置了setAllowCircularReferences为true在特定的业务逻辑下需要该配置&#xff0c;但我们需要使用SpringBootTest单元测试的时候引入我们开发的配置文件发现不生效&#xff0c; 解决方法&#xff1a; SpringBootTest(properties "…...

微信小程序——01开发前的准备和开发工具

一、踏上小程序开发之旅前的准备 &#xff08;一&#xff09;小程序账号注册 开启注册流程 首先&#xff0c;在浏览器中打开 “微信公众平台”&#xff08;微信公众平台&#xff09;。进入平台后&#xff0c;你会看到右上角有一个 “立即注册” 按钮&#xff0c;点击它&#x…...

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤&#xff1a; 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 &#xff0c;用于制作U盘启动 下载一个引导程序制作工具&#xff0c;我使用…...

【Java 集合】Collections 空列表细节处理

问题 如下代码&#xff0c;虽然定义为非空 NonNull&#xff0c;但依然会返回空对象&#xff0c;导致调用侧被检测为空引用。 实际上不是Collections的问题是三目运算符返回了null对象。 import java.util.Collections;NonNullprivate List<String> getInfo() {IccReco…...

2021 年 3 月青少年软编等考 C 语言三级真题解析

目录 T1. 找和为 K 的两个元素思路分析T2. Minecraft思路分析T3. 踩方格思路分析T4. 苹果消消乐思路分析T5. 流感传染思路分析T1. 找和为 K 的两个元素 在一个长度为 n ( n < 1000 ) n\ (n < 1000) n (n<1000) 的整数序列中,判断是否存在某两个元素之和为 k k k…...

【PyTorch】Pytorch中torch.nn.Conv1d函数详解

1. 函数定义 torch.nn.Conv1d 是 PyTorch 中用于一维卷积操作的类。定义如下&#xff1a; 官方文档&#xff1a;https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1,paddi…...

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…...

通过shell脚本分析部署nginx网络服务

题目&#xff1a; 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务是否成功运行&#xff1b; ​ 已运行&am…...

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作&#xff0c;每种操作的功能和区别是什么&#xff0c;本章将进行讲解&#xff0c;作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…...

【http】http协议状态码

目录 1. 说明2. 信息性状态码3. 成功状态码4. 重定向状态码5. 客户端错误状态码6. 服务器错误状态码 1. 说明 1.HTTP协议状态码是指在HTTP通信过程中&#xff0c;服务器向客户端返回的三位数值的数字代码&#xff0c;用于表示服务器对请求的处理结果和状态。2.这些状态码由三个…...

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#xff0c; 你尽可以试试&#xff0c;从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程&#xff0c;下载地址都只给了一个英文的官网首页&#…...

Python 脚本程序加密

文章目录 前言编译成 .pyc 文件编译成可执行文件PyInstallerNuitka PyArmor加密 Python 脚本生成可执行文件设置授权管理规则 前言 Python 脚本程序加密推荐。 编译成 .pyc 文件 .pyc 文件是 Python 源码文件 (.py) 编译后的二进制文件&#xff0c;能提高加载速度&#xff0…...

记录一次mysql的一些操作,mysql的docker,mysql备份,mysql表复制

我是用的是mysql的docker容器版本。 1、使用mysql的docker容器版本 1.1 启动 docker run --name <docker_name> \-e MYSQL_ROOT_PASSWORD<password> \-v /datavolume2/mysql:/var/lib/mysql \-p 3306:3306 \-d hub.atomgit.com/arm64v8/mysqldocker_name是启动后…...

Slate文档编辑器-WrapNode数据结构与操作变换

Slate文档编辑器-WrapNode数据结构与操作变换 在之前我们聊到了一些关于slate富文本引擎的基本概念&#xff0c;并且对基于slate实现文档编辑器的一些插件化能力设计、类型拓展、具体方案等作了探讨&#xff0c;那么接下来我们更专注于文档编辑器的细节&#xff0c;由浅入深聊…...

2024信创数据库TOP30之蚂蚁集团OceanBase

数据库作为存储、管理和分析这些数据的关键工具&#xff0c;其地位自然不言而喻。随着信息技术的日新月异&#xff0c;数据库技术也在不断演进&#xff0c;以满足日益复杂多变的市场需求。近日&#xff0c;备受瞩目的“2024信创数据库TOP30”榜单由DBC联合CIW/CIS权威发布&…...

Unity类银河战士恶魔城学习总结(P130 SkillTree UI 技能树)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了技能树的UI设置 UI_SKillTreeSlot.cs 这段代码定义了…...

Web服务器

简介 www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询用户 所需要的信息。www可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方 式将信息以Internet传递到世界各处去。 与其他服务器类似…...

.net将List<实体1>的数据转到List<实体2>

比如说有两个实体Class&#xff0c;如下&#xff1a; //实体1 public class People {public string Name {get;set;}public int Age {get;set;} } //实体2 public class Student {public string Name {get;set;}public int Age {get;set;}public string ClassRoom {get;set;}/…...

django从入门到精通(五)——表单与模型

好的&#xff0c;下面将详细介绍 Django 的表单与模型&#xff0c;包括它们的定义、使用、如何在 Django Admin 中结合使用&#xff0c;以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类&#xff0c;用于定义数据库中的数据结…...

Keepalived部署

Keepalived部署 安装配置单VIP模式配置master节点查看节点IP信息配置 keepalived.conf启动且加入开机自启查看是否生效 配置backup节点配置 keepalived.conf启动且加入开机自启查看是否生效 主备测试 多VIP配置 keepalived.conf查看IP 安装 dnf install -y keepalived配置 单…...

怀旧游戏打卡清单(TODO)

感觉忙碌了好久好久&#xff0c;真的好想休息一下。。 整理一下将来休息时候的打卡清单&#xff0c;不工作了去个海边狂打游戏&#xff0c;想想就惬意啊。当然&#xff0c;最好找个work from home&#xff0c;去海边找个酒店上班。挣钱休息两不误。。。 能不能实现另说&#xf…...

ssm160基于Java技术的会员制度管理的商品营销系统的设计与实现+vue(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;商品营销系统计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本商品营销系统就是在这…...

springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)

目录 一、请求映射路径相同&#xff0c;根据请求方式区分不同接口。 1、例子。 二、注解JsonFormat。 1、基本介绍。 2、日期和时间格式化。 3、时区设置。 4、反序列化。 三、注解JsonIgnore。 1、基本介绍。 2、主要作用。 一、请求映射路径相同&#xff0c;根据请求方式区分…...

Redis面试篇笔记(持续更新)

一、redis主从集群 单节点redis的并发能力是由上限的&#xff0c;要进一步提高redis的并发能力可以搭建主从集群&#xff0c;实现读写分离&#xff0c;一主多从&#xff0c;主节点写数据&#xff0c;从节点读数据 部署redis主从节点的docker-compose文件命令解析 version: &q…...

Applied Intelligence投稿

一、关于手稿格式&#xff1a; 1、该期刊是一个二区的&#xff0c;模板使用Springer nature格式&#xff0c; 期刊投稿要求&#xff0c;详细期刊投稿指南&#xff0c;大部分按Soringernature模板即可&#xff0c;图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…...

WPF窗体基本知识-笔记-命名空间

窗体程序关闭方式 命名空间:可以理解命名空间的作用为引用下面的控件对象 给控件命名:一般都用x:Name,也可以用Name但是有的控件不支持 布局控件(容器)的类型 布局控件继承于Panel的控件,其中下面的border不是布局控件,panel是抽象类 在重叠的情况下,Zindex值越大的就在上面 Z…...

LLM | 论文精读 | CVPR | Alpha-CLIP —— 一个聚焦目标区域的CLIP模型

论文标题&#xff1a;Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 作者&#xff1a;Zeyi Sun, Ye Fang, Tong Wu, Pan Zhang, Yuhang Zang等 期刊&#xff1a;CVPR 2024 DOI&#xff1a;http://arxiv.org/pdf/2312.03818v2 email&#xff1a;yuhan.huangwhu.ed…...

windows系统中实现对于appium的依赖搭建

Node.js&#xff1a;Appium是基于Node.js的&#xff0c;因此需要安装Node.js。可以从Node.js官网下载并安装。 Java Development Kit (JDK)&#xff1a;用于Android应用的自动化测试&#xff0c;需要安装JDK。可以从Oracle官网下载并安装。 Android SDK&#xff1a;进行Andro…...

【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)

【网络系统管理】Centos7——配置主从mariadb服务器案例-CSDN博客 接上个文档&#xff0c;我们已经完成了主服务器创建数据库备服务器可以看到 一、在DBMS2查看信息 File&#xff0c;Position这两个字段的数据要记好&#xff0c;等一下需要用到 show master status; 二、在…...

mac nvm安装及使用(nvm安装指定版本node npm pnpm)

mac nvm安装及使用&#xff08;nvm安装指定版本node npm pnpm&#xff09; 1.卸载电脑的node 打开终端&#xff1a;依次执行以下命令&#xff1a; sudo rm -rf /usr/local/bin/npmsudo rm -rf /usr/local/share/man/man1/node.1sudo rm -rf /usr/local/lib/dtrace/node.dsudo…...

Elasticsearch面试内容整理-常见问题和解决方案

在使用 Elasticsearch 的过程中,可能会遇到各种常见问题,如集群状态异常、分片未分配、查询性能低下等。这些问题往往影响系统的可用性和性能,因此理解这些问题的成因和解决方案非常重要。以下是 Elasticsearch 常见问题及其解决方案的整理。 集群状态问题 Elasticsearch 集…...

鸿蒙学习高效开发与测试-应用程序框架和HarmonyOS SDK(3)

文章目录 1、应用程序框架1、规范化后台进程管理2、原生支持分布式3、支持多设备的统一窗口管理4、 组件共享及面向对象5、逻辑与界面解耦6、灵活扩展机制2、HarmonyOS SDK1、 开放能力 Kit2、开放能力的检索和使用3、 方舟工具链4、前端编译器架构1、应用程序框架 应 用 程 序…...

LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))

【LetMeFly】3244.新增道路查询后的最短距离 II&#xff1a;贪心&#xff08;跃迁合并&#xff09;-9行py&#xff08;O(n)&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/shortest-distance-after-road-addition-queries-ii/ 给你一个整数 n 和一个二维…...

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…...