多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。
class LZJGAMEMODE_API ALZJPlayerController : public APlayerController
{GENERATED_BODY()virtual void SetupInputComponent();void LeftButtonFunction();void DeactiveLeftButtonFunction();void RightButtonFunction();void DeactiveRightButtonFunction();void WheelUpFunction();void WheelDownFunction();void PanX(float value);void PanY(float value);void RotateX(float value);void RotateY(float value);
};
二.开始需要绑定,每一个,按键事件。对应回调那个函数。在函数里,会通过GetPawn,判断当前肉体是哪个Pawn,在对于调用此时这个Pawn的函数功能。
void ALZJPlayerController::SetupInputComponent()
{Super::SetupInputComponent();InputComponent->BindAction("LeftButtonFunction", IE_Pressed, this, &ALZJPlayerController::LeftButtonFunction);InputComponent->BindAction("LeftButtonFunction", IE_Released, this, &ALZJPlayerController::DeactiveLeftButtonFunction);InputComponent->BindAction("RightButtonFunction", IE_Pressed, this, &ALZJPlayerController::RightButtonFunction);InputComponent->BindAction("RightButtonFunction", IE_Released, this, &ALZJPlayerController::DeactiveRightButtonFunction);InputComponent->BindAction("WheelUpFunction", IE_Pressed, this, &ALZJPlayerController::WheelUpFunction);InputComponent->BindAction("WheelDownFunction", IE_Pressed, this, &ALZJPlayerController::WheelDownFunction);InputComponent->BindAxis("PanX", this, &ALZJPlayerController::PanX);InputComponent->BindAxis("PanY", this, &ALZJPlayerController::PanY);InputComponent->BindAxis("RotateX", this, &ALZJPlayerController::RotateX);InputComponent->BindAxis("RotateY", this, &ALZJPlayerController::RotateY);bShowMouseCursor = true;
}void ALZJPlayerController::LeftButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActivePin();}}
}void ALZJPlayerController::DeactiveLeftButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActivePin();}}
}void ALZJPlayerController::RightButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActiveRotate();}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->ActiveRotate();}}
}void ALZJPlayerController::DeactiveRightButtonFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActiveRotate();}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->DeActiveRotate();}}
}void ALZJPlayerController::WheelUpFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->Zoom(1, 10);}}
}void ALZJPlayerController::WheelDownFunction()
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->Zoom(0, 10);}}
}void ALZJPlayerController::PanX(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->PanX(value);}}}void ALZJPlayerController::PanY(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->PanY(value);}}
}void ALZJPlayerController::RotateX(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateX(value * 0.8f);}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateX(value * 0.2f);}}
}void ALZJPlayerController::RotateY(float value)
{if (GetPawn()) {ALZJPawn* TmpCamPawn = Cast<ALZJPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateY(value * 0.8f);}}if (GetPawn()) {ALZJTravelPawn* TmpCamPawn = Cast<ALZJTravelPawn>(GetPawn());if (TmpCamPawn) {TmpCamPawn->RotateY(value * 0.2f);}}
}
三.无人机视角
1.这里说一下,其中之一的无人机视角。如果肉体是无人机。这个无人机是如何实现的。
安装碰撞盒,用与碰撞。模型不必多说。还有两个物理喷射器的指针,因为我们要从物理上模仿,这个无人机。下面分别是物理银子的参数,模型数组,以及旋转螺旋桨动画函数的声明。
UCLASS()
class WXDRONE_API ADrone : public APawn
{GENERATED_BODY()public:// Sets default values for this pawn's propertiesADrone();UPROPERTY(EditAnywhere)class UBoxComponent* OutCollision;//碰撞包围盒//如果是指针 VisibleAnywhere 和 EditAnywhere 差不多UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Mesh;//使用前置声明避免头文件增加复杂度UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle1;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle2;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle3;UPROPERTY(VisibleAnywhere)class UStaticMeshComponent* Paddle4;UPROPERTY(VisibleAnywhere)class UPhysicsThrusterComponent* UpThruster;UPROPERTY(VisibleAnywhere)class UPhysicsThrusterComponent* ForwardThruster;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float LiftAcc = 20000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float LiftThrustMax = 2000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float ForwardAcc = 5000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float ForwardThrustMax = 2000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float TurnStrength = 500000.0f;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")float PaddleRotateSpeed = 500.0f;//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Init")//TSubclassOf<class AMissle> Bullet;
protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;void Lift(float aixs);void Forward(float aixs);void Turn(float aixs);void Fire();//定义了一个数组存储所有螺旋桨TArray<UStaticMeshComponent*> Paddles;//旋转螺旋桨void RotatePaddle(float dt);
public:// Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;UFUNCTION(BlueprintCallable)void SetPossess();
};
无人机功能的实现,首先包含需要的头文件,和构造时初始化组件,设置位置参数等。
#include "Drone.h"
#include "Components/StaticMeshComponent.h"
#include "Components/BoxComponent.h"
#include "PhysicsEngine/PhysicsThrusterComponent.h"
#include "Kismet/KismetMathLibrary.h"
#include <Kismet/GameplayStatics.h>ADrone::ADrone()
{// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;OutCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("OutCollision"));RootComponent = OutCollision;OutCollision->SetBoxExtent(FVector(90.0f, 90.0f, 40.0f));OutCollision->SetSimulatePhysics(true);OutCollision->BodyInstance.bLockXRotation = true;OutCollision->BodyInstance.bLockYRotation = true;//UE的C++中,UE自己的类是由UE自己来管理生命周期的,如果要创建UE的对象需要使用专门的对应的函数来创建Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));Mesh->SetupAttachment(OutCollision);Paddle1 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle1"));Paddle2 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle2"));Paddle3 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle3"));Paddle4 = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Paddle4"));Paddle1->SetupAttachment(Mesh, TEXT("Paddle1"));Paddle2->SetupAttachment(Mesh, TEXT("Paddle2"));Paddle3->SetupAttachment(Mesh, TEXT("Paddle3"));Paddle4->SetupAttachment(Mesh, TEXT("Paddle4"));//将元素加入到数组Paddles.Add(Paddle1);Paddles.Add(Paddle2);Paddles.Add(Paddle3);Paddles.Add(Paddle4);UpThruster = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("UpThruster"));UpThruster->SetupAttachment(RootComponent);UpThruster->ThrustStrength = 980.0f;UpThruster->SetAutoActivate(true);UpThruster->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(-this->GetActorUpVector()));ForwardThruster = CreateDefaultSubobject<UPhysicsThrusterComponent>(TEXT("ForwardThruster"));ForwardThruster->SetupAttachment(RootComponent);ForwardThruster->ThrustStrength = 0.0f;ForwardThruster->SetAutoActivate(true);ForwardThruster->SetWorldRotation(UKismetMathLibrary::MakeRotFromX(-this->GetActorForwardVector()));}
然后,在Tick函数里,做动画。螺旋桨动画,和前倾,旋转等。因为Tick是和帧数相关的循环。不会出现明显抖动。如果用定时器,就有可能卡帧抖动。
// Called every frame
void ADrone::Tick(float DeltaTime)
{Super::Tick(DeltaTime);APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);APawn* tmpPawn = tmpPC->GetPawn();if (tmpPawn) {ADrone* TmpCamPawn = Cast<ADrone>(tmpPawn);if (TmpCamPawn) {//松开的时候可以维持悬停if (InputComponent->IsValidLowLevel()){if (FMath::Abs(InputComponent->GetAxisValue(TEXT("Lift"))) < 0.000001f){UpThruster->ThrustStrength = 980.0f;}//没有输入就取消前进推力if (FMath::Abs(InputComponent->GetAxisValue(TEXT("Forward"))) < 0.000001f){ForwardThruster->ThrustStrength = 0.0f;}}//调用旋转螺旋桨RotatePaddle(DeltaTime);//复原倾斜度float pitch = Mesh->GetRelativeRotation().Pitch;if (FMath::Abs(pitch) > KINDA_SMALL_NUMBER){Mesh->AddRelativeRotation(FRotator(-pitch * DeltaTime, 0.0f, 0.0f));if (FMath::Abs(Mesh->GetRelativeRotation().Pitch) <= KINDA_SMALL_NUMBER){Mesh->SetRelativeRotation(FRotator(0.0f, 0.0f, 0.0f));}}}}}
绑定输入,因为这个输入是特殊的,没有其它的Pawn和它相同。所以就写在Pawn肉体上,其实写在灵魂PlayerController上也可以。让后就是,通过物理喷射器,向前喷射多大的力,向上喷射多大的力,让无人机在移动上模仿物理效果,结合动画,就完成了无人机。这里要将碰撞的阻尼系数,勾上。不然没有摩擦力,无人机收到喷射,就会一直加速,越来越快。停不下来。
// Called to bind functionality to input
void ADrone::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);//轴事件函数不管有没有输入事件,都会每帧调用PlayerInputComponent->BindAxis(TEXT("Lift"), this, &ADrone::Lift);PlayerInputComponent->BindAxis(TEXT("Forward"), this, &ADrone::Forward);PlayerInputComponent->BindAxis(TEXT("Turn"), this, &ADrone::Turn);PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &ADrone::Fire);}void ADrone::SetPossess()
{APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);if (tmpPC->IsValidLowLevel()){tmpPC->Possess(this);}
}void ADrone::Lift(float aixs)
{if (aixs != 0){UpThruster->ThrustStrength += aixs * LiftAcc * GetWorld()->DeltaTimeSeconds;UpThruster->ThrustStrength = FMath::Clamp(UpThruster->ThrustStrength, -LiftThrustMax, LiftThrustMax);}}void ADrone::Forward(float aixs)
{ForwardThruster->ThrustStrength += aixs * ForwardAcc * GetWorld()->DeltaTimeSeconds;ForwardThruster->ThrustStrength = FMath::Clamp(ForwardThruster->ThrustStrength, -ForwardThrustMax, ForwardThrustMax);float pitch = FMath::Abs(Mesh->GetRelativeRotation().Pitch);if (pitch < 30.0f){Mesh->AddRelativeRotation(FRotator(-100.0f * aixs * GetWorld()->DeltaTimeSeconds, 0.0f, 0.0f));}
}void ADrone::Turn(float aixs)
{OutCollision->AddTorqueInDegrees(-this->GetActorUpVector() * TurnStrength * aixs);
}void ADrone::Fire()
{//FTransform firetransform = Mesh->GetSocketTransform(TEXT("FireSocket"));//UClass* bullet = StaticLoadClass(AMissle::StaticClass(), NULL, TEXT("Blueprint'/Game/MyMissle.MyMissle_C'"));//AActor* bullet = Cast<AActor>(StaticLoadObject(AMissle::StaticClass(), NULL, TEXT("/Game/MyMissle")));//bullet->SetActorTransform(firetransform);//GetWorld()->SpawnActor<AMissle>(bullet, firetransform);
}void ADrone::RotatePaddle(float dt)
{for (auto paddle : Paddles){paddle->AddRelativeRotation(FRotator(0.0f, dt * PaddleRotateSpeed, 0.0f));}
}
相关文章:
多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现
一.创建自己的PlayerController。它相当于是灵魂,穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使,都有鼠标操作,也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...
[学习]RTKLib详解:ionex.c、options.c与preceph.c
RTKLib详解:ionex.c、options.c与preceph.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解&…...
【Linux笔记】——进程信号的保存
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——进程信号的产生 🔖流水不争,争的是滔滔不 一、信号的相关概念二、信…...
教育机构教务管理系统哪个好?
在当今教育培训行业快速发展的背景下,一个高效、专业的教务管理系统已成为教育机构提升运营效率、优化教学质量的关键工具。本文将深入分析爱耕云教务管理系统的核心优势,通过具体功能解析和代码示例展示其技术实现方式,并对比市场上其他主流…...
ZYNQ笔记(二十):Clocking Wizard 动态配置
版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…...
电商平台一站式网络安全架构设计指南
摘要:据 Gartner 统计,采用一体化安全方案的电商企业数据泄露成本降低 67%。本文从攻击链分析到防御体系构建,详解如何实现网络层、应用层、数据层的协同防护。 一、电商安全威胁全景图(2024 攻击态势) 1.1 攻击者完…...
烟花爆竹储存需要注意哪些问题
烟花爆竹储存需要注意哪些问题 烟花爆竹作为易燃易爆物品,其储存安全至关重要。不当的储存方式不仅可能导致产品失效,更可能引发火灾、爆炸等严重事故。以下是烟花爆竹储存需要注意的几个关键问题: 一、储存场所选择 必须选择专用仓库储存…...
C++11详解
文章目录 前言一、列表初始化1.1 {} 初始化1.2 initializer_list 类型 三、声明3.1 auto3.2 decltype 四、右值引用和移动语义4.1 左值引用和右值引用4.2 移动语义 五、可变参数模板六、lambda表达式各部分详细解释示例代码代码解释 七、包装器八、bind注意事项 前言 C11在系统…...
VLM-RL:用于安全自动驾驶的统一视觉语言模型和强化学习框架——论文阅读
《VLM-RL: A Unified Vision Language Models and Reinforcement Learning Framework for Safe Autonomous Driving》2024年12月发表,来自Wisconsin Madison分校和Purdue大学的论文。 近年来,基于强化学习(RL)的学习驾驶策略的方法…...
新手安装java所有工具(jdk、idea,Maven,数据库)
新手安装JAVA工具 介绍JDK11IDEA 2025.1Maven数据库(Navicat Premium Lite) 介绍 涉及安装JAVA所需的各种工具 JDK(以JDK11为例)IDEA(以2025.1为例)Maven(以3.8.8为例)数据库&…...
hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错
在hive-site.xml文件中加入配置hive.metastore.uris启动hive后报错 <property><name>hive.metastore.uris</name><value>thrift://node154:9083</value></property> 加完属性就需要手动启动metastore服务,因为不使用 Zookeepe…...
Hive原理
Hive 是构建在 Hadoop 上的数据仓库工具,其核心原理是通过类 SQL 语言(HiveQL)将结构化数据查询转换为分布式计算任务(如 MapReduce、Tez、Spark),并利用 HDFS 存储数据。以下是 Hive 的核心原理和架构: 1. 核心设计思想 数据仓库抽象:将 HDFS 上的文件抽象为…...
cursor 出现 unauthorized request
文档出自:https://www.kdocs.cn/l/csE3iuSauHoS...
uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)
以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟动画元素控制代码实现详解模板层设计脚本…...
点下4个Winform UI开源控件库
从零学习构建一个完整的系统 今天一起来盘点下4个Winform UI开源控件库,有.Net Framework,也有.Net Core。 1、支持.Net 7的开源UI组件框架 项目简介 这是一个基于.Net Framework、.Net 6开发的,WinForm开源UI框架,框架包含常…...
【AI】mcp server本质就是一个接口服务么
以下为元宝的回答: 你的理解非常准确!MCP Server本质上是一个接口服务,但其设计目标、交互逻辑和使用场景与传统后端接口存在显著差异。以下是两者的对比分析: 1. 核心定位差异 维度MCP Server…...
chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法
chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法 背景: charles用了好长时间了,最近发现打开charles有些软件无法上网,浏览器访问网页提示“您的连接不是私密链接”,按照网上的教程重装了几次证书&#x…...
如何通过DNS解析实现负载均衡?
在当今的互联网时代,随着网络应用的飞速发展,网站和各类在线服务面临着海量的用户请求。为了保障服务的高可用性和高性能,负载均衡技术应运而生。DNS(域名系统)负载均衡作为其中一种重要的实现方式,凭借其简…...
uni-app微信小程序登录流程详解
文章目录 uni-app微信小程序登录流程实战详解微信小程序登录流程概述1. 获取登录凭证(code)2. 发送登录请求3. 保存登录态4. 登录状态管理5. 应用登录状态请求拦截器中添加 token自动登录页面路由守卫 使用 Vuex 集中管理登录状态登录组件示例登录流程最…...
基于LVS和Keepalived实现高可用负载均衡架构
目录 一、资源清单 二、修改主机名 三、配置调度器 四、配置Web节点服务器(web1、web2) 五、测试负载均衡 六、测试LVSKeepalived高可用群集 一、资源清单 主机 操作系统 IP地址 lb01 OpenEuler24.03 192.168.16.142 lb02 OpenEuler24.03 …...
微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg
实现效果 效果: 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案,支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …...
EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业
各位枚举操控师们好!今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀",能让你的枚举操作从石器时代直接跃迁到星际文明! 一、为什么需要EnumUtils? 手动操作枚举就像…...
在Taro中开发一个跨端Svg组件,同时支持小程序、H5、React Native
Taro系列中一直没有跨端的绘图工具,小程序端支持canvas但是不支持svg,RN端有 react-native-svg 支持svg,但是没有很好原生的canvas插件,社区的canvas都是基于WebView实现的,或者skia,这个插件的书写方式和c…...
大型视频学习平台项目问题解决笔记
一 数据库大量读操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 缓存 二 数据库大量写操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 改同步写为异步写——解决复杂事务的高并发写 3. 合并写请求——解决简单事务的高并发写(额外实现一个异步操作来…...
day18-数据结构引言
一、 概述 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 1.1 特定关系: 1. 逻辑结构 2.物理结构(在内存当中的存储关系) 逻辑结构物理结构集合,所有数据在同一个集合中,关系平等顺…...
Android音频解码中的时钟同步问题:原理、挑战与解决方案
一、为什么音频同步如此重要? 在多媒体播放系统中,音频同步问题直接影响用户体验。根据行业研究数据: • 15ms以上的同步偏差:53%的用户能感知到音画不同步 • 超过100ms的偏差:会导致明显的"口型对不上"现…...
深入浅出 iOS 对象模型:isa 指针 与 Swift Metadata
在 iOS 开发中,我们经常听到两个看似神秘的词:isa 指针 和 Metadata。这两个概念分别源自 Objective-C 和 Swift 的对象系统,是我们理解底层运行机制、优化性能乃至调试疑难问题的关键。今天我们就来聊一聊,它们到底是什么&#x…...
ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S
上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细,主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...
Lynx-字节跳动跨平台框架多端兼容Android, iOS, Web 原生渲染
介绍 字节跳动近期开源的跨平台框架Lynx被视为一项重要的技术创新。相较于市场上已有的解决方案如React Native (RN) 和Flutter,Lynx具有独特的特性。 首先,Lynx采用轻量级JavaScript逻辑设计,DOM节点构建完全置于Native层,确保U…...
手机换地方ip地址会变化吗?深入解析
在移动互联网时代,我们经常带着手机穿梭于不同地点,无论是出差旅行还是日常通勤。许多用户都好奇:当手机更换使用地点时,IP地址会随之改变吗?本文将深入解析手机IP地址的变化机制,帮助您全面了解这一常见但…...
Linux——数据库备份与恢复
一,Mysql数据库备份概述 1,数据库备份的重要性 数据灾难恢复:数据库可能会因为各种原因出现故障,如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份,就可以…...
矩阵键盘模块
目录 1.矩阵键盘介绍 2.扫描的概念 数码管扫描(输出扫描) 矩阵键盘扫描(输入扫描) 矩阵按键采用逐行扫描: 3.矩阵键盘代码 第一步: 第二步: 第三步: 第四步࿱…...
连接词化归律详解
1. 连接词化归律的基本概念 连接词化归律(也称为归结原理)是数理逻辑中用于简化逻辑表达式的重要方法,它允许我们将复杂的逻辑表达式转化为更简单的等价形式,特别是转化为合取范式(CNF)或析取范式(DNF)。 核心思想 连接词化归律基于一系列逻辑等价关系…...
Ubuntu 18.04 iso文件下载
参考:https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网: https://rufus.ie/zh/ 镜像下载地址 阿里云镜像站:https://mirrors.aliyun.com/ubuntu-releases/18.04/ 网易镜像:http://mirrors.163.com/ub…...
【C#】ToArray的使用
在 C# 中,ToArray 方法通常用于将实现了 IEnumerable<T> 接口的集合(如 List<T>)转换为数组。这个方法是 LINQ 提供的一个扩展方法,位于 System.Linq 命名空间中。因此,在使用 ToArray 方法之前࿰…...
学习日志03 java
最近有点懈怠了,多多实践,多敲代码,多多专注! 1 ArithmeticException ArithmeticException 是 Java 中的一个异常类,它继承自 RuntimeException,用于表示在算术运算中出现的错误。这个异常通常在以下情况…...
数据库故障排查指南
对于项目研发来讲,数据库是必不可少的一个重要环节,本文详细总结了项目研发中数据库故障问题排查指南,希望会对大家有所帮助。 数据库连接问题 检查数据库服务是否正常运行,确认网络连接是否畅通,验证数据库配置文件…...
洛谷 P1955 [NOI2015] 程序自动分析
【题目链接】 洛谷 P1955 [NOI2015] 程序自动分析 【题目考点】 1. 并查集 2. 离散化 【解题思路】 多组数据问题,对于每组数据,有多个 x i x j x_ix_j xixj或 x i ≠ x j x_i \neq x_j xixj的约束条件。 所有相等的变量构成一个集合&…...
音视频学习:使用NDK编译FFmpeg动态库
1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包,可以直接下载解压: wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …...
OpenHarmony Linux内核本地管理
概述 写这篇文章的初衷,其实也是作者从事多年Android系统开发中,根深蒂固的目录情节导致的,再开发Harmony系统中,总是想模拟Android系统的开发思路。 对于OpenHarmony这个patch机制,其实我很讨厌它,虽然这样…...
2025最新出版 Microsoft Project由入门到精通(六)
目录 三种资源类型的分配方式 成本类资源的分配方式 第一步:切换视图为”任务分配状况“视图 第二步:选中任务→资源→分配资源,打开分配资源窗口选择资源单击”分配“ 资源成本的修改方式 编辑工时类资源的分配方式 工时类资源的…...
Tomcat服务部署
目录 一. Tomcat概述 1.1 什么是Tomcat 1.2 安装Tomcat 1.2.1 CentOS7 安装 1.2.2 ubuntu 安装 1.2.3 使用脚本快速安装 二. 配置文件及核心组件 2.1 配置文件 2.1.1 安装目录下文件介绍 2.1.2 conf子目录 2.2 组件 三. tomcat 处理请求过程 四. 常见配置详解 4.…...
Chrome更新到136以后selenium等自动化浏览器失效
Chrome更新到136以后,已经不再支持对默认浏览器数据文件夹进行自动化调试,从而导致selenium在指定user-data-dir为默认路径“C:\Users\{计算机名}\AppData\Local\Google\Chrome\User Data”会报错,相应地的selenium-wire,undetect…...
数据库原理期末考试速成--最后附带两套题
引言 为什么从3开始呢,毕竟是速成吗,总要放弃一些东西 前两章1.概论 2.关系数据库:这里面都是一些运算符什么的,我感觉都学这个:笛卡尔积之列的都会算 这两章比较重要的我就放在这里了 选择、投影、连接、除、并、交、差,其中选择、投影、并、差、笛卡尔积是5种基本关…...
网络基础1(应用层、传输层)
目录 一、应用层 1.1 序列化和反序列化 1.2 HTTP协议 1.2.1 URL 1.2.2 HTTP协议格式 1.2.3 HTTP服务器示例 二、传输层 2.1 端口号 2.1.1 netstat 2.1.2 pidof 2.2 UDP协议 2.2.1 UDP的特点 2.2.2 基于UDP的应用层…...
使用Spring Boot集成Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它集成了服务发现、服务配置和服务管理等功能,是微服务架构中一个非常重要的组件。以下是使用Spring Boot集成Nacos的详细步骤。 1. 环境准备 确保你已经安装和配置了以下环境࿱…...
破局智算瓶颈:400G光模块如何重构AI时代的网络神经脉络
一、技术演进与市场需求双重驱动 在数字化转型浪潮下,全球互联网流量正以每年30%的复合增长率持续攀升。根据Dell’Oro Group最新报告,2023年400G光模块市场规模已突破15亿美元,预计2026年将占据数据中心光模块市场60%以上份额。这种爆发式增…...
Vue:插值表达
Vue 的插值表达式是数据绑定的基础形式,它通过 {{ }} 将 JavaScript 数据动态渲染到模板中。下面通过代码示例,直观感受它的用法和限制。 基础用法 <template><div><!-- 直接显示数据 --><p>{{ messag…...
26考研|数学分析:函数列与函数项级数
前言 函数列与函数项级数这一章虽然课本安排章节较少,只要两小节,但是在具体学习过程中,确实会有一定的难度,首先难点便是在对于函数列与函数项级数的理解,其次关于一致收敛性质的理解与判断,也是难点所在…...
设置环境变量启动jar报
1. 环境变量设置 set PATHC:\Program Files\java17\jdk-17.0.9\bin;%PATH%2. 启动jar java -jar jar包名3. 记录原因 PATH路径前添加java执行文件路径才会管用。添加后可以试试以下命令 直接输入PATH 回车 PATH进行java版本测试 java -version...