你如何启用垂直同步?
它简单glEnable(GL_VSYNC)
吗?(虽然在glEnable接受的选项中没有GL_VSYNC或类似的东西).
或者在opengl中没有标准的方法吗?
使用我的所有SDL/OpenGL程序,帧速率保持在60fps,因此看起来像vsync是启用,但不是我,也不是我的代码或我的设置.所以我想现在如果有办法禁用它,可能在一些深度macOS设置?
我正在努力更好地理解Android显示子系统,但是仍然让我感到困惑的一个问题是如何处理VSYNC信号,以及为什么这么多存在于第一位.
Android的核心是使用VSYNC,但它采用了多种VSYNC信号.通过"VSYNC偏移"部分中的https://source.android.com/devices/graphics/implement.html,可以看到三个VSYNC信号的流程图:HW_VSYNC_0,VSYNC和SF-VSYNC.我知道HW_VSYNC用于更新DispSync中的时序,并且应用程序和surfaceflinger使用VSYNC和SF-VSYNC,但为什么这些单独的信号是必需的?此外,偏移如何影响这些信号?是否有可用的时序图更好地解释了这一点?
谢谢你尽你所能的帮助.
android vsync surfaceflinger android-4.4-kitkat android-5.0-lollipop
我正在使用XWindow Drawable,Pixmap和XRender在屏幕上绘图.我可以看到有时闪烁.有没有办法等待VBLANK?我已经google了很多,感觉就像在森林里寻找一枚硬币.
没有OpenGL参与.它是Linux(Ubuntu).我可以使用(纳米)睡眠(),但需要知道什么时候绘制时间已经到了一些方法.
我正在更新一个应用程序,在该应用程序中,在屏幕上显示刺激时间的测量需要最大的准确度.它目前用DirectDraw编写,很久以前就被放到了牧场,需要更新我们的图形库.
我们测量呈现时间的方式利用检测垂直空白周期的结束.具体而言,当需要翻转到主表面(或在交换链中呈现)的任何内容实际上被屏幕绘制时,我需要知道最大可能的准确度.检测扫描线可以增加该测量的确定性,但是我能够仅在检测到在翻转或存在之后立即结束垂直空白时段的情况下工作.
Direct 3D 9具有IDirect3DDevice9 :: GetRasterStatus方法,该方法返回包含InVBlank布尔值的D3DRASTER_STATUS结构,该结构描述设备是否处于垂直空白以及当前扫描线.DirectDraw具有类似的功能(IDirectDraw :: GetVerticalBlankStatus,IDirectDraw :: GetScanLine,它在Vertical Blank期间返回DDERR_VERTICALBLANKINPROGRESS,可用于检测VB).
但是我在Direct3D11中找不到任何类似的功能.有没有人知道Direct3D9和Direct3D11之间是否移动或删除了这个功能,如果是后者,为什么?
我正在尝试进行垂直同步渲染,以便每个垂直同步完成一次渲染,而不跳过或重复任何帧.我需要这个在Windows 7和(将来)Windows 8下工作.
它基本上包括绘制QUADS
适合屏幕的序列,以便原始图像中的像素与屏幕上的1:1像素匹配.使用OpenGL或DirectX,渲染部分不是问题.问题是正确的同步.
我以前尝试使用OpenGL,WGL_EXT_swap_control
扩展,绘图然后调用
SwapBuffers(g_hDC);
glFinish();
Run Code Online (Sandbox Code Playgroud)
我尝试了这两个指令的所有组合和置换以及glFlush(),并且它不可靠.
然后我尝试使用Direct3D 10,通过绘图然后调用
g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();
Run Code Online (Sandbox Code Playgroud)
其中g_pSwapChain
是IDXGISwapChain*
与pOutput
是IDXGIOutput*
关联到该SwapChain.
两个版本,OpenGL和Direct3D,都是相同的:第一个序列,比方说,60帧,并没有达到应有的水平(而不是大约1000毫秒,60hz,持续时间等于1030或1050ms),以下似乎工作正常(约1000.40ms),但不时似乎跳过一帧.我做测量QueryPerformanceCounter
.
在Direct3D上,尝试仅使用WaitForVBlank的循环,1000次迭代的持续时间始终为1000.40,几乎没有变化.
因此,这里的问题不是确切地知道每个被调用的函数何时返回,以及交换是否在垂直同步期间完成(不是更早,以避免撕裂).
理想情况下(如果我没有记错),要实现我想要的,它将执行一次渲染,等待同步开始,在同步期间交换,然后等待直到同步完成.如何使用OpenGL或DirectX做到这一点?
编辑:
仅WaitForVSync
60x的测试循环始终从1000.30ms到1000.50ms.与Present(1,0)
之前相同的循环WaitForVSync
,没有别的,没有渲染,需要相同的时间,但有时它会失败并需要1017毫秒,就像重复一帧一样.没有渲染,所以这里有问题.
如何在Vulkan中使用vsync?我在Windows上,但代码也适用于Linux.它是通过插入栅栏来实现的vkAcquireNextImageKHR
吗?
我在2D射击游戏上工作,屏幕上有许多移动物体(子弹等).
我使用BitmapData.copyPixels(...)将整个屏幕渲染到缓冲区:BitmapData.然后我从"缓冲区""copyPixels"到屏幕:BitmapData.帧率为60.
private var bitmap:Bitmap = new Bitmap();
private var buffer:Bitmap = new Bitmap();
private function start():void {
addChild(bitmap);
}
private function onEnterFrame():void {
// render into "buffer"
// copy "buffer" -> "bitmap"
}
Run Code Online (Sandbox Code Playgroud)
问题是精灵正在撕裂:精灵的某些部分水平移动.
它看起来像是关闭了VSYNC的PC游戏.
有人解决了这个问题吗?
更新:问题不是关于性能,而是关于摆脱屏幕撕裂.
[!]更新:我已经创建了另一个问题,在这里您可以尝试两种实现:使用Flash方式或BitmapData + copyPixels()
在Windows应用程序中,我同时打开了多个OpenGL窗口.理想情况下,我希望每个以60 fps绘制,同步到屏幕刷新.
对于每个渲染上下文,我打电话wglSwapIntervalEXT(1)
打开vsync.每个窗口都有自己的显示线程,它绘制帧然后调用SwapBuffers
更新.
事实证明,窗户彼此"战斗":看起来SwapBuffers
呼叫是同步的并且彼此等待,即使它们在不同的线程中.我正在测量每个窗口的帧到帧时间,并且有两个窗口,这下降到30 fps,有3到20 fps等.
如果我关闭vsync wglSwapIntervalEXT(0)
,无论我打开多少个窗口,他们都会以60 fps快速刷新.但是打开一个窗口时,这并不像打开vsync那样平滑.
有没有办法用OpenGL完成我想要的东西?
这是一个非常简单的测试程序.禁用vsync时,该程序以100FPS运行,几乎占用CPU的0%.当我启用vsync时,我得到60FPS和25%(4核系统上一个核心的100%)CPU利用率.这是使用Nvidia GPU.在线搜索引导我建议禁用Nvidia控制面板内的"多线程优化".这确实会降低CPU利用率,但只会降低10%.此外,如果我在SwapBuffers之后删除了睡眠调用,即使禁用了多线程优化,我也会再次获得25%的利用率.任何人都可以对此有所了解吗?难道我做错了什么?Nvidia的OpenGL实现是否无可救药地存在缺陷?
#include <GLFW/glfw3.h>
#include <thread>
#include <cstdlib>
#include <cstdio>
int main(int argc, char *argv[])
{
if(!glfwInit())
exit(EXIT_FAILURE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Vsync Test", nullptr, nullptr);
if(!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
#ifdef USE_VSYNC
glfwSwapInterval(1);
#else
glfwSwapInterval(0);
#endif
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
double lastTime = glfwGetTime();
double nbFrames = 0;
while(!glfwWindowShouldClose(window))
{
double currentTime = glfwGetTime();
nbFrames++;
if (currentTime - lastTime >= 1.0)
{
char cbuffer[50];
snprintf(cbuffer, sizeof(cbuffer), "OpenGL Vsync Test [%.1f fps, %.3f ms]", nbFrames, …
Run Code Online (Sandbox Code Playgroud)