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

C++ 游戏开发入门

一、为什么选择 C++ 进行游戏开发

C++ 在游戏开发领域具有独特的地位。它兼具高效性与对底层硬件的良好控制能力,这使得它非常适合开发对性能要求极高的游戏核心引擎部分。许多知名的大型游戏,如《使命召唤》系列、《虚幻竞技场》等,其底层架构都是基于 C++ 构建的。C++ 能够直接操作内存,在处理复杂的游戏逻辑、大规模数据运算(如物理模拟、图形渲染中的大量计算)以及优化游戏性能方面有着卓越的表现。同时,丰富的类库和工具支持也为游戏开发提供了便利,像 DirectX 和 OpenGL 等图形库可用于创建精美的游戏画面。

二、C++ 基础回顾与强化

在深入 C++ 游戏开发之前,务必确保对 C++ 的基础有扎实的掌握。这包括数据类型(如 int、float、double、char 等)、控制结构(if-else、for、while、switch 等)、函数的定义与使用、类与对象的概念(封装、继承、多态)以及指针和引用的操作。例如,在游戏中创建角色类时,就会用到类的封装来隐藏角色内部属性和行为的实现细节,通过继承可以派生出不同类型的角色类并共享部分通用属性和方法。指针可用于高效地处理游戏中的动态内存分配,如加载游戏资源时动态创建对象数组。

三、游戏开发的核心概念

(一)游戏循环

游戏循环是游戏运行的核心机制。它不断地重复更新游戏状态、处理用户输入、进行物理模拟和渲染画面等操作。一个简单的游戏循环示例如下:

while (true) {// 处理用户输入handleInput();// 更新游戏状态updateGameState();// 进行物理模拟(如碰撞检测等)physicsSimulation();// 渲染游戏画面render();
}

在这个循环中,handleInput函数用于获取玩家的键盘、鼠标等输入操作,并根据输入改变游戏中的相关变量或触发相应的事件。updateGameState函数根据游戏规则和逻辑更新游戏中各个对象的状态,例如角色的位置、生命值、游戏得分等。physicsSimulation函数处理游戏中的物理效果,如物体的运动、碰撞等,确保游戏世界的物理行为符合现实逻辑。render函数则负责将游戏的当前状态绘制到屏幕上,显示给玩家。

(二)图形渲染基础

图形渲染是让游戏世界可视化的关键。在 C++ 中,我们可以使用图形库如 OpenGL 或 DirectX 来实现。以 OpenGL 为例,首先需要初始化 OpenGL 环境,创建窗口并设置相关的渲染上下文。然后定义顶点数据(如三角形、四边形等图形的顶点坐标)、颜色数据等,通过编写顶点着色器和片段着色器来控制图形的绘制方式和颜色填充等效果。例如,绘制一个简单的三角形:

// 顶点数据
GLfloat vertices[] = {-0.5f, -0.5f, 0.0f,  // 左下角顶点0.5f, -0.5f, 0.0f,  // 右下角顶点0.0f,  0.5f, 0.0f   // 顶点坐标
};// 顶点缓冲对象
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 顶点属性指针设置
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

这段代码首先定义了一个三角形的顶点坐标数组,然后创建了顶点缓冲对象(VBO)来存储顶点数据,并设置了顶点属性指针,最后使用glDrawArrays函数绘制出三角形。在实际游戏中,会有更复杂的图形和场景,需要加载模型文件(如.obj 格式),并进行纹理映射、光照处理等操作来使画面更加逼真。

(三)用户输入处理

游戏需要及时响应用户的输入操作。在 C++ 中,可以使用操作系统提供的输入 API 或者游戏引擎的输入处理模块。例如,在 Windows 平台下,可以使用 Windows API 来检测键盘和鼠标消息。以下是一个简单的检测键盘按键是否按下的示例:

#include <windows.h>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) {static TCHAR szAppName[] = TEXT("InputDemo");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)) {MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, TEXT("Input Demonstration"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message) {case WM_KEYDOWN:if (wParam == VK_UP) {// 处理向上箭头按键按下事件// 例如移动角色向上break;}// 其他按键处理break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, message, wParam, lParam);}return 0;
}

