【C++风云录】环境声音处理与音响设计:技术精粹与实际应用

音频编程的艺术:深度解析六大音频引擎和库

前言

音频技术在游戏开发和环境声音处理中扮演着重要角色。本文将介绍六种不同的音频引擎和库,分别是SoLoud、Radium、FMOD、BASS、PortAudio和OpenAL,并探讨他们的功能以及在各个领域的应用。

欢迎订阅专栏:C++风云录

文章目录

  • 音频编程的艺术:深度解析六大音频引擎和库
    • 前言
    • 1. SoLoud:跨平台音频引擎,适用于游戏开发和环境声音处理
      • 1.1 功能介绍
      • 1.2 SoLoud在游戏开发中的应用
      • 1.3 SoLoud在环境声音处理中的应用
    • 2. Radium:用于声音合成和音频处理的 C++ 库
      • 2.1 功能介绍
      • 2.2 声音合成的实现方法
      • 2.3 音频处理的实现方法
    • 3. FMOD: 动态音频工具包
      • 3.1 功能介绍
      • 3.2 在游戏音效设计中的应用
      • 3.3 在环境音效模拟中的应用
    • 4. BASS: 高级的音频库
      • 4.1 功能介绍
      • 4.2 在3D音效设计中的应用
      • 4.3 在音乐播放器开发中的应用
    • 5. PortAudio: 跨平台音频I/O库
      • 5.1 功能介绍
      • 5.2 在音频信号采集与处理中的应用
      • 5.3 在音频设备管理中的应用
    • 6. OpenAL: 一个跨平台的3D音频API
      • 6.1 功能介绍
      • 6.2 在3D音效创建中的应用
      • 6.3 在虚拟现实中的应用
    • 总结

1. SoLoud:跨平台音频引擎,适用于游戏开发和环境声音处理

SoLoud是一款高效的跨平台音频引擎,主要应用于游戏开发和环境声音处理。具体来看,它提供了处理音频信号、生成声音效果等核心功能。点击这里访问SoLoud官方网站

1.1 功能介绍

SoLoud提供了丰富的功能,下面是**C++**示例代码来展示如何使用SoLoud的基本功能:

#include "soloud.h"
#include "soloud_wav.h"

//创建一个Soloud对象和一个Wav对象
Soloud soloud;
Wav wav;

//加载wav文件
wav.load("test.wav");

//初始化Soloud
soloud.init();

//播放wav文件
soloud.play(wav);

//等待键盘输入之后关闭Soloud并释放wav资源
std::cin.get();
soloud.deinit();

1.2 SoLoud在游戏开发中的应用

在游戏开发过程中,SoLoud可以用于处理游戏中的背景音乐、角色对白、音效等。以下是以**C++**为语言的示例代码:

#include "soloud.h"
#include "soloud_wav.h"

Soloud soloud;  //所需要的soloud引擎对象
Wav background_music, effect_sound;  //背景音乐和效果音文件

background_music.load("background_music.wav");  //加载背景音乐
effect_sound.load("effect_sound.wav");  //加载效果音

soloud.init();  //初始化soloud
soloud.play(background_music);  //播放背景音乐

//在适当的时机播放效果音
soloud.play(effect_sound);

std::cin.get();
soloud.deinit();  //关闭soloud并释放资源

1.3 SoLoud在环境声音处理中的应用

SoLoud也可以应用在环境声音处理中,例如调整音量、添加混响效果等。以下是**C++**示例代码:

#include "soloud.h"
#include "soloud_echofilter.h"
#include "soloud_biquadresonantfilter.h"

Soloud soloud;
Wav sound;
EchoFilter echo;
BiquadResonantFilter biquad;

//加载声音文件并设置参数
sound.load("test.wav");
sound.setVolume(1.5f);  //调整音量

//添加混响效果
echo.setParams(0.7f, 0.7f, 0.7f);
sound.setFilter(0, &echo);

//添加双二阶共振滤波器
biquad.setParams(BiquadResonantFilter::NONE, 44100, 440, 1, 0);
sound.setFilter(1, &biquad);

soloud.init();
soloud.play(sound);

