news 2026/6/23 22:48:59

外星人入侵项目中为什么绘制飞船和绘制子弹的方法不一样?blit()和pygame.draw.rect()有什么区别?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
外星人入侵项目中为什么绘制飞船和绘制子弹的方法不一样?blit()和pygame.draw.rect()有什么区别?

0.问题描述

自学Python Crash Course, 3rd Edition A Hands-On, Project-Based Introduction to Programming (Eric Matthes) 《Python编程从入门到实践》这本书

在做外星人入侵项目的时候,我发现绘制飞船和绘制子弹的方法不一样,是单纯书想让我们多学一点还是它们本就要用两种不同的方法绘制?


1. 绘制飞船用的是 blit()

self.image = pygame.image.load('images/ship.bmp') self.screen.blit(self.image, self.rect)

为什么?

因为飞船是有一张位图图像(bmp)作为资源。

blit 的作用就是:

把某张图片(Surface)贴到主屏幕 Surface 上某一个位置。

所以,

游戏中所有带图像的东西(角色、敌人、背景、按钮等)都用 blit。

我们可以把 blit 理解成 Photoshop 的“把这个图层贴到画布上”。


2. 绘制子弹用的是 pygame.draw.rect()

pygame.draw.rect(self.screen, self.color, self.rect)

为什么?

因为子弹只是一个长方形,没有图片资源。

我们不需要去加载位图 bmp,直接让 pygame 画一个矩形就够了。

pygame.draw 系列可以画:

  1. rect(矩形)
  2. circle(圆)
  3. line(线)
  4. ellipse(椭圆)
  5. polygon(多边形)

这些是 数学形状,不是图片。


3. 总结

(1)区别

blit 把一张已有的图贴上去;

pygame.draw 根据坐标画一个形状。

一个贴贴纸,一个拿画笔画符号。

更复杂一点就是:

blit 把一块内存复制到另一块(更接近底层图像渲染);

pygame.draw 是一个 CPU 计算几何路径再渲染成像素的过程。

在简单图形上 draw 很快,但复杂阴影/纹理只能靠 blit。

(2)什么时候用 blit?什么时候用 draw?

需要图像细节 —— 用 blit;

只是几何特征 —— 用 draw。


4.补充pygame 的图形渲染逻辑:

  1. fill → 涂背景色
  2. draw / blit → 把所有游戏元素画上去
  3. flip → 把这一帧显示到屏幕

5.补充渲染管线是什么

(1)AlienInvasion就是我们做的一个渲染管线

清空画布 → 画背景 → 画物体 → 画简单几何 → 把这一帧显示出来

也就是每一帧都要重新画整个世界。


(2)真正的渲染管线做了什么

一台 GPU 在每一帧会经历一系列步骤,它的本质是控制流:

输入:数学世界

输出:像素世界

把它拆成我们能一眼看懂的结构:

① 世界坐标 → 相机坐标

世界里物体的位置是数学点(x, y, z)。

第一步是让“摄像机”知道我们在哪。

② 相机坐标 → 屏幕坐标

把 3D 变成 2D。

③ 给物体贴皮肤(纹理)

这个我们见过!

self.screen.blit(self.image, self.rect)

在大游戏里等价于:

把一张纹理图按 UV 坐标贴到 3D 模型表面。

④ 光照计算

光从哪来?

材质反光吗?

阴影怎么打?

是金属还是皮肤?

这是 GPU 最忙的一步,Shader(着色器)就在这里跑。

⑤ 光栅化(rasterization)

把连续的数学曲面,变成屏幕上 2D 像素点。

这是“从数学世界变成像素世界”的真正瞬间。

⑥ 屏幕合成(Frame Buffer → Flip)

这个我们也见过啦:

pygame.display.flip()

但 GPU 的真实版本更复杂:

  1. 混合透明度
  2. 后期处理(HDR、Bloom、Motion Blur)
  3. 抗锯齿
  4. 输出到显示器

  5. (3)总结

渲染管线是一种世界观:

把“数学世界”一步一步转化成可视世界的流程。

正文完。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:46:21

5、内核调试技术全解析

内核调试技术全解析 1. 内核调试的挑战与支持 内核编程面临着独特的调试挑战。内核代码难以在调试器下执行,也不易进行跟踪,因为它是一组与特定进程无关的功能。内核代码错误极难重现,一旦出错可能导致整个系统崩溃,破坏用于追踪错误的大量证据。 为了应对这些挑战,开发…

作者头像 李华
网站建设 2026/6/23 13:39:55

8、Linux内核中的时间处理、延迟与异步工作调度

Linux内核中的时间处理、延迟与异步工作调度 在Linux内核开发中,处理时间相关的问题是非常重要的一部分。本文将深入探讨内核中时间测量、获取当前时间、延迟执行以及异步工作调度的相关内容。 1. 测量时间间隔 内核通过定时器中断来跟踪时间的流逝。定时器中断由系统的定时…

作者头像 李华
网站建设 2026/6/23 19:46:09

10、与硬件通信:I/O端口和内存的使用指南

与硬件通信:I/O端口和内存的使用指南 1. 硬件通信基础 在Linux设备驱动的开发中,实现与真实设备的交互需要考虑硬件因素。驱动程序作为软件概念和硬件电路之间的抽象层,需要与两者进行通信。本文主要介绍驱动程序如何在不同的Linux平台上访问I/O端口和I/O内存。 为了便于…

作者头像 李华
网站建设 2026/6/23 20:53:24

17、Linux 块设备驱动开发全面解析

Linux 块设备驱动开发全面解析 1. 块设备驱动概述 块设备驱动主要用于访问以固定大小块形式传输随机访问数据的设备,像磁盘驱动器。在 Linux 系统里,内核认为块设备和字符设备有着本质区别,这使得块设备驱动有独特的接口和挑战。高效的块设备驱动对系统性能至关重要,它不…

作者头像 李华
网站建设 2026/6/23 3:01:52

20、Linux内核开发资源与技术要点解析

Linux内核开发资源与技术要点解析 1. 资源推荐 在Linux内核开发领域,有许多有价值的资源可供参考。 1.1 书籍资源 书籍名称 作者 出版信息 内容简介 《Understanding the Linux Kernel, Second Edition》 Bovet, Daniel P. 和 Marco Cesate Sebastopol, CA: O’Reill…

作者头像 李华
网站建设 2026/6/22 20:38:01

29、Linux系统启动与电源管理全解析

Linux系统启动与电源管理全解析 1. 系统启动:init程序 在Linux系统中,服务添加依赖关系时,无需不断编辑目标单元文件。目标可以有一个名为 <target_name>.target.wants 的目录,其中可以包含指向服务的链接。这与将依赖单元添加到目标的 [Wants] 列表中完全相同…

作者头像 李华