在这个示例中,WndProc函数是窗口过程函数,用于处理各种窗口消息。当接收到WM_KEYDOWN消息时,判断按下的键是否为向上箭头键(VK_UP),如果是则可以在相应的代码块中编写处理角色向上移动的逻辑。对于鼠标输入,类似地可以处理鼠标点击、移动等消息来实现游戏中的交互功能,如点击按钮、控制视角等。

(四)碰撞检测与物理模拟

碰撞检测用于判断游戏中的物体是否发生碰撞,这对于游戏的交互性和真实性至关重要。常见的碰撞检测算法有包围盒碰撞检测(AABB - Axis-Aligned Bounding Box)、圆形碰撞检测(适用于圆形或近似圆形的物体)以及更为复杂的三角形网格碰撞检测等。例如,AABB 碰撞检测的基本思想是通过比较两个物体的包围盒(通常是最小的能包含物体的矩形)在坐标轴上的范围是否重叠来判断是否碰撞。

物理模拟则是在碰撞发生后,根据物理定律计算物体的运动和相互作用效果。比如,当两个物体碰撞后,根据它们的质量、速度、弹性系数等参数计算碰撞后的速度和方向变化。在 C++ 中,可以使用物理引擎如 Box2D 或 PhysX 来实现较为复杂的碰撞检测和物理模拟功能。以 Box2D 为例,首先创建一个物理世界,然后在世界中创建刚体(具有质量、形状等属性的物体)、关节(用于连接刚体)等元素,设置好相关的物理参数后,物理引擎会自动处理碰撞检测和物理模拟的计算。

四、C++ 游戏开发框架与库

(一)SFML(Simple and Fast Multimedia Library)

SFML 是一个跨平台的 C++ 多媒体库,提供了对图形、音频、网络、窗口管理等功能的支持,非常适合开发 2D 游戏。它具有简单易用的 API,能够快速创建游戏窗口、加载和绘制图像、播放音频等。例如,使用 SFML 创建一个简单的窗口并显示一张图片:

#include <SFML/Graphics.hpp>int main() {sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Example");sf::Texture texture;if (!texture.loadFromFile("image.jpg")) {// 图片加载失败处理return -1;}sf::Sprite sprite(texture);while (window.isOpen()) {sf::Event event;while (window.pollEvent(event)) {if (event.type == sf::Event::Closed)window.close();}window.clear();window.draw(sprite);window.display();}return 0;
}

这段代码首先创建了一个大小为 800x600 的窗口,然后加载一张名为image.jpg的图片并创建对应的精灵(Sprite),在游戏循环中不断地处理窗口事件、清除窗口、绘制精灵并显示窗口内容。SFML 还提供了对文本绘制、动画、用户输入处理等功能的支持,方便开发者快速构建 2D 游戏的基本框架。

(二)Unreal Engine(使用 C++ 开发)

Unreal Engine 是一款功能强大的游戏引擎,虽然它提供了可视化的蓝图脚本编程方式,但 C++ 在其中也有着重要的地位,可用于开发游戏的核心逻辑、性能关键部分以及自定义插件等。使用 Unreal Engine 进行 C++ 开发,首先需要安装 Unreal Engine 开发环境,创建一个 C++ 项目。在项目中,可以定义游戏角色类、游戏模式类、关卡类等。例如,创建一个自定义的游戏角色类继承自ACharacter类:

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"UCLASS()
class AMyCharacter : public ACharacter {GENERATED_BODY()public:AMyCharacter();// 角色的自定义行为函数void MyCustomFunction();protected:// 重写父类的函数,如角色移动等virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};AMyCharacter::AMyCharacter() {// 初始化角色属性等操作
}void AMyCharacter::MyCustomFunction() {// 实现自定义的角色行为,如特殊技能等
}void AMyCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {Super::SetupPlayerInputComponent(PlayerInputComponent);// 绑定输入操作到角色的行为函数PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);// 其他输入绑定
}