std::cin.get();
soloud.deinit();

以上就是SoLoud在游戏开发和环境声音处理中的应用示例,如果你想了解更多详情,欢迎访问SoLoud官方网站。

2. Radium:用于声音合成和音频处理的 C++ 库

Radium是一个专门为声音合成和音频处理设计的C++库。你可以在Radium官网上找到更多信息。

2.1 功能介绍

Radium库提供了一组类,可以帮助开发者快速实现声音合成和音频处理功能。这包括但不限于滤波器、混响效果、延迟效果等。

#include <Radium/Sound/SoundEngine.h>
// 创建SoundEngine对象
Radium::SoundEngine soundEngine;
// 使用soundEngine进行声音处理或合成

2.2 声音合成的实现方法

使用Radium库进行声音合成非常简单直接,你只需要创建合适的合成器对象,然后将其添加到声音引擎中即可。

#include <Radium/Sound/SoundEngine.h>
#include <Radium/Sound/Synthesizer.h>
// 创建SoundEngine对象
Radium::SoundEngine soundEngine;
// 创建Synthesizer对象
Radium::Synthesizer synthesizer;
// 将synthesizer添加到soundEngine中
soundEngine.addSynthesizer(&synthesizer);

2.3 音频处理的实现方法

Radium库也提供了丰富的音频处理功能,例如滤波、混响、延迟等。下面是一个使用Radium实现音频滤波的例子:

#include <Radium/Sound/SoundEngine.h>
#include <Radium/Sound/Filter.h>
// 创建SoundEngine对象
Radium::SoundEngine soundEngine;
// 创建Filter对象
Radium::Filter filter;
// 将filter添加到soundEngine中
soundEngine.addEffect(&filter);

以上的所有代码示例都是基础的,你可以根据自己的需求修改并增加更多功能。具体的API文档和更详细的使用说明可以在Radium官方文档中找到。# FMOD: 动态音频工具包

3. FMOD: 动态音频工具包

FMOD是一款动态音频中间件,用于游戏和多媒体应用的音频实现。详细信息可以在官方网站中找到 FMOD 官网.

3.1 功能介绍

FMOD提供了一个强大且灵活的API来播放复杂的音频设计。它不仅支持常规音频格式,如MP3、WAV和OGG,还可通过代码修改音频效果。

#include <fmod.hpp>
...
FMOD::System     *system;
FMOD::Sound      *sound1, *sound2, *sound3;
FMOD::Channel    *channel = 0;
FMOD_RESULT       result;
unsigned int      version;
void             *extradriverdata = 0;

// Create FMOD interface object
result = FMOD::System_Create(&system);

// Check version
system->getVersion(&version);

// Initialize FMOD system
system->init(32, FMOD_INIT_NORMAL, extradriverdata);

// Create sound
result = system->createSound("../media/drumloop.wav", FMOD_DEFAULT, 0, &sound1);

// Play the sound
result = system->playSound(sound1, 0, false, &channel);

这段C++代码创建了一个FMOD系统对象,检查了版本,初始化了系统,载入了声音文件,并播放了声音。

3.2 在游戏音效设计中的应用

在游戏音效设计中,FMOD扮演着重要的角色。开发人员可以通过FMOD实现更丰富、更复杂的音效设计,增强游戏的代入感和趣味性。

FMOD提供的音频混合功能允许开发人员按照自己的想法混合不同的音频源,以产生新的声音效果。同时,其提供的DSP(数字信号处理)插件可以进一步改变声音的各种特性。

3.3 在环境音效模拟中的应用

除了在游戏音效设计中的应用,FMOD也广泛用于虚拟现实和增强现实应用中的环境音效模拟。利用FMOD,开发者可以模拟出真实世界中的音频场景,如回声、混响、距离衰减等。

// Create a reverb effect
FMOD::Reverb3D *reverb;
system->createReverb3D(&reverb);

// Set the reverb properties
FMOD_REVERB_PROPERTIES prop = FMOD_PRESET_CONCERTHALL;
reverb->setProperties(&prop);

