我是SDL / SDL2的新手,在C / C ++方面经验不足,有些使用pygame,pyglet和PySide,现在我正在尝试使用PySDL2来寻找更快的Processing替代方案。处理用于绘图,但有一个简单的API for direct pixel works。
我昨天刚开始使用PySDL2,花了一整天时间编写样板代码来实现简单的fire算法。有些人可能会嘲笑它 - 只是一天 - 但我认为对于图形库而言,你可以在一天内用它绘制一些内容。我的问题是糟糕的C / C ++经验和相关的PySDL2 API mostly direct mapping to 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支持哪种输出
它在PySDL2中应该是什么样子
还有人this question贬低了某人,这告诉我在困惑中并不孤单。
更新
如@Ancurio所述,表面对象已经是一个像素数组和数据数组,因此我正在更改图表并提供表面是像素数组的定义。
[bitmap] ----┐
[int array] -┴-> [surface] --> [texture] --> [video memory] --> [screen]
因此,基本上表面是1.带有像素数据的连续内存块,2。关于像素的信息。 位图也是像素阵列,您可以从磁盘或图像加载。但是SDL2不能直接使用它。为什么呢?
管道第一步的问题是如何将int和位图像素转换为表面像素,以及表面与位图的不同之处?我正在使用Python没有明显的直接内存访问,我需要弄清楚我的选择是什么。
答案 0 :(得分:2)
如果您是第一次这样做,也许您应该更少关注整体情况(即图形管道)并专注于做您想做的事情(像素访问)。
在我习惯旧SDL(my own question)后学习SDL2时,我对这个主题感到困惑。事实证明,该解决方案位于Migration Guide。您需要使用SDL_TEXTUREACCESS_STREAMING
,然后才能直接操作像素。
此时你甚至不需要打扰表面。您只需更新纹理中的像素并将其上传到视频内存(使用SDL_RenderPresent()
和其他随附的调用)。