在这个示例中,AMyCharacter类继承自ACharacter类,在构造函数中可以进行角色属性的初始化,MyCustomFunction函数用于实现角色的自定义行为,SetupPlayerInputComponent函数用于绑定玩家的输入操作(如键盘、鼠标操作)到角色的相应行为函数上。通过 Unreal Engine 的强大功能,如蓝图与 C++ 的混合编程、场景编辑、光照效果、物理模拟等,可以开发出高质量的 3D 游戏。

(三)Unity(使用 C++ 与 C# 混合开发)

Unity 是一款广泛使用的游戏引擎,虽然其主要脚本语言是 C#,但也可以通过 C++ 编写插件来扩展引擎功能或处理性能关键部分。例如,可以使用 C++ 编写图形渲染插件来实现特定的渲染效果,或者处理与底层硬件交互的部分。要在 Unity 中使用 C++,需要了解 Unity 的插件开发接口(Plugin API)。通常,将 C++ 代码编译成动态链接库(.dll 文件在 Windows 平台,.so 文件在 Linux 平台等),然后在 Unity 项目中通过 C# 脚本调用 C++ 插件中的函数。例如,一个简单的 C++ 函数用于计算两个数的和:

// MyPlugin.cpp
extern "C" {__declspec(dllexport) int AddNumbers(int a, int b) {return a + b;}
}

在 C# 脚本中调用这个 C++ 函数:

using UnityEngine;
using System.Runtime.InteropServices;public class PluginCaller : MonoBehaviour {// 导入 C++函数[DllImport("MyPlugin")]private static extern int AddNumbers(int a, int b);void Start() {int result = AddNumbers(5, 3);Debug.Log("Result of addition: " + result);}
}

通过这种方式,可以充分利用 C++ 的性能优势和 Unity 的高效开发环境,实现复杂的游戏功能。

五、实践项目示例

(一)简单的 2D 平台游戏

项目目标:创建一个具有基本角色移动、跳跃、碰撞检测的 2D 平台游戏。

技术要点:

  • 使用 SFML 库创建游戏窗口、加载游戏角色和地图的图像资源。
  • 处理玩家输入(键盘操作)来控制角色的移动和跳跃,例如按下方向键左右移动角色,按下空格键使角色跳跃。
  • 实现基于 AABB 的碰撞检测,用于判断角色与地图平台、障碍物等的碰撞,当发生碰撞时,根据碰撞情况调整角色的运动状态,如阻止角色穿过障碍物、实现角色在平台上的站立等。
  • 设计简单的游戏关卡,包括平台、陷阱、奖励物品等元素,并通过文件加载或硬编码的方式创建关卡布局。

开发步骤:

  1. 初始化 SFML 窗口和相关资源加载器。
  2. 创建角色类,包含角色的图像、位置、速度、加速度等属性,以及移动、跳跃等行为函数。
  3. 开发碰撞检测系统,编写函数用于检测角色与不同类型物体的碰撞并返回碰撞结果。
  4. 构建关卡类,负责加载和管理关卡中的平台、陷阱等元素,并提供函数用于检查角色在关卡中的位置是否合法。
  5. 在游戏循环中,不断更新角色状态、处理碰撞检测、绘制角色和关卡元素到窗口中。

(二)3D 第一人称射击游戏(基于 Unreal Engine)

项目目标:打造一个具有基本的第一人称视角移动、射击、敌人 AI 等功能的 3D 射击游戏。

技术要点:

  • 在 Unreal Engine 中使用 C++ 创建第一人称角色类,继承自ACharacter类,实现角色的移动控制(包括行走、奔跑、蹲下、跳跃等),并处理鼠标输入来控制视角转动。
  • 开发武器系统,包括不同类型的枪支,实现射击功能(发射子弹、产生后坐力、消耗弹药等),以及子弹与场景物体的碰撞检测和伤害计算。
  • 设计敌人 AI 系统,使敌人能够感知玩家的位置、进行巡逻、追逐玩家并在合适的时机进行攻击。可以使用行为树或状态机来实现敌人的智能行为。
  • 构建 3D 游戏场景,包括地形、建筑物、道具等元素,利用 Unreal Engine 的场景编辑工具进行创建和布置,并设置合适的光照和阴影效果以增强游戏的视觉体验。

开发步骤:

  1. 创建 Unreal Engine C++ 项目,设置好项目的基本配置和目录结构。
  2. 开发第一人称角色类,重写相关的移动和输入处理函数,设置角色的动画蓝图以实现角色移动的动画效果。
  3. 设计武器类,创建不同枪支的继承类,实现射击逻辑、弹药管理、武器切换等功能,并在角色类中添加武器持有和使用的相关逻辑。
  4. 构建敌人 AI 系统,创建敌人角色类,设计敌人的感知组件、行为树或状态机来控制敌人的行为逻辑,如巡逻路径的设置、发现玩家后的追逐和攻击策略等。
  5. 使用 Unreal Engine 的场景编辑器创建游戏场景,添加地形、建筑、道具等元素,并为场景设置光照、阴影、材质等效果,最后将角色、武器、敌人等元素放置到场景中进行整合和测试。

通过这些实践项目,可以逐步积累 C++ 游戏开发的经验,深入理解游戏开发的各个环节和技术要点,为进一步开发更复杂、更大型的游戏奠定坚实的基础。

六、学习资源推荐

  • 书籍
    • 《C++ 游戏编程入门教程》:以通俗易懂的方式介绍了 C++ 游戏编程的基础知识和实践技巧,包括游戏开发的基本概念、C++ 语言基础、图形编程、游戏物理模拟等内容,适合初学者入门。
    • 《3D 游戏编程大师技巧》:涵盖了 3D 游戏编程的各个方面,如 3D 数学基础、图形渲染、碰撞检测、动画等,通过大量的示例代码和详细的解释,帮助读者深入理解 3D 游戏开发的原理和技术。
    • 《DirectX 角色扮演游戏编程》:专注于 DirectX 技术在角色扮演游戏开发中的应用,包括角色建模、场景绘制、光照效果、输入处理等内容,适合想要学习使用 DirectX 进行游戏开发的读者。
    • 《游戏开发物理学》:介绍了游戏开发中常用的物理模拟技术,如刚体力学、碰撞检测与响应、流体模拟等,通过实际案例和代码示例,帮助读者掌握游戏物理引擎的使用方法。
  • 在线教程网站
    • https://zhuanlan.zhihu.com/p/660290204该知乎专栏以魔兽开源后端框架 trinitycore 为例,深入拆解了游戏后端开发中的关键技术,如 cmake 项目构建、数据库模块、日志模块、网络模块等,适合有一定 C++ 基础,想要深入学习游戏后端开发的读者。
    • 【完整版300集】B站最容易懂的C++游戏开发教程,从零基础小白到游戏开发大神, - 哔哩哔哩这套教程从 C 语言简史、汇编语言等基础知识讲起,逐步深入到 C++ 游戏开发的相关内容,内容全面,适合零基础的初学者。
    • C++EasyX图形编程教程:RPG游戏元素详解,轻松入门游戏开发通过 C++ EasyX 图形库,详细介绍了 RPG 游戏中角色、地图、任务、战斗系统等基本元素的实现方法,非常适合初学者快速入门游戏开发。
    • 【蓝蓝】-变异护士 Sixth sense_哔哩哔哩_bilibili带你全面学习游戏后端开发技术点,包括网络编程、数据库操作、多线程等,帮助你掌握游戏服务器开发的核心技能。
    • 开源项目

    • TrinityCore:这是一个基于 C++ 的魔兽世界开源服务器项目,包含了丰富的游戏开发技术,如高性能网络编程、数据库设计、游戏逻辑实现等,通过学习和研究该项目的源码,可以深入了解大型多人在线游戏的开发架构和技术细节。
    • OGRE:OGRE 是一个用 C++ 编写的面向场景的 3D 渲染引擎,具有高效、灵活、跨平台等特点,其源码结构清晰,注释详细,是学习 3D 图形渲染和游戏引擎开发的优秀资源。
    • SFML:SFML 是一个简单快速的多媒体库,提供了对图形、音频、网络等功能的支持,适合用于开发 2D 游戏和小型游戏项目,其文档和示例丰富,易于上手。
    • 游戏引擎文档和教程

    • Unreal Engine 官方文档:Unreal Engine 是一款功能强大的游戏引擎,其官方文档详细介绍了引擎的各项功能和使用方法,包括蓝图编程、C++ 编程、场景编辑、动画制作等,通过学习官方文档和相关教程,可以快速掌握 Unreal Engine 的开发技巧。
    • Unity 官方文档:Unity 是一款广泛使用的游戏引擎,其官方文档涵盖了引擎的各个方面,如脚本编程、场景构建、物理模拟、UI 设计等,同时还提供了丰富的示例项目和教程,帮助读者快速入门和提高开发技能。

相关文章:

C++ 游戏开发入门

一、为什么选择 C 进行游戏开发 C 在游戏开发领域具有独特的地位。它兼具高效性与对底层硬件的良好控制能力&#xff0c;这使得它非常适合开发对性能要求极高的游戏核心引擎部分。许多知名的大型游戏&#xff0c;如《使命召唤》系列、《虚幻竞技场》等&#xff0c;其底层架构都…...

【娱乐项目】基于cnchar库与JavaScript的汉字查询工具

Demo介绍 利用了 cnchar 库来进行汉字相关的信息查询&#xff0c;并展示了汉字的拼音、笔画数、笔画顺序、笔画动画等信息用户输入一个汉字后&#xff0c;点击查询按钮&#xff0c;页面会展示该汉字的拼音、笔画数、笔画顺序&#xff0c;并绘制相应的笔画动画和测试图案 cnchar…...

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…...

自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)