// Position the reverb in the world
FMOD_VECTOR pos = { 0.0f, 0.0f, 0.0f };
reverb->setPosition(&pos);

这段代码创建了一个新的混响效果,设置其属性为音乐厅预设,并把它定位在世界的中心。通过模拟声音在特定环境中的传播情况,可以创造出非常逼真的音频体验。
注意:在使用任何功能之前,都必须先初始化FMOD系统。

4. BASS: 高级的音频库

BASS是一个先进的音频库,旨在为开发人员提供强大、简单和高效的音频功能。它支持各种音频格式,包括MP3,MP2,MP1,OGG,WAV,AIFF等。此外,BASS还具有强大的3D音效设计和音乐播放器开发能力,使其成为音频处理领域中的理想选择。

BASS官网:BASS Audio Library

4.1 功能介绍

BASS库提供了许多强大的功能,包括:

  • 支持多种音频格式,如MP3, MP2, MP1, OGG, WAV, AIFF, Custom generated等。
  • 提供录音功能。
  • 支持3D音效设计。
  • 可播放并从Internet上流媒体。

以下是一个简单的示例,展示了如何使用BASS库播放一个音频文件:

#include "bass.h"

int main() {
    if (!BASS_Init(-1, 44100, 0, 0, NULL)) {
        return 1;
    }

    HSTREAM streamHandle = BASS_StreamCreateFile(FALSE, "test.mp3", 0, 0, 0);
    
    if (streamHandle == 0) {
        return 1;
    }

    BASS_ChannelPlay(streamHandle, FALSE);

    while (BASS_ChannelIsActive(streamHandle)) {
        Sleep(1000);
    }

    BASS_Free();
    return 0;
}

4.2 在3D音效设计中的应用

BASS库对于3D音效设计也非常有帮助。通过控制声源和听众的位置、速度等因素,可以实现真实的3D音效效果。

这是一个简单的示例,展示了如何使用BASS库创建3D音效:

#include "bass.h"

int main() {
    if (!BASS_Init(-1, 44100, BASS_DEVICE_3D, 0, NULL)) {
        return 1;
    }

    BASS_Set3DFactors(1.0, 1.0, 0.0);

    HSTREAM streamHandle = BASS_StreamCreateFile(FALSE, "test.wav", 0, 0, BASS_SAMPLE_3D);
    
    if (streamHandle == 0) {
        return 1;
    }

    BASS_ChannelSet3DPosition(streamHandle, {10.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0});

    BASS_Apply3D();

    BASS_ChannelPlay(streamHandle, FALSE);

    while (BASS_ChannelIsActive(streamHandle)) {
        Sleep(1000);
    }

    BASS_Free();
    return 0;
}

4.3 在音乐播放器开发中的应用

BASS库也可用于开发音乐播放器。下面是一个使用BASS库的简单音乐播放器代码示例:

#include "bass.h"

int main() {
    if (!BASS_Init(-1, 44100, 0, 0, NULL)) {
        return 1;
    }

    HSTREAM streamHandle = BASS_StreamCreateFile(FALSE, "test.mp3", 0, 0, 0);
    
    if (streamHandle == 0) {
        return 1;
    }

    BASS_ChannelPlay(streamHandle, FALSE);

    while (BASS_ChannelIsActive(streamHandle)) {
        Sleep(1000);
    }

    BASS_Free();
    return 0;
}

通过BASS库,我们可以轻松地实现音频播放、暂停、停止、快进、后退等功能。

5. PortAudio: 跨平台音频I/O库

PortAudio是一个跨平台的音频I/O库,用于处理复杂的音频信号采集、处理和设备管理任务。该库支持各种操作系统,包括Windows、Mac OS X和许多Unix/Linux变体。官方网站链接

5.1 功能介绍

PortAudio提供了一套简单的API,用于录制和播放音频。以下是一些主要功能:

  • 支持不同的音频接口,包括ASIO, DirectSound, WASAPI等
  • 支持回调或阻塞读写接口
  • 支持浮点和16位样本格式
  • 支持多通道音频

以下是一个简单的使用PortAudio进行音频录制的C++代码示例:

#include "portaudio.h"

