SDL_RENDERER_PRESENTVSYNC 显示不一致
SDL_RENDERER_PRESENTVSYNC Inconsistently Displays
我最近决定使用 SDL 作为我的库之一来编写 C++ 游戏。在我编写程序和学习 SDL 的过程中,我偶然发现了程序中的一个特殊错误,并决定在 SSCCE 中复制它以确保我没有发疯。
问题似乎是当我将 SDL_RENDERER_PRESENTVSYNC 作为标志传递给 SDL_CreateRenderer 时,我得到不一致的渲染。为了比较,我 运行 程序有 50 次有标志,有 50 次没有标志,并在每种情况下对我的程序进行唯一更改。没有标志,显示器在 100% 的时间内工作。启用标志后,它只成功渲染了 50 次中的 13 次。
程序如下:
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char** argv)
{
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
std::cerr << "Unable to initialize SDL: " << SDL_GetError() << std::endl;
return -1;
}
SDL_Window* win = SDL_CreateWindow("Testing",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(win, -1,
SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
for(int x = 0; x < 640; x+=32)
{
for(int y = 0; y < 480; y+=32)
{
SDL_Rect rect = {x+1, y+1, 31, 31};
SDL_RenderFillRect(renderer, &rect);
}
}
SDL_RenderPresent(renderer);
SDL_Delay(500);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
如果有所不同,我正在 Ubuntu 15.04、GCC/G++ 4.9.2 上编译和测试程序,针对 SDL 2.0.2 编译和链接。
作为 SDL 的新手,对于 C++ 和 C 仍然相对较新(我来自 Java 背景),我认为我很可能犯了一个简单的错误没有抓到,但我想不出我可能做了什么。
对于那些以后看到这个问题的人来说,这个问题似乎在一年多后自行解决了,因为我无法再复制自己的 SSCCE。这可能是环境的变化,因为我使用的不是同一个系统,而是现在使用的是 Nvidia 显卡。这个问题,虽然我无法再验证这一点,但几乎可以肯定是在环境或硬件中。仅仅一两个月后,同一台笔记本电脑就出现故障(主板问题),所以你可以从中得到你想要的东西。如果您遇到同样的问题,请考虑检查您的硬件健康状况并尝试一个完全干净的环境。
我最近决定使用 SDL 作为我的库之一来编写 C++ 游戏。在我编写程序和学习 SDL 的过程中,我偶然发现了程序中的一个特殊错误,并决定在 SSCCE 中复制它以确保我没有发疯。
问题似乎是当我将 SDL_RENDERER_PRESENTVSYNC 作为标志传递给 SDL_CreateRenderer 时,我得到不一致的渲染。为了比较,我 运行 程序有 50 次有标志,有 50 次没有标志,并在每种情况下对我的程序进行唯一更改。没有标志,显示器在 100% 的时间内工作。启用标志后,它只成功渲染了 50 次中的 13 次。
程序如下:
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char** argv)
{
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
std::cerr << "Unable to initialize SDL: " << SDL_GetError() << std::endl;
return -1;
}
SDL_Window* win = SDL_CreateWindow("Testing",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(win, -1,
SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
for(int x = 0; x < 640; x+=32)
{
for(int y = 0; y < 480; y+=32)
{
SDL_Rect rect = {x+1, y+1, 31, 31};
SDL_RenderFillRect(renderer, &rect);
}
}
SDL_RenderPresent(renderer);
SDL_Delay(500);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
如果有所不同,我正在 Ubuntu 15.04、GCC/G++ 4.9.2 上编译和测试程序,针对 SDL 2.0.2 编译和链接。
作为 SDL 的新手,对于 C++ 和 C 仍然相对较新(我来自 Java 背景),我认为我很可能犯了一个简单的错误没有抓到,但我想不出我可能做了什么。
对于那些以后看到这个问题的人来说,这个问题似乎在一年多后自行解决了,因为我无法再复制自己的 SSCCE。这可能是环境的变化,因为我使用的不是同一个系统,而是现在使用的是 Nvidia 显卡。这个问题,虽然我无法再验证这一点,但几乎可以肯定是在环境或硬件中。仅仅一两个月后,同一台笔记本电脑就出现故障(主板问题),所以你可以从中得到你想要的东西。如果您遇到同样的问题,请考虑检查您的硬件健康状况并尝试一个完全干净的环境。