命名实体识别&#xff08;NER&#xff09; 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键任务&#xff0c;其目标是从文本中识别出具有特定意义的实体&#xff0c;并将其分类到预定义的类别中。这…...

记录一次 用php 调用ai用stream返回

直接写代码了 config 里面是配置文件就不写了&#xff0c;这样要去不同的平台申请去 写一个 service,解释一下代码 写了两个ai&#xff0c;一个是星火&#xff0c;一个是质谱&#xff0c;他们都是调用curl 方法&#xff0c;并返回数据&#xff0c; s t r e a m 为假就是等等返…...

vue引入并调用electron插件在网页报错Dynamic require of “electron“ is not supported

报错信息 Error: Dynamic require of "electron" is not supported 这个错误信息表明你正在尝试在一个普通的网页环境中动态地引入(electron)&#xff0c;但是这是不被允许的。Electron是一个用于构建桌面应用程序的框架&#xff0c;它结合了Node.js和Chromium&#…...

【C++】数组

1.概述 所谓数组&#xff0c;就是一个集合&#xff0c;该集合里面存放了相同类型的数据元素。 数组特点&#xff1a; &#xff08;1&#xff09;数组中的每个数据元素都是相同的数据类型。 &#xff08;2&#xff09;数组是有连续的内存空间组成的。 2、一维数组 2.1维数组定…...