#define SAMPLE_RATE  (17932) // Test failure to open with this value.
#define FRAMES_PER_BUFFER (512)
#define NUM_SECONDS     (5)
#define NUM_CHANNELS    (2)
/* #define DITHER_FLAG     (paDitherOff) */
#define DITHER_FLAG     (0) 

typedef float SAMPLE;
#define PA_SAMPLE_TYPE  paFloat32
#define SAMPLE_SILENCE  (0.0f)
#define PRINTF_S_FORMAT "%.8f"

int main(){
//初始化PortAudio
PaError err = Pa_Initialize();
if( err != paNoError ) 
    printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );

//开始音频处理

//结束音频处理
err = Pa_Terminate();
if( err != paNoError ) 
    printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) );
return 0;
}

5.2 在音频信号采集与处理中的应用

PortAudio能够在实时环境下处理音频信号,如下所示的C++代码片段展示了如何使用PortAudio来采集音频数据:

//定义流变量
PaStream *stream;

//打开默认的输入设备
err = Pa_OpenDefaultStream(&stream,
                           2,          // 双声道输入
                           0,          // no output
                           paFloat32,  // 32 bit floating point input
                           SAMPLE_RATE,
                           256,        // frames per buffer
                           NULL,       // callback function (not used here)
                           NULL);      // no callback data

这段代码首先定义了一个流变量,然后使用Pa_OpenDefaultStream函数打开默认的输入设备进行音频数据采集。

5.3 在音频设备管理中的应用

PortAudio提供了一系列接口供用户查询音频设备的信息,以下代码片段展示了如何使用PortAudio获取系统内所有音频设备的信息:

//获取PortAudio设备数量
int numDevices = Pa_GetDeviceCount();
if( numDevices < 0 ){
    printf("ERROR: Pa_CountDevices returned 0x%x\n", numDevices );
}

//遍历所有设备并打印信息
for( int i=0; i<numDevices; i++ )
{
    const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo( i );
    printf( "Name = %s\n", deviceInfo->name );
}

以上代码首先通过Pa_GetDeviceCount获取到系统内音频设备的数量,然后遍历所有设备,并通过Pa_GetDeviceInfo获取每一个设备的信息。

6. OpenAL: 一个跨平台的3D音频API

OpenAL,全称Open Audio Library,是一款开源的音频库,提供了一套用于渲染3D(以及2D)音频效果的API。它的设计目标是为各种类型的应用程序(从游戏到虚拟现实系统)提供全方位的音频支持。

更多信息请参见OpenAL 官网链接

6.1 功能介绍

OpenAL提供以下主要功能:

  • 3D立体声定位:可根据不同音源在三维空间中的位置和听者的位置、方向来调整音效。
  • 音频流处理:针对长音轨,如背景音乐,OpenAL能实时处理音频流,无需预加载全部数据。
  • 音效混合:支持多音源同时播放,并能处理音源之间的相互影响。

下面是一个简单的C++代码示例,展示如何使用OpenAL播放3D音效:

#include <AL/al.h>
#include <AL/alc.h>

// 初始化设备和上下文
ALCdevice *device = alcOpenDevice(NULL);
ALCcontext *context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);

// 创建音源
ALuint source;
alGenSources(1, &source);

// 加载音效并设置属性
ALuint buffer = loadWAVFile("audio.wav");
alSourcei(source, AL_BUFFER, buffer);
alSource3f(source, AL_POSITION, 0.0f, 0.0f, 0.0f);

// 播放音效
alSourcePlay(source);

// 释放资源
alDeleteSources(1, &source);
alcDestroyContext(context);
alcCloseDevice(device);

6.2 在3D音效创建中的应用

在实际应用中,OpenAL要求你首先定义一个“listener”(即监听者,一般为玩家),然后在3D空间内放置各种“source”(即音源)。你可以控制这些音源的位置、速度以及播放的音频数据,从而实现富有层次感与立体感的3D音效。

以下是一个简单的使用OpenAL播放3D音效的C++代码示例:

#include <AL/al.h>
#include <AL/alc.h>

