当前位置: 首页 > 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 模型和…...

详解模版类pair

目录 一、pair简介 二、 pair的创建 三、pair的赋值 四、pair的排序 &#xff08;1&#xff09;用sort默认排序 &#xff08;2&#xff09;用sort中的自定义排序进行排序 五、pair的交换操作 一、pair简介 pair是一个模版类&#xff0c;可以存储两个值的键值对.first以…...

AI驱动的桌面笔记应用Reor

网友 竹林风 说&#xff0c;已经成功的用 mxbai-embed-large 映射到 text-embedding-ada-002&#xff0c;并测试成功了。不愧是爱折腾的人&#xff0c;老苏还没时间试&#xff0c;因为又找到了另一个支持 AI 的桌面版笔记 Reor Reor 简介 什么是 Reor ? Reor 是一款由人工智…...

搜维尔科技:使用sensglove触觉反馈手套进行虚拟拆装操作

使用sensglove触觉反馈手套进行虚拟拆装操作 搜维尔科技&#xff1a;使用sensglove触觉反馈手套进行虚拟拆装操作...

深入理解电子邮件安全:SPF、DKIM 和 DMARC 完全指南

引言 在当今数字时代&#xff0c;电子邮件已经成为我们日常通信中不可或缺的一部分。然而&#xff0c;随之而来的安全问题也日益突出。邮件欺诈、钓鱼攻击和垃圾邮件等威胁不断增加&#xff0c;这促使了多种邮件安全验证机制的出现。本文将深入探讨三个最重要的邮件安全协议&a…...

【有啥问啥】复习一下什么是NMS(非极大值抑制)?

复习一下什么是NMS&#xff08;非极大值抑制&#xff09;&#xff1f; 什么是NMS&#xff1f; NMS&#xff08;Non-Maximum Suppression&#xff09;即非极大值抑制&#xff0c;是一种在计算机视觉领域&#xff0c;尤其是目标检测任务中广泛应用的后处理算法。其核心思想是抑…...

Java-异步方法@Async+自定义分布式锁注解Redission

如果你在使用 @Async 注解的异步方法中,使用了自定义的分布式锁注解(例如 @DistributedLock),并且锁到期后第二个请求并没有执行,这可能是由于以下几个原因导致的: 锁的超时时间设置不当:锁的超时时间可能设置得太短,导致锁在业务逻辑执行完成之前就已经自 动释放。…...

基本定时器---内/外部时钟中断

一、定时器的概念 定时器&#xff08;TIM&#xff09;&#xff0c;可以对输入的时钟信号进行计数&#xff0c;并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元&#xff0c;它由一个16位计数器&#xff0c;预分频器&#xff0c;和自动重…...

实现了两种不同的图像处理和物体检测方法

这段代码实现了两种不同的图像处理和物体检测方法&#xff1a;一种是基于Canny边缘检测与轮廓分析的方法&#xff0c;另一种是使用TensorFlow加载预训练SSD&#xff08;Single Shot Multibox Detector&#xff09;模型进行物体检测。 1. Canny边缘检测与轮廓分析&#xff1a; …...

如何在MindMaster思维导图中制作PPT课件?

思维导图是一种利用色彩、图画、线条等图文并茂的形式&#xff0c;来帮助人们增强知识或者事件的记忆。因此&#xff0c;思维导图也被常用于教育领域&#xff0c;比如&#xff1a;教学课件、读书笔记、时间管理等等。那么&#xff0c;在MindMaster免费思维导图软件中&#xff0…...

ORIN NX 16G安装中文输入法

刷机版本为jetpack5.14.刷机之后预装了cuda、cudnn、opencv、tensorrt等&#xff0c;但是发现没有中文输入&#xff0c;所以记录一下安装流程。 jetson NX是arm64架构的&#xff0c;sougoupinyin只支持adm架构的&#xff0c;所以要选择安装Google pinyin 首先打开终端&#x…...

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…...

退款成功订阅消息点击后提示订单不存在

问题表现&#xff1a; 退款成功发送的小程序订阅消息点击进入后提示订单不存在。 修复方法&#xff1a; 1.打开文件app/services/message/notice/RoutineTemplateListService.php 2.找到方法sendOrderRefundSuccess 3.修改图中红圈内的链接地址 完整方法代码如下 /*** 订…...

实验一 顺序结构程序设计

《大学计算机&#xfe63;C语言版》实验报告 实验名称 实验一 顺序结构程序设计 实验目的 &#xff08;1&#xff09;掌握C语言中常量和变量的概念。 &#xff08;2&#xff09;掌握C语言中常见的数据类型。 &#xff08;3&#xff09;掌握C语言中变量的定义和赋值方法。 …...

Elasticsearch搜索流程及原理详解

Elasticsearch搜索流程及原理详解 1. Elasticsearch概述1.1 简介1.2 核心特性1.3 应用场景2. Elasticsearch搜索流程2.1 搜索请求的发起2.2 查询的执行2.3 结果的聚合与返回3. Elasticsearch原理详解3.1 倒排索引3.2 分布式架构3.3 写入流程3.4 读取流程4. 技术细节与操作流程4…...

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...

【gitlab】gitlabrunner部署

1、下载镜像 docker pull gitlab/gitlab-runner:latest 2、启动gitrunner容器 docker run -d --name gitlab-runner --restart always \ -v /root/gitrunner/config:/etc/gitlab-runner \ ///gitlab-runner的配置目录&#xff0c;挂载在宿主机上方便修改,里面有config.…...

