我是SDL/SDL2的新手,在C/C++方面几乎没有经验,有些人使用pygame、pyglet和PySide,现在我正在尝试PySDL2,希望能找到更快的处理替代方案。处理是为了绘图,但有一个简单的API直接像素作品。
我昨天刚从PySDL2开始,花了一整天的时间编写样板代码来实现简单的fire算法。有些人可能会嘲笑它——只是一天——但我认为对图形库来说,重要的是你们可以在一天内用它画出一些东西。我的问题是缺乏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不能直接使用它。为什么?
流水线的第一步的问题是如何将int和位图像素转换为曲面像素,以及曲面与位图有何不同?我使用的Python没有明显的直接内存访问,我需要弄清楚我的选择是什么。
如果你是第一次这样做,也许你应该少关注大局(即图形管道),专注于做你想做的事情(像素访问)。
在我习惯了旧的SDL(我自己的问题)之后,在学习SDL2时,我在这个话题上也有相当多的困惑。事实证明,解决方案在《迁移指南》中。您需要使用SDL_TEXTUREACCESS_STREAMING
,然后可以直接操作像素。
在这一点上,您甚至不需要为曲面而烦恼。您只需要更新纹理中的像素并将其上传到视频内存(使用SDL_RenderPresent()
和其他附带调用)。