SDL_RENDERER_PRESENTVSYNC 显示不一致

2024-03-29

我最近决定开始使用 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 显卡。尽管我无法再验证这一点,但问题几乎肯定出在环境或硬件上。仅仅一两个月后,同一台笔记本电脑就出现故障(主板问题),因此请从中吸取教训。如果您遇到同样的问题,请考虑检查您的硬件运行状况并尝试完全干净的环境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDL_RENDERER_PRESENTVSYNC 显示不一致 的相关文章

随机推荐

  • 在现有数据库上使用 liquibase

    我们有一个正在生产的现有数据库 我们决定使用 liquibase 进行所有进一步更新并创建任何新数据库 例如开发或集成 我们根据现有的生产模式创建了 liquibase 脚本 以创建任何新的数据库 如开发 集成等 除了该脚本之外 我们还添加
  • 当终止使用 python 子进程 Popen 启动的进程时,如何关闭标准输出管道?

    我想知道当杀死在不同线程中启动的子进程时是否可以关闭通信管道 如果我不调用communicate 那么kill 将按预期工作 在一秒而不是五秒后终止进程 我发现了类似问题的讨论here http bugs python org issue4
  • 从绘图 3d 图中抓取相机位置

    我正在绘制 3D 图形并想要调整相机位置 对我来说最好的方法是使用查看器 根据需要缩放和旋转场景 然后以 JSON 形式获取相机位置并将其放入我的脚本中 该脚本生成图片以默认实现相同的位置 根据这条推文 https twitter com
  • 缓存反射属性 getter/setter 的最佳方法?

    我知道反射可能会很昂贵 我有一个经常获取 设置属性的类 我想到的一种方法是以某种方式缓存反射 我不确定我是否应该缓存表达式或在这里真正做什么 这就是我目前正在做的事情 typeof T GetProperty propName SetVal
  • 如何使用 ie8 检测文本输入何时发生变化

    我想检测文本输入何时发生变化 我尝试了这些 在 Firefox 中有效 但在 ie 8 中无效 taskSearch bind input function alert this val taskSearch live input func
  • 防止手动添加的库被ndk-build删除

    我有一个项目正在重用预编译的本机库 libocr so 但我没有源文件 我手动将库放在项目的 libs armeabi 上 一切正常 然后我需要为同一个项目创建一个新的本机库 我将源代码与 Android mk 文件一样放在 jni 文件夹
  • itertool 中列表的条件笛卡尔积

    我有四个清单 LISTA A1 A2 LISTB B1 C B2 D LISTC C1 C2 LISTD D1 D2 我想要得到的笛卡尔积LISTA and LISTB 然后根据 B 的值 我想添加 C 的乘积或 D 的乘积 A1 B1 C
  • 仅使用一个映射器的 Hadoop gzip 输入文件[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 hadoop 不能分割一个大文本文件 然后使用 gzip 压缩分割的内容 https stackoverflow com questions 6511255 why cant hadoop s
  • 获取当前的 python 模块对象(按名称或其他方式)

    如果我想获取当前模块 例如要重新加载它 我会这样做 import sys sys modules name 有没有更好的方法来做到这一点 例如不涉及 name 在这种情况下 更好意味着更惯用 更便携 更健壮 或者更多 我们通常在软件中希望的
  • 如何在Spring JPA for MySQL中设置@Id @GenerateValue的初始值?

    我不知道如何设置初始值 GenerateValue Id 我尝试过使用GenerationType SEQUENCE但这是不允许的MySQL 如何设置用于的初始值 GenerateValue 两者同时使用AUTO and TABLE我仍然无
  • magento 的 customer.xml 布局文件中的附加参数

    我正在尝试通过空白主题中的 customer xml 文件 这是在 Magento 1 4 1 1 中 向顶级客户链接 我的帐户 我的购物车等 添加一些解释性文本 我认为magento通过发出afterText或beforeText参数具有
  • 如何在不破坏localStorage中类型的情况下存储和获取对象?

    我正在使用 TypeScript 开发 AngularJS 项目 A person是一个对象Person班级 我需要存储person对象在localStorage并用它的类型检索它 窗口本地存储 https developer mozill
  • Android 创建日历事件

    我需要为 Android 应用程序创建多个日历事件 使用这个question https stackoverflow com questions 3721963 how to add calendar events in android 4
  • 从 C# 中的文本文件中读取数字

    这应该是很简单的事情 我只想从由空格分隔的标记组成的文本文件中读取数字和单词 在 C 中如何做到这一点 例如 在 C 中 以下代码可以读取整数 浮点数和字 我不想使用正则表达式或编写任何特殊的解析代码 ifstream in file tx
  • 使用 PdfMerger iText7 将 PdfDocument 转换为 byte[]

    我有一个要求 我使用生成不同的 pdf iText 7 1 11 我在用PdfMerger即时合并所有 pdf 我能够在本地系统成功生成 pdf 但应用程序需要发送bye 作为回应 我找到的解决方案here https kb itextpd
  • 标识符前面的::(双冒号)是什么意思?

    这条线 https github com rust lang libc blob 4af234205f440be38d9036a5bdbcfeed55fb2ced src unix linux like mod rs L2来自铁锈libc
  • ASP.NET真正的异步操作

    我正在尝试从 ASP NET 页面发出多个 HTTP 请求 页面本身不需要知道响应 并且应该继续处理并交付页面 我尝试将 HTTP 代码放入 BackgroundWorker 中并异步运行它 但是我最初收到以下错误 在此上下文中不允许异步操
  • 返回上一屏幕时,反应导航焦点立即模糊于输入

    当我导航到新屏幕时 我想专注于文本输入 当我将屏幕添加到堆栈时 这有效 但当我返回堆栈时 这不起作用 相反 输入聚焦一秒钟并立即模糊 这是我得到的 屏幕 A 位于堆栈中的第一个 输入立即模糊 屏幕 B 已添加到堆栈中并按预期工作 知道是什么
  • 尝试上传到使用多个元数据生成的 GCP 签名网址时收到 403

    我生成了一个 GCP 签名网址 标头中包含两个元数据值 例子 x goog meta reviewer 简 x goog meta author 杰克 当我尝试将文件上传到生成的签名 URL 并在标头中设置元数据时 我收到 403 禁止请求
  • SDL_RENDERER_PRESENTVSYNC 显示不一致

    我最近决定开始使用 SDL 作为我的库之一来编写 C 游戏 在编写程序和学习 SDL 的过程中 我偶然发现了程序中的一个特殊错误 并决定在 SSCCE 中复制它 以确保我没有发疯 问题似乎是 当我将 SDL RENDERER PRESENT