Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在双缓冲opengl环境中,前后缓冲区是否可能相同?_Objective C_Cocoa_Macos_Opengl_Nsview - Fatal编程技术网

Objective c 在双缓冲opengl环境中,前后缓冲区是否可能相同?

Objective c 在双缓冲opengl环境中,前后缓冲区是否可能相同?,objective-c,cocoa,macos,opengl,nsview,Objective C,Cocoa,Macos,Opengl,Nsview,我有一种情况,我请求并获得一个双缓冲OpenGL上下文,但当我在其中绘制时,前后缓冲区都会受到影响。绘图缓冲区设置为后缓冲区(仅后缓冲区)。如果我在OpenGL Profiler中查看,我确实看到了所有这些:GL_DRAW_BUFFER(GL_BACK)的值以及实际绘制的前后缓冲区 因为我使用的是一个有备份存储的NSWindow,所以我们在屏幕上看不到任何这种情况。问题是我正在使用CGWindowListCreateImage获取此窗口的屏幕截图。此函数似乎是从前缓冲区获取图像,而不是从屏幕缓冲

我有一种情况,我请求并获得一个双缓冲OpenGL上下文,但当我在其中绘制时,前后缓冲区都会受到影响。绘图缓冲区设置为后缓冲区(仅后缓冲区)。如果我在OpenGL Profiler中查看,我确实看到了所有这些:GL_DRAW_BUFFER(GL_BACK)的值以及实际绘制的前后缓冲区

因为我使用的是一个有备份存储的NSWindow,所以我们在屏幕上看不到任何这种情况。问题是我正在使用CGWindowListCreateImage获取此窗口的屏幕截图。此函数似乎是从前缓冲区获取图像,而不是从屏幕缓冲区(无论在何处…)获取图像。因此,返回的图像是不完整的:它只包含抓取时绘制的元素,即使没有调用flush

mac开发者包中有一个名为Pixie的实用程序。它基本上是在鼠标位置抓取屏幕,并放大显示,以便您可以对其进行分析。此程序与调用CGWindowListCreateImage具有相同的行为:您可以看到不完整的图像。所以我想问题不在于我使用CGWindowListCreateImage的方式,而在于我的窗口或显示器

而且,这似乎并非总是发生。并不是每个窗口都显示这种行为,即使对于给定的窗口,它也似乎来来往往,特别是如果我将窗口移动到不同的屏幕(在双显示器中)


以前有人遇到过这种情况吗?

您是否无意中在某个地方交换了缓冲区?我在调用glDrawArrays之前和之后放置了一个断点,效果立即。这是我的第一个猜测。MacOS X Cocoa/Quartz Extreme本质上是一个合成窗口管理系统。合成窗口管理在某种程度上消除了对每个窗口双缓冲的需要,因为任何绘制到窗口的内容都要经过第二个绘制阶段(合成)。我现在疯狂地猜测:很可能在MacOS X中,双缓冲窗口实际上只是接收一个缓冲区和用于与合成器同步的双缓冲交换。DatenWalf:我不认为是这种情况,因为通常情况下,我看不到这种行为。