Flink监控checkpoint

Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…...

Ribbon 入门实战指南

Ribbon 是 Netflix 开发的一个开源项目&#xff0c;用于实现客户端负载均衡功能。它在微服务架构中广泛使用&#xff0c;并且是 Spring Cloud 生态中的重要组成部分。本文将带你从基础入门&#xff0c;逐步掌握如何在 Spring Cloud 项目中使用 Ribbon 实现客户端负载均衡。 1 负…...

uniapp: 微信小程序包体积超过2M的优化方法(主包从2.7M优化到1.5M以内)

一、问题描述 在使用uniapp进行微信小程序开发时&#xff0c;经常会遇到包体积超过2M而无法上传&#xff1a; 二、解决方案 目前关于微信小程序分包大小有以下限制&#xff1a; 整个小程序所有分包大小不超过 30M&#xff08;服务商代开发的小程序不超过 20M&#xff09; 单个…...

【百日算法计划】:每日一题,见证成长(026)

题目 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外)&#xff0c;计算其结果。 表达式仅包含非负整数&#xff0c;&#xff0c; - &#xff0c;&#xff0c;/ 四种运算符和空格 。 整数除法仅保留整数部分。 * * 示例 1: 输入: “32X2” 输出: 7 import…...

【大模型】prompt实践总结

文章目录 怎么才算是好的prompt设计准则基本原则精炼原则(奥卡姆剃刀准则)具体原则真实操作技巧指定角色增加fewshots列表化代码化强调需求真实迭代大模型优化情形任务的定义和评估标准似乎可以再明确一下出现了一些之前没有考虑过的特殊情况,可以重新组织语言优化Prompt来处…...

在Qt(以及C++)中, 和 * 是两个至关重要的符号--【雨露均沾】

在Qt&#xff08;以及C&#xff09;中&#xff0c;& 和 * 是两个至关重要的符号&#xff0c;它们用于处理引用和指针。我们将逐个解释这两个符号&#xff0c;并提供简单示例来说明它们的用法。 1. 引用&#xff08;&&#xff09; 定义: 引用是一种别名&#xff0c;它不…...

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…...

网络安全领域的最新动态和漏洞信息

网络安全领域的最新动态和漏洞信息涉及多个方面&#xff0c;以下是对这些信息的详细归纳&#xff1a; 一、网络安全领域最新动态世界互联网大会乌镇峰会召开2024年11月19日至22日&#xff0c;以“拥抱以人为本、智能向善的数字未来——携手构建网络空间命运共同体”为主题的202…...

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;选择下面的云平台以开始使用昇思MindSpore&#xff0c;获取安装命令&#xff0c;安装MindSpo…...

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…...

独立站干货:WordPress主机推荐

WordPress作为全球最受欢迎的独立站建设平台&#xff0c;提供了灵活性和强大的功能&#xff0c;使得建站变得简单而高效。本文将为您详细介绍WordPress建站的流程&#xff0c;并推荐几款实测后觉得好用的主机商。 WordPress建站流程 域名注册 首先需要注册一个域名&#xff0c…...

支持多种快充协议和支持多种功能的诱骗取电协议芯片

汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片&#xff0c;支持最大功率100W给设备快速充电&#xff0c;大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…...

网站做好了 怎么做解析/全国疫情地区查询最新

LR常用的函数&#xff0c;协议不一样函数会不一样&#xff0c;这里简单的介绍下HTTP\WEBSERVICE\SOCKET协议常用函数&#xff1a; HTTP: web_set_max_html_param_len("1024");//设置1行数据最大长度&#xff0c;经常会使用到 web_reg_save_param("SupplierId&qu…...

建筑案例网站/seo百度关键词排名

重新注册新的名称&#xff0c;真的想要重新开始了&#xff0c;走过了彷徨与不安。也要开始我的新的生活。也许人最应该经受的不是成功而是失败&#xff0c;这回真的很失败&#xff0c;不过相信我会从失败中真正的走出来的。寻找自己真正的位置。被ACM集训队踢了出来&#xff0c…...

网站建设咨询公司地址/深圳新闻今日最新

var troubleStrArr:[String] []convenience init(troubleStrArr:[String]){self.init(nibName: nil, bundle: nil)self.troubleStrArr troubleStrArr}...

物流网站毕业设计论文/口碑营销的案例有哪些

一&#xff0c;自定义注解类 Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited //继承对接口是无用的&#xff1b;继承的时候只会集成到类上面的注解&#xff0c;不会继承到方法上的注解 Documented public interface Descriptio…...

怎么在wordpress导航条下方加入文字广告链接/镇江百度关键词优化

本文实例为大家分享了js实现导航跟随效果展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下如何实现上面的效果&#xff0c;请看下面的步骤第一步&#xff1a;用 css 调整样式 &#xff0c;这里小编用的是弹性盒子实现导航的平均分配。(聪明的你可以尝试用其他的方…...

没有网站可以做落地页/怎样免费制作网页

定义了一下方法&#xff0c;具体用法可查百度usleep() 函数延迟代码执行若干微秒。unpack() 函数从二进制字符串对数据进行解包。uniqid() 函数基于以微秒计的当前时间&#xff0c;生成一个唯一的 ID。time_sleep_until() 函数延迟代码执行直到指定的时间。time_nanosleep() 函…...