int main() {
    ALCdevice *device;
    ALCcontext *context;

    device = alcOpenDevice(NULL);
    if(!device) return 0;

    context = alcCreateContext(device, NULL);
    alcMakeContextCurrent(context);
    if(!context) return 0;

    // 在此处添加音频数据处理代码...

    alcMakeContextCurrent(NULL);
    alcDestroyContext(context);
    alcCloseDevice(device);

    return 0;
}

6.3 在虚拟现实中的应用

在虚拟现实(VR)中,音频的重要性不亚于图像。一个真实的3D音效可以极大地增强用户的沉浸感,使得他们感觉自己真的处在虚拟世界之中。OpenAL凭借其对3D音效的强大处理功能,成为了许多VR设备的首选音频解决方案,比如在 Oculus Rift VR 头显中就使用了 OpenAL。

下面的代码展示了如何在 VR 应用中使用 OpenAL 产生一个围绕玩家旋转的音效:

#include <AL/al.h>
#include <AL/alc.h>

void UpdateSoundPosition(ALuint source, float angle) {
    alSource3f(source, AL_POSITION, cos(angle), 0.0, sin(angle));
}

int main() {
    // ...初始化OpenAL设备和上下文...

    ALuint source;
    alGenSources(1, &source);

    float angle = 0.0;
    while (true) {  // 游戏主循环
        // ...其他游戏逻辑...

        UpdateSoundPosition(source, angle);
        angle += 0.01;

        // ...渲染图像...
    }

    // ...清理OpenAL资源...
}

在这个示例中,我们首先通过alGenSources生成一个音源。然后,在游戏的主循环中,我们调用UpdateSoundPosition来改变音源的位置,使得它按照一个固定的角速度围绕玩家(即监听者)旋转。

总结

通过深入探讨SoLoud、Radium、FMOD、BASS、PortAudio和OpenAL这六种音频引擎和库,我们对它们的功能和应用有了更深入的理解,这些工具的存在极大地推动了音频技术的进步和发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/589428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssh远程访问windows系统下的jupyterlab

网上配置这一堆那一堆&#xff0c;特别乱&#xff0c;找了好久整理后发在这里 由于既想打游戏又想做深度学习&#xff0c;不舍得显卡性能白白消耗&#xff0c;这里尝试使用笔记本连接主机 OpenSSH 最初是为 Linux 系统开发的&#xff0c;现在也支持包括 Windows 和 macOS 在内…

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

R语言学习—4—数据矩阵及R表示

1、创建向量、矩阵 在R中&#xff0c;c()函数用于创建向量或组合数据对象。它在某些情况下可能会被省略&#xff0c;因为R有一些隐式的向量创建规则。例如&#xff0c;当你使用:操作符创建一个数字序列时&#xff0c;R会自动创建一个向量&#xff0c;所以你不需要显式地调用c()…

《QT实用小工具·五十二》文本或窗口炫酷有趣的滚动条——果冻条

1、概述 源码放在文章末尾 该项目实现了文本或窗口纤细的滚动条——果冻条 一个可以像弓弦一样拉出来&#xff0c;并且来回弹动的普通滚动条。 思路为此&#xff0c;但发现实际效果更像条状果冻&#xff0c;并且略有谐音&#xff0c; 故&#xff0c;称之为——“果冻条”&am…

条件依赖性的方法示例

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力&#xff0c;条件之间有很强的依赖关系。 例一 如果条件之间有很强的依赖关系&#xff0c;那么简单地计算每个条件独立的…

初探 Google 云原生的CICD - CloudBuild

大纲 Google Cloud Build 简介 Google Cloud Build&#xff08;谷歌云构建&#xff09;是谷歌云平台&#xff08;Google Cloud Platform&#xff0c;GCP&#xff09;提供的一项服务&#xff0c;可帮助开发人员以一致和自动化的方式构建、测试和部署应用程序或构件。它为构建和…

B树:原理、操作及应用

B树&#xff1a;原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索&#xff08;B-TREE-SEARCH&#xff09;2. 插入&#xff08;B-TREE-INSERT&#xff09;3. 删除&#xff08;B-TREE-DELETE&#xff09; 四、B树的C代码实现示例五、…

