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

[8-2-2] 队列实验_多设备玩游戏(红外改造)_重录

[8-2-2] 队列实验_多设备玩游戏(红外改造)_重录

在这节课程中,我们将通过改造之前的程序,引入队列来优化多设备交互的游戏体验。之前的程序使用的是环形缓冲区,这种方式CPU资源利用率较低。我们将通过引入队列,改进数据传输的效率,并提高音乐播放和游戏控制的流畅度。接下来,我将带你逐步实现这个改进,讲解每个步骤的原理和改动。

1. 初始程序的分析

首先,我们回顾一下之前的程序框架。原程序的结构如下:

  • 球的链路:控制球的运动和与墙壁、挡板的碰撞。
  • 挡球板的链路:通过读取红外遥控器的按键,控制挡球板的左右移动。

1.1 使用环形缓冲区的问题

在原程序中,挡球板的控制链路是通过环形缓冲区来读取红外遥控器的数据。当读取不到数据时,它会一直循环等待,这导致了CPU的资源被浪费,从而影响了系统的响应时间,尤其是导致音乐播放卡顿。

2. 引入队列进行改造

我们决定将环形缓冲区替换为队列,这样可以解决CPU资源浪费的问题,并提高数据传输效率。队列不仅提供了阻塞和唤醒机制,还能够有效地管理任务间的数据传输。

2.1 队列的使用

我们将通过以下步骤改造程序:

  1. 创建队列:在程序中创建队列来替代环形缓冲区。
  2. 中断中写队列:在红外遥控器的中断服务程序中,将数据写入队列。
  3. 任务读取队列:挡球板的链路将从队列中读取数据,来控制挡球板的移动。

2.2 队列创建与操作

使用队列的基本步骤如下:

  • 创建队列:我们首先需要创建一个队列来存放数据。
  • 写入队列:在红外遥控器的中断服务程序中,将数据写入队列。
  • 读取队列:在挡球板的任务链路中读取队列数据,来控制挡球板的移动。
xQueueHandle queue;
queue = xQueueCreate(10, sizeof(int));  // 创建队列,最多存10个数据

// 向队列写入数据
int data = 1;
xQueueSend(queue, &data, portMAX_DELAY);

// 从队列读取数据
int receivedData;
xQueueReceive(queue, &receivedData, portMAX_DELAY);

3. 改造红外遥控器和旋转编码器的输入

3.1 红外遥控器的数据传输

在原程序中,红外遥控器的数据是通过环形缓冲区传递的。我们将其改为通过队列传递数据。在中断服务程序中解析出数据后,直接写入队列。

// 红外中断服务程序
void IR_ISR() {
    int data = read_ir_data();
    xQueueSend(queue, &data, portMAX_DELAY);  // 写入队列
}

3.2 旋转编码器的数据传输

为了进一步优化,我们还引入了旋转编码器。旋转编码器能够提供更高效的输入,减少响应延迟。旋转编码器的数据将通过另一个队列传递,避免与红外遥控器的数据冲突。

// 旋转编码器中断服务程序
void Encoder_ISR() {
    int speed = read_encoder_speed();
    xQueueSend(encoderQueue, &speed, portMAX_DELAY);  // 写入队列
}

3.3 任务读取旋转编码器的数据

为了实现更流畅的挡球板控制,我们将根据旋转编码器的速度来调整挡球板的移动。如果旋转速度快,我们将写入多个数据以增加挡球板的移动速度。

// 任务读取旋转编码器的数据并调整挡球板位置
void adjust_paddle_position() {
    int speed;
    if (xQueueReceive(encoderQueue, &speed, portMAX_DELAY)) {
        if (speed > THRESHOLD) {
            // 快速旋转,增加移动幅度
            move_paddle(speed);
        } else {
            // 慢速旋转,移动幅度小
            move_paddle(speed / 2);
        }
    }
}

4. 队列的改进:阻塞与唤醒机制

通过使用队列,我们能够提高系统的响应效率。队列的阻塞机制保证了当没有数据可读取时,任务会被阻塞,避免了不必要的CPU消耗。队列的唤醒机制确保了当数据可用时,阻塞的任务会被唤醒,继续执行。

4.1 队列阻塞与唤醒

  • 阻塞:当队列为空时,任务会被阻塞,等待数据的到来。
  • 唤醒:当队列有新数据时,任务会被唤醒并继续执行。

5. 最终效果:更流畅的游戏控制

通过改造后,队列的使用不仅提高了系统的效率,还使得游戏体验更加流畅。通过旋转编码器,我们减少了红外遥控器输入的延迟,使得挡球板的控制更加精确和快速。队列的阻塞与唤醒机制也确保了CPU的高效利用。

5.1 流畅的音乐播放与游戏控制

在程序改进后,音乐播放不再受到影响,同时也能顺利控制挡球板。每当我们按下红外遥控器的按钮或旋转编码器时,系统都会快速响应,控制挡球板的移动,而不会卡顿。

6. 总结

通过这次队列实验,我们成功地优化了原有的程序,使用队列替代了环形缓冲区,不仅提升了数据传输的效率,还改进了系统的响应时间。通过引入旋转编码器,我们进一步提高了挡球板控制的精度和流畅度。

希望通过这篇博客,你能够理解队列在多设备协作中的应用,并掌握如何利用队列优化任务间的数据传输。通过这些技巧,你可以为其他实时任务和多设备系统提供更高效的解决方案。


这篇博客详细介绍了队列的改造过程,并展示了如何通过队列优化游戏控制和音乐播放。希望你能够将这些概念应用到实际开发中,提升你在多任务和多设备环境下的编程能力。


http://www.kler.cn/a/539110.html

相关文章:

  • 数据仓库和商务智能:洞察数据,驱动决策
  • 采用分步式无线控制架构实现水池液位自动化管理
  • 使用Docker + Ollama在Ubuntu中部署deepseek
  • 哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测
  • PHP 运算符
  • 【DeepSeek】DeepSeek概述 | 本地部署deepseek
  • LLMs之DeepSeek r1:TinyZero(复现 DeepSeek R1 Zero 的核心功能)的简介、安装和使用方法、案例应用之详细攻略
  • SpringBoot 接口内容加密方案(RSA+AES+HMAC校验)认知
  • Python基础语法精要
  • 笔记:理解借贷相等的公式
  • Linux debugfs虚拟文件系统
  • COBOL语言的安全开发
  • 背包问题1
  • 交易一张股指期货需要多少钱?
  • Snipaste 截图软件下载与使用教程:附百度网盘地址
  • Leetcode 3449. Maximize the Minimum Game Score
  • 【MQ】Spring3 中 RabbitMQ 的使用与常见场景
  • 2025.2.9机器学习笔记:PINN文献阅读
  • excel拆分表格
  • Processing P5js姓氏数据可视化项目
  • Maven 与企业项目的集成
  • python--sqlite
  • K8s —基础指南(K8s - Basic Guide)
  • DeepSeek本地安装+集成VScode使用
  • LM Studio本地调用模型的方法
  • rockmq配置出现的问题