Python 中的 try-except 语句介绍

Python 中的 try-except 语句介绍 在编程过程中&#xff0c;异常处理是非常重要的一部分。Python 提供了 try-except 语句来捕获和处理程序运行时可能出现的异常。本文将详细介绍 try-except 语句的基本概念、常见错误类型以及一些实用的代码示例。 1. try-except 语句的基本…...

网络原理-初识

1.网络的发展历程 独立模式 独立模式&#xff1a;计算机之间相互独立。 每个终端A、B、C各自持有客户端数据 网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即可以多个计算机协调工作来完成业务&#xff0c;就有…...

uniapp动态表单

使用了uniapp自带扩展组件和uv-ui组件库自行安装下载 <template><view class"assetEdit_container"><view class"type-box"><uv-formlabelPosition"left"labelWidth"140rpx":model"formData"ref"…...

基于智能语音交互的智能呼叫中心工作机制

在智能化和信息化不断进步的现代&#xff0c;智能呼叫中心为客户提供高质量、高效率的服务体验&#xff0c;提升众多品牌用户的满意度和忠诚度。作为实现智能呼叫中心的关键技术之一的智能语音交互技术&#xff0c;它通过集成自然语言处理&#xff08;NLP&#xff09;、语音识别…...

flask的第一个应用

