我是 SDL/SDL2 的新手,在 C/C++ 方面的经验很少,有些使用 pygame、pyglet 和 PySide,现在我正在尝试 PySDL2,希望能找到更快的处理替代方案。处理是用于绘图,但有一个直接的API 用于直接像素作品。
我昨天刚开始使用 PySDL2,花了一整天的时间编写样板代码来实现简单的火算法。有些人可能会嘲笑它——仅仅一天——但我认为对于图形库来说,你可以在一天内用它绘制一些东西是很重要的。我的问题是糟糕的 C/C++ 经验,并且相关的 PySDL2 API主要是直接映射到 C API,因此很难挖掘基于 C 的术语和细节的所有血淋淋的细节。我放弃了寻找关于 SDL2 的图形管道的简单概述。
图形管道是字节和/或整数最终成为屏幕上的像素的路径。举例来说,OpenGL 的高级图片在这里 - http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html - 我是在 SDL2 中寻找更详细的管道图片。
理解如何在 SDL2 中绘制像素的主要困难在于 SDL2 API 提供了有用的帮助器来隐藏这些低级细节。就像您加载位图并获得表面一样。然后将表面移动到纹理。然后 SDL2 以某种方式将纹理移动到视频内存。然后告诉 GPU 在屏幕上显示它。这不是我的理解方式,但是我无法在提到它的地方给你链接。所以,它是:
[data array] --> [pixel array] --> [surface] --> [texture] --> [video memory] ┐
|
..made with uglihunds ascii editor.. [screen] <-┘
(which haz no graphics pipeline)
对于我的应用程序,这应该每秒运行 25 次。当我用 Python 编写它时,我真的需要知道管道来决定在哪里进行优化。但我不确定管道是否正确,我在 API 中有点迷失 - 有很多助手,我什至不知道我计算的像素数据可能和应该是什么样子的起点。
所以我需要知道:
- SDL2 支持哪些类型的输入数据(bmp、内存指针等)
- 是否有输入转换成的中间数据格式
- 什么是数据转换链
- 如何控制转化链
SDL2 支持哪些输出类型
PySDL2 中的样子
还有一个问题被某人否决了,这告诉我,我并不孤单。
更新:
正如@Ancurio 所指出的,表面对象已经是像素数组和数据数组,所以我正在更改图表并提供表面是像素数组的定义。
[bitmap] ----┐
[int array] -┴-> [surface] --> [texture] --> [video memory] --> [screen]
因此,基本上表面是 1. 带有像素数据的连续内存块,2. 有关像素的信息。位图也是一个像素数组,您可以从磁盘或图像加载它。但是 SDL2 不能直接使用。为什么?
pipeline第一步的问题是int和bitmap像素如何转化为surface像素,surface和bitmap有什么不同?我正在使用没有明显直接内存访问的 Python,我需要弄清楚我的选择是什么。