- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在研究游戏循环和物理。前几天,我添加了一些调试语句来查看我的游戏循环的每一帧花费了多少时间。正如预期的那样,结果在 16 毫秒范围内。但是,我尝试禁用 vsync,这些结果并没有改变。显然 vsync 仍在发生。我注释掉了 SFML 显示调用,果然帧加快了。
好的,那么为什么 vsync 卡住了?起初我认为这一定是 DSFML(D 语言的 SFML 绑定(bind))中的错误。我用C++创建了一个简单的测试用例,直接使用SFML,性能特征完全一样!
我的系统如下:
$ inxi -SMG
System: Host: c7 Kernel: 3.16.4-1-ARCH x86_64 (64 bit) Desktop: i3 4.8 Distro: Arch Linux Machine: System: Google product: Parrot v: 1.0
Mobo: N/A model: N/A Bios: coreboot v: 4.0-4744-gac16405-dirty date: 10/23/2013
Graphics: Card: Intel 2nd Generation Core Processor Family Integrated Graphics Controller
Display Server: X.Org 1.16.1 driver: intel Resolution: 1366x768@60.02hz
GLX Renderer: Mesa DRI Intel Sandybridge Mobile GLX Version: 3.0 Mesa 10.3.1
SFML vsync 测试用例如下,开启了 vsync:
#include <chrono>
#include <iostream>
#include "SFML/Graphics.hpp"
int main()
{
auto* window = new sf::RenderWindow(sf::VideoMode(640, 480), "test",
sf::Style::Titlebar | sf::Style::Close);
window->setVerticalSyncEnabled(true);
auto firstTime = std::chrono::high_resolution_clock::now();
while(window->isOpen())
{
//print frame timing
{
auto secondTime = std::chrono::high_resolution_clock::now();
using dMsecs = std::chrono::duration<double, std::chrono::milliseconds::period>;
auto elapsed = dMsecs(secondTime - firstTime);
firstTime = secondTime;
std::cout << elapsed.count() << '\n';
}
//event handler
{
sf::Event e;
while(window->pollEvent(e))
{
if(e.type == sf::Event::EventType::Closed)
window->close();
}
}
//render
{
window->clear();
window->display();
}
}
}
谷歌搜索此问题得出的结果表明图形驱动程序正在强制启用垂直同步。但后来我想知道为什么 vsync 对我系统上的其他程序有效?
我写了另一个测试用例,这次使用的是 SDL2:
#include <chrono>
#include <iostream>
#include "SDL2/SDL.h"
int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
auto firstTime = std::chrono::high_resolution_clock::now();
auto quit = false;
while(!quit)
{
//print frame timing
{
auto secondTime = std::chrono::high_resolution_clock::now();
using dMsecs = std::chrono::duration<double, std::chrono::milliseconds::period>;
auto elapsed = dMsecs(secondTime - firstTime);
firstTime = secondTime;
std::cout << elapsed.count() << '\n';
}
//event handler
{
SDL_Event e;
while(SDL_PollEvent(&e))
{
if(e.type == SDL_QUIT) quit = true;
}
}
//render
{
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
}
}
现在我禁用 vsync 是这个测试用例,并且看到帧时间在 0 毫秒范围内,正如预期的那样!那么 SFML 实现 vsync 的方式在我的系统上是错误的,而 SDL 似乎可以正确处理它。
导致这种不同行为的两个库在实现上有何不同,是否可以解决?我将如何使用 SFML 获得正确的行为?
最佳答案
这是一个有问题的驱动程序。 glXSwapIntervalMESA 有效。为 glXSwapIntervalSGI 返回的指针是有效的,因此如果不采用类似于 SDL 的方法,SFML 无法检测到此问题。
关于c++ - SFML vsync 始终开启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26437078/
本地帐户 从关于核心数据和iCloud的WWDC 2013 207 session中: You provide us a single store URL inside the application
我正在尝试快速打开一个类型。我不是要打开对象实例的类型,而是要打开实际类型本身。例如: let t: Any.Type = Int.self switch t { case is Int:
上一节主要是简单地说了一下关于yii2的防御csrf的攻击机制,接下来说一下关于如何全局和局部的开启使用csrf。 (1)全局使用,我们直接在配置文件中设置enableCookieValidati
apache往nginx去转,代码端用到了$_SERVER['PATH_INFO'],对于nginx默认是不开启pathinfo的。所以我们就要手动开启 1,url重写
我有什么 我有两个房间:rm_home和rm_options。我有声音:snd_Bgm。而且,我有三个对象:obj_bgm,obj_BtnOnClicked和obj_BtnOffClicked。 我想
我需要 JQuery 方面的帮助,我是编程的初学者。 我需要的是当我点击一个特定的按钮时,描述会出现,但是当我点击一个按钮时它们会同时出现。请帮助。谢谢 :) $(document).ready(
我的 Linux 服务器有问题。 配置:Linux 服务器 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2 i686 Apache/2.2.22 (Debi
我有一个应用程序可以在 Activity 中保存帖子信息。在此 Activity 中,相关帖子列在帖子底部。用户通过点击相关帖子可以转到帖子 Activity 并查看该帖子信息和相关帖子。 如您在图片
当我点击屏幕上的“编辑”按钮时,我将 TableView 更改为编辑模式,并将编辑样式设置为复选框 func tableView(_ tableView: UITableView, editingSt
我使用这个 fanotify 示例来监控整个文件系统的打开/访问权限 (/):http://git.infradead.org/users/eparis/fanotify-example.git .
当我在我的 linux 控制台上为我键入的每个命令打开 bash -x 时,我得到了这个输出。 printf "\033]0;%s@%s:%s\007""${USER}""${HOSTNAME%%.*
本文实例讲述了mysql慢查询操作。分享给大家供大家参考,具体如下: mysql有些sql会执行很慢,有可能造成服务器负载飙升 首先查询 确定影响负载的是mysql ,使用top命令,ps命令等
我是 FFMpeg 的新手,所以这可能是一个愚蠢的问题,但我在文档中看不到答案。 我想从 DVD vob 文件中解码帧。打开组中的第一个 VOB 工作正常,但我如何告诉 ffmpeg 继续到下一个 V
我改变了创建数据表的方式,因为我想要动态创建列。我的数据表有一列用于披露详细信息。 function format (d) { console.log(d); var ou
如何从弹出页面 backingbean 获取 backingbean 内容到父 Window.Opener 页面? 最佳答案 您需要手动填写 window.opener通过 JavaScript 的输
我有一个指令在它的 link 函数中做这样的事情 angular.module('myApp') .directive('barFoo', function() { retur
我刚收到一封来自 Authorize.net 的电子邮件,通知他们使用 TLS1.0 和 TLS1.1 停用与其服务器的连接。 问题是 Godaddy SSL 和 Web 主机设置为 TLS1.2 连
由于我的项目太大,我需要运行proguard才能成功编译android。 但是当我设置 android:debuggable="true"以便我轻松调试时,它会自动关闭 proguard。有什么解决方
因此,我已经实现了新的 Fused Location Provider API 来获取用户的位置,但出于某种原因,除非打开 GPS,否则我无法获取任何位置。并非总是如此,用户会打开他们的 GPS,我不
我正在尝试在 Spring Boot 中启用 @GlobalMethodSecurity 以使用 CustomPermissionEvaluator。因此,我添加了相应的 MethodSecurity
我是一名优秀的程序员,十分优秀!