本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由无参形式有参形式 参数类型不同的http方法本文小结 简单实例 flask的依赖包都安装好之后&#xff0c;我们就可以写一个最简单的web应用程序了&#xff0c;我们把这个应用程序命名为first.py: from fl…...

macOS开发环境配置与应用开发

macOS开发环境配置与应用开发 在数字化时代&#xff0c;软件开发已成为推动各行各业创新的重要引擎。macOS&#xff0c;作为苹果公司推出的操作系统&#xff0c;以其强大的性能、优雅的用户界面和丰富的开发工具&#xff0c;吸引了无数开发者的目光。本文将深入探讨macOS开发环…...

【SpringBoot】整合篇

1、log4j2 第一步&#xff0c;导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…...

Vue实战技巧:如何展示附件(PDF、MP4、Excel、Zip等)并修改名称下载

大家好&#xff0c;今天给大家分享一篇关于在Vue项目中展示附件&#xff08;PDF、MP4、Excel、Zip等&#xff09;并修改名称下载的教程。在实际开发过程中&#xff0c;这个功能非常实用&#xff0c;下面我们就一起来学习一下。 一、准备工作 首先&#xff0c;确保你的项目中已经…...

多线程运行时,JVM(Java虚拟机)的内存模型

在多线程运行时&#xff0c;JVM&#xff08;Java虚拟机&#xff09;的内存模型主要涉及以下几个方面&#xff1a; 1. 主内存和工作内存 JVM内存模型定义了主内存和工作内存的概念。主内存是所有线程共享的内存区域&#xff0c;而工作内存是每个线程私有的内存区域。线程对变量…...

VS与SQL Sever(C语言操作数据库)

作者这里使用的是程序是&#xff1a; Visual Studio SQL Sever (1 对VS的操作 1.首先我们打开Visual Studio Installer&#xff0c;并以管理员身份运行 2.点击修改 3.先选择数据存储和处理&#xff0c;再在右方添加处理工具&#…...

一次奇妙的getshell之旅

1. 资产收集时发现一个网站&#xff1a; https://xxxxxxxxxx/ischool/publish_page/0/ 发现存在管理员登陆: 这里之前在该旁站找到一个SQL注入&#xff0c;然后找到的这个账户密码&#xff08;这里如何从SQL注入找到账户密码前借鉴前面的报告。&#xff09;&#xff1a; 账号&…...

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…...

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…...

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向&#xff0c;正在逐步改变传统互联网架构&#xff0c;推动去中心化技术的发展。对于开发者而言&#xff0c;Web3代表着一个充满机遇与挑战的新领域&#xff0c;学习和掌握Web3的基本技术和工具&#xff0c;将为未来的项目开发提供强大的支持。那么…...

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口&#xff1f;6.2 个人电脑的网关本质是什么&#xff1f; 0. 概念 自治系统&#xff…...

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

图片预处理技术介绍4——降噪

图片预处理 大家好&#xff0c;我是阿赵。   这一篇将两种基础的降噪算法。   之前介绍过均值模糊和高斯模糊。如果从降噪的角度来说&#xff0c;模糊算法也算是降噪的一类&#xff0c;所以之前介绍的两种模糊可以称呼为均值降噪和高斯降噪。不过模糊算法对原来的图像特征的…...

Java基础面试题12:Java中的两种异常类型是什么?它们有什么区别?

在 Java 中&#xff0c;异常是非常重要的一部分。理解异常的种类和它们的区别&#xff0c;是每个 Java 开发者都需要掌握的基础技能。 Java 中的异常分类 Java 中异常的根本来源是 Throwable 类&#xff0c;它包含了两大类&#xff1a;错误&#xff08;Error&#xff09;和异常…...

MySQL5.6升级MySQL5.7