基于 Wireshark 分析 IP 协议

一、IP 协议 IP&#xff08;Internet Protocol&#xff09;协议是一种网络层协议&#xff0c;它用于在计算机网络中实现数据包的传输和路由。 IP协议的主要功能有&#xff1a; 1. 数据报格式&#xff1a;IP协议将待传输的数据分割成一个个数据包&#xff0c;每个数据包包含有…

mac电脑关于ios端的appium真机自动化测试环境搭建

一、app store 下载xcode,需要登录apple id 再开始下载 二、安装homebrew 1、终端输入命令&#xff1a; curl -fsSL <https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh>如果不能直接安装&#xff0c;而是出现了很多内容&#xff0c;那么这个时候不要着急&…

06.Git远程仓库

Git远程仓库 #仓库种类&#xff0c;举例说明 github gitlab gitee #以这个仓库为例子操作登录码云 https://gitee.com/projects/new 创建仓库 选择ssh方式 需要配置ssh公钥 在系统上获取公钥输入命令&#xff1a;ssh-keygen 查看文件&#xff0c;复制公钥信息内…

【画图】读取无人机IMU数据并打印成log用matlab分析

一、修改IMU频率 原来的imu没有加速度信息&#xff0c;查看加速度信息的指令为&#xff1a; rostopic echo /mavros/imu/data 修改imu频率&#xff0c;分别修改的是 原始IMU数据话题 /mavros/imu/data_raw。飞控计算过后的IMU数据 /mavros/imu/data rosrun mavros mavcmd l…

Uniapp好看登录注册页面

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

【Linux-点灯烧录-SD卡/USB烧写】

目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编&#xff1a;led.elf->led.dis 3. 烧写之烧录到SD卡上&#xff1a;3.1 开启烧录软件权限&#xff1a;3.2 确定SD卡的格式&#xff1a;FAT323.3 烧录到SD卡上3.…

makefile中wildcard函数和patsubst用法

makefile中函数用法 makefile中函数的调用语法&#xff1a; $(<function> <arguments>) 或 ${<function> <arguments>}函数调用以$开头用{}或者()将函数名以及参数包含起来函数名和第一个参数之间以空格分隔参数之间使用逗号分隔 wildcard函数 wil…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

VScode+ubuntu配置ROS开发环境

VScodeubuntu配置ROS开发环境 写在前面 在vscode中先安装几个插件&#xff1a;中文语言包、Python插件、C插件、CMake插件、vscode-icons、ROS插件、Visual Studio IntelliCode、URDF、Markdown All in One 一、工作空间是什么 在ROS机器人开发中&#xff0c;我们针对机器人…

ue引擎游戏开发笔记(27)——解决角色移动及转动存在卡顿掉帧小技巧

1.需求分析&#xff1a; 随之游戏越来越大&#xff0c;难免出现部分时候移动出现卡顿&#xff0c;能否进行一定优化。 2.操作实现&#xff1a; 1.思路&#xff1a;采取捕获最后deltaseconds来逐帧进行旋转或移动&#xff0c;使动作显得不那么卡顿。 .2.首先在引擎中建立映射&a…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

24.5.2数据结构|顺序表实现

主要是记笔记&#xff0c;留着以后复习回来看的&#xff0c;有些内容解释的并不清晰。也就稍微可以借鉴借鉴。 一、如何定义结构&#xff1f; 应该有的部分用来约束的部分 二、看书搞清楚顺序表实现流程 1、准备工作&#xff1a;如何定义结构体&#xff1f;SeqList&#xf…

Acrobat Pro DC 2023:专业PDF编辑软件,引领高效办公新时代

Acrobat Pro DC 2023是一款专为Mac和Windows用户设计的专业PDF编辑软件&#xff0c;凭借其强大的功能和卓越的性能&#xff0c;成为现代职场人士不可或缺的得力助手。 这款软件拥有出色的PDF编辑能力。用户不仅可以轻松地对PDF文档中的文字、图片和布局进行编辑和调整&#xf…
最新文章