- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一个小的测试程序(见下文)显示了不稳定的输出,我认为这是由 OpenGL glutSwapBuffer() 期间奇怪的时序抖动引起的。与平均水平相比,测试程序经常显示单帧的渲染时间非常长(~330 微秒对我机器上的~5.8 毫秒)程序的输出显示:
[...]
render time: 330us
render time: 372us
render time: 330us
render time: 331us
render time: 5820us
render time: 335us
render time: 332us
render time: 324us
render time: 346us
[...]
设置:快速 PC(Intel i7 CPU @3.2GHz)、Ubuntu 12.04、NVIDIA GTS450 主板、最新的 GL 驱动程序:OpenGL 渲染器字符串:GeForce GTS 450/PCIe/SSE2OpenGL 版本字符串:4.3.0 NVIDIA 310.19三星显示器(我假设是 23"@60Hz,因为所有这些都有 60Hz)
在上面的测试用例中,我通过以下方式明确否决了 vblank sync: __GL_SYNC_TO_VBLANK=0
启用 vblank 后我的时间也很不稳定:
__GL_SYNC_TO_VBLANK=1
[...]
render time: 9169us
render time: 14548us
render time: 14613us
render time: 16057us
render time: 18075us
[...]
我还尝试了其他参数,例如将 X 服务器置于高优先级(sudo schedtool -p 0 -n -20 -N pgrep X
) 或将程序本身置于高优先级 (chrt -p -a --fifo 99 ...)
仍然存在不稳定的动画 - 这(这是我的假设)是由奇怪的时间引起的。
没有 `glutSwapBuffers();' 的计时在代码中显示非常稳定的输出:
[...]
render time: 2us
render time: 2us
render time: 2us
render time: 1us
render time: 2us
[...]
因此可以排除外部(其他过程)的影响。
谁能解释这种行为?
知道如何改进吗?
#include <stdio.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <time.h>
GLfloat gfPosX = 0.0;
GLfloat gfDeltaX = .01;
#define TS_TOUSEC(x) (x.tv_sec * 1000000L + (x.tv_nsec / 1000))
struct timespec t1, t2;
void Draw() {
int x = 0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
clock_gettime(CLOCK_REALTIME, &t1);
glBegin(GL_LINES);
glVertex3f(gfPosX, 0.25, 0.0);
glVertex3f(gfPosX, 0.75,0.0);
glEnd();
clock_gettime(CLOCK_REALTIME, &t2);
glutSwapBuffers();
printf("render time: %5uus\n", TS_TOUSEC(t2) - TS_TOUSEC(t1));
gfPosX += gfDeltaX;
if (gfPosX >= 1.0 || gfPosX <= 0.0) {
gfDeltaX = -gfDeltaX;
}
}
void Timer(int iUnused)
{
glutPostRedisplay();
glutTimerFunc(5, Timer, 0);
}
void Initialize() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
int main(int iArgc, char** cppArgv) {
glutInit(&iArgc, cppArgv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(250, 250);
glutInitWindowPosition(200, 200);
glutCreateWindow("XoaX.net");
Initialize();
glutDisplayFunc(Draw);
Timer(0);
glutMainLoop();
return 0;
}
最佳答案
我不会用这个:
clock_gettime(CLOCK_REALTIME, &t1);
CLOCK_REALTIME 显示挂钟时间(即卡在墙上的时钟显示的时间),即它不能保证是单调的。它可能会向前或向后一点,因为时间守护进程会对其进行调整。
要测量帧渲染时间,您需要 CLOCK_MONOTONIC_RAW。
在没有 SwapBuffers 的情况下,您仅测量发出渲染调用所需的时间。不是渲染时间本身。您必须添加一个 glFinish 来获取它,以便实际执行命令队列。
出于所有实际目的,您不应该计算渲染帧所花费的时间,而是计算各个帧之间的时间,即调用显示函数之间的时间间隔。这提供了更准确的动画。
为了解决输入滞后问题,我会使用卡尔曼滤波器来预测渲染完成时的输入状态(因为您需要帧渲染时间,只需收集统计数据)并使用预测的输入状态进行帧推进。
关于linux - OpenGL - 渲染时间抖动使动画不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416033/
如果输入稳定,我想触发 AJAX 请求(以便不在每个新字符后发送请求)。我尝试了以下方法: $('#input').keyup(function(){ // Get the value when
我读到,我们可以插入以将选择排序更改为稳定排序,而不是交换。我在网上得到了以下相同的实现。 void selection ( int a[], int n ) { while ( --n >
我正在尝试创建一个非常节省空间的不寻常的关联数组实现,我需要一个满足以下所有条件的排序算法: 稳定(不改变具有等键的元素的相对顺序。) 就地或几乎就地(O(log n) 堆栈很好,但没有 O(n) 空
我有一个节点的无线网状网络,每个节点都能够向其邻居报告其“距离”,以(简化的)信号强度来衡量。节点在地理上位于 3d 空间中,但由于 radio 干扰,节点之间的距离不需要在三角(三角?)上一致。即,
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在实现一个玩具调度程序,它读取进程规范(例如到达时间、总运行时间)的输入文件,然后根据随机 io/cpu 突发调度进程。 文件格式 Arrival time, total CPU time, CP
我正在使用 JRedis 的同步实现,但我打算切换到异步方式与 Redis 服务器通信。 但在此之前我想问一下社区 JRedisFuture 是否实现了 alphazero 的 jredis对于生产使
我们正在为我们的公司构建一个RESTful API,它将提供XML,JSON和可能的其他内容类型。 我的团队正在寻找一个框架(按优先顺序排列): 有据可查 理想的情况下,它具有出色的教程以及繁荣的社区
我的网站希望用户上传他们的照片...但我该如何保护我们的服务器免受伤害?只允许 JPG 应该可以避免病毒问题,但如果有人选择 10Gb 文件怎么办 - 这会减慢整个网站的速度吗? 我们使用的是经典 A
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8 个月前关闭。 Improve this ques
据我所知,paintEvent() 是在 QApplication 对象的“主循环”中执行的,并且可以为其内部系统任务花费时间,从而延迟执行排队槽或其他事件。 但是,如果我需要播放非常流畅的动画并且我
我想对随机排序的 ActiveRecord 模型列表(来自 MySQL 数据库的行)进行分页。 但是,这种随机化需要在每个 session 的基础上持续存在,以便访问该网站的其他人也会收到一个随机的、
在 Flutter Web 稳定后,我尝试按照文档中给出的说明将我的 Flutter Mobile 应用程序转换为 Flutter Web。一切都很好,但这里的问题是 Web 上的文本不可选择!我刚刚
我正在尝试制作一个包含 Nginx stable 最新使用 vts 模块编译的 dockerfile .... 我遇到了一个大问题,当我放入将下载的 docker 文件时我找不到一些汽车链接安装最新的
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在使用以下命令将 Airflow 部署到 Kubernetes 中:https://github.com/helm/charts/tree/master/stable/airflow 我正在尝
我已经安装了本地测试elasticsearch和logstash,它们似乎看不到本地es-知道在集群/ ns中如何看到es吗? helm repo add elastic https://helm.e
我最近加入了一家公司,担任发布工程师,在这里,大量的开发团队以各种语言开发了众多服务,应用程序和Web应用程序,它们之间具有各种相互依赖性。 我正在尝试找到一种简化并最好自动发布的方法。当前,发布团队
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想知道一种在 Windows 上使用简单批处理和 ffmpeg 稳定 goPro 视频的简单方法。 最佳答案 1) 在您的计算机上安装 ffmpeg:按照 steps 安装 2) 在您要处理的视频旁
我是一名优秀的程序员,十分优秀!