升级方式介绍 08 数据库服务版本升级方法 5.6 – 5.7 – 8.0 数据库版本升级方法&#xff1a; Inplace-本地升级 步骤一&#xff1a;在同一台服务器中&#xff0c;需要部署高版本数据库服务实例步骤二&#xff1a;低版本数据库中的数据进行备份迁移&#xff0c;迁移到高版本…...

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型)

Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 目录 Pytorch实现心跳信号分类识别(支持LSTM,GRU,TCN模型&#xff09; 1. 项目说明 2. 数据说明 &#xff08;1&#xff09;心跳信号分类预测数据集 3. 模型训练 &#xff08;1&#xff09;项目安装 &…...

走进科学json版:在 JSON 格式中,字符串值必须使用双引号 “ 来界定,而不能使用单引号 ‘

走进科学疑难问题出现 在调试fastapi程序的时候&#xff0c;报错碰到422错误 INFO: 192.168.0.99:46536 - "POST /v1/chat/completions/ HTTP/1.1" 422 Unprocessable Entity 干净利索&#xff0c;只有这一句报错&#xff0c;不管代码里加入多少print语句查看…...

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…...

博泽Brose EDI项目案例

Brose 是一家德国的全球性汽车零部件供应商&#xff0c;主要为全球汽车制造商提供机电一体化系统和组件&#xff0c;涵盖车门、座椅调节系统、空调系统以及电动驱动装置等。Brose 以其高质量的创新产品闻名&#xff0c;在全球拥有多个研发和生产基地&#xff0c;是全球第五大家…...

Macos用brew安装Nodejs亲手教程

首先确保brew已安装&#xff0c;搜索node资源&#xff0c;命令如下&#xff1a; brew search nodejs 演示结果如下&#xff1a; 安装nodejs brew install node22 或 brew install node 出现如下界面 表示正在安装&#xff0c;安装成功后&#xff0c;提示如下信息&#xff1…...

开发一套ERP 第十弹 图片作为配置文件,本地读取图片,定时更新图片类型

echo Hello World在同一数据库中在建一个图床数据表,产品一,一对应,图片命名 最优的方案&#xff0c;使用 rust 在构建一个 http server 用于管理非数据库资源,也可以将来对接不同的图床&#xff0c;部署方便 考虑到数据库资源和图片资源,都可以被远程访问这种方法最佳...

终端环境下关闭显示器

终端环境下关闭显示器 使用vbetool vbetool 使用 lrmi 来运行视频 BIOS 中的代码。目前&#xff0c;它能够更改 DPMS 状态、保存/恢复视频卡状态并尝试从头开始初始化视频卡。 vbetool dpms off...

基于PySpark 使用线性回归、随机森林以及模型融合实现天气预测

基于PySpark 实现天气预测与模型集成 在大数据分析与机器学习领域&#xff0c;Spark 提供了强大的计算能力和灵活的扩展性。本文将介绍如何利用 PySpark 完成以下任务&#xff1a; 1、数据预处理&#xff1a;清洗和编码天气数据。 2、特征工程&#xff1a;合并数值和分类特征…...

Android Studio 右侧工具栏 Gradle 不显示 Task 列表

问题&#xff1a; android studio 4.2.1版本更新以后AS右侧工具栏Gradle Task列表不显示&#xff0c;这里需要手动去设置 解决办法&#xff1a; android studio 2024.2.1 Patch 2版本以前的版本设置&#xff1a;依次打开 File -> Settings -> Experimental 选项&#x…...

Linux详解:文件权限

文章目录 前言Linux文件权限基础文件成员与三组权限字符 权限的修改修改文件所有者总结 前言 在浩瀚的操作系统世界中&#xff0c;Linux以其开源、灵活和强大的特性&#xff0c;成为了服务器、开发环境以及众多个人用户的首选。而在Linux的众多特性中&#xff0c;文件权限机制…...

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…...

CLIP模型也能处理点云信息

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

编译MT7620 OpenWrt的所有机型的固件

前置条件&#xff1a;准备VMware16Ubuntu16.04的编译环境 安装编译需要的插件 sudo apt-get install gcc g binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-dev git-core uuid…...

C_字符串的一些函数

1.字符串输入函数 scanf("%s",数组名)&#xff1b; gets(数组名)&#xff1b; 区别&#xff1a; scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入&#xff1a;");scanf("%s",a)…...

pytest自定义命令行参数

实际使用场景&#xff1a;pytest运行用例的时候&#xff0c;启动mitmdump进程试试抓包&#xff0c;pytest命令行启动的时候&#xff0c;传入mitmdump需要的参数&#xff08;1&#xff09;抓包生成的文件地址 &#xff08;2&#xff09;mitm的proxy设置 # 在pytest的固定文件中…...

【OpenAI库】从0到1深入理解Python调用OpenAI库的完整教程:从入门到实际运用

文章目录 Moss前沿AI一、初识OpenAI API1.1 获取API-Key&#xff08;两种方案&#xff09;1.2 安装OpenAI库 二、Python调用OpenAI API的基础设置2.1 设置API密钥和Base URL2.2 参数详解 三、构建一个简单的聊天应用3.1 创建聊天请求3.2 参数详解3.3 处理响应 四、完整代码示例…...

设计模式---建造者模式

建造者模式 一种创建型设计模式&#xff0c;它允许你一步一步地构建复杂对象。通过使用建造者模式&#xff0c;你可以将对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。说白点就是&#xff0c;解决了构造函数创建对象的问题。 适用于那种构造函…...

安装MySQL 5.7 亲测有效

前言&#xff1a;本文是笔者在安装MySQL5.7时根据另一位博主大大的安装教程基础上做了一些修改而成 首先在这里表示对博主大大的感谢 下面附博主大大地址 下面的步骤言简意赅 跟着做就不会出错 希望各位读者耐下心来 慢慢解决安装中出现的问题~MySQL 5.7 安装教程&#xff08;全…...

delphi 12 idhttpsever(S)+idhttp(C) 实现简单的JSON API服务

这篇博客展示了如何使用Delphi创建一个简单的HTTP服务器&#xff0c;并处理GET和POST请求。服务器监听6600端口&#xff0c;响应JSON格式的数据。客户端通过IdHttp组件进行GET和POST请求&#xff0c;获取并显示服务器响应的内容。 http服务器测试代码 procedure TForm1.FormSh…...

SVM支持向量机分类——基于Python实现

SVM支持向量机分类 1.描述统计 from numpy import * from scipy import * from pandas import * import matplotlib.pyplot as pltimport seaborn as sns glassread_csv(../data/第5章数据/Glass.csv,sep,) glass.head() glass[Type].value_counts()Type 2 76 1 70 7 …...

k8s使用的nfs作为sc。

k8s使用的nfs作为sc。 当前出现一个问题&#xff1a; 1.有一个pod他是通过流进行文件解压并写入到nfs服务器对应的目录中。 2.一个大压缩包下有20多个压缩包&#xff0c;递归解压。解压完成后应该是20多个文件夹&#xff0c;文件夹下有.json文件。 3.pod中的程序解压后去找以.j…...

tp6 合成两个pdf文件(附加pdf或者替换pdf)

最近在做项目有个需求&#xff0c;项目中需要根据设置的html合同模板自动生成PDF合同供客户下载签署&#xff0c;并根据回传的已签署合同尾页来替换原来未签署合同的尾页&#xff0c;合成新的已签署合同文本。 读取两个PDF文件并合成的 具体代码记录如下&#xff1a; use set…...

SpringBoot

SpringBoot简介 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程 SpringBoot快速入门 新建maven工程&#xff0c;导入SpringBoot父工程以及依赖 <?xml version"1.0" encoding"UTF-8"?>…...

2024第六届金盾信安杯Web 详细题解

比赛一共4道Web题,比赛时只做出三道,那道文件上传没有做出来,所以这里是另外三道题的WP 分别是 fillllll_put hoverfly ssrf fillllll_put 涉及: 绕过exit() 死亡函数 php://filter 伪协议配合base64加解密 一句话木马 题目源码&#xff1a; $content参数在开头被…...