- 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/
我构建了一个没有修饰的 Java Swing 对话框。我已经通过 MouseListener 和 MouseMotionListener 接口(interface)使用拖放实现了对话框移动。 但是,在
我在 Linux 2.6 上使用 clock_gettime()(来自 time.h)来控制线程循环中的计时。我需要在 +/- 5mS 时间范围内有 500mS。它似乎给了我 500 毫秒,然后开始漂
有没有办法抖动 geom_line() 中的线条? ?我知道这有点违背了这个情节的目的,但是如果你有一个只有几行的情节并且希望他们都展示它可能会很方便。也许有一些其他解决方案可以解决这个可见性问题。
所以我有一些物体(我可以在运行时创建越来越多的物体),我需要它们被磁化到屏幕中心。让它在世界空间中为 (480/2/WORLD_SCALE, 320/2/WORLD_SCALE)。我是 box2d 的
我终于制作了一个可以按照我想要的方式运行的股票代码,但现在唯一的问题是它看起来有点不稳定,看起来像是在旧电视上显示的。如何让它看起来更平滑? 这是我的代码: import java.awt.Color
所以我的游戏几乎完成了...但是当我将手指按住屏幕时会出现这种小故障或抖动,现在我已经注意到了,我无法不注意到... 它发生得非常快,并且只有在调用一个函数来处理点击和按住(长按)时才会发生。这会在使
我接手了一个半成品的网站开发,这个网站上有一些使用jquery 1.3.2的 slider 。突然间,今天,我第一次看到 slider 在到达内容末尾时摇晃。这是带有问题 slider 的站点: ht
正如您从下面的屏幕截图中看到的那样,“标题栏”在带有文本的区域中出现了这些丑陋的 strip ,这些 strip 延伸了整个屏幕的宽度。它在真实设备上更加明显。 有什么办法可以解决这个问题吗? 最佳答
我创建了一个 UICollectionView 并希望所有单元格都像 iPhone 上跳板的编辑模式一样摇动。我已经创建了我的 shake 代码,但不知道如何实现它。我有自定义单元格,所以我假设它在那
我正在尝试将列表传递给有状态小部件的构造函数,但是在 main.dart 中添加小部件时,它不需要任何参数。 class Appointments extends StatefulWidget {
我最初在 gamedev 上问过这个问题,但没有一个答案有助于解决问题,我仍然不知道真正的原因是什么。我在常见问题解答中没有看到任何关于在 SE 中重新发布问题的内容,所以我只能希望这没问题。此外,回
我的数据看起来像这样: df1 <- structure( list( y = c(-0.19, 0.3,-0.05, 0.15,-0.05, 0.15), lb
我目前的工作需要在 Intel Core 系列的 CPU 上生成指定数量的 TLB 未命中,但进展并不顺利。我尝试了很多方法,但所有方法的 TLB 命中率都非常高。有谁知道一些关于 x86 TLB 如
我知道有一种方法可以将图像转换为 Icon通过 ImageIcon .但我正在使用 FancyBottomNavigation这是必需的 TabData具有参数 iconData类型 IconData
我想像在js中的示例一样实现视频到 Canvas 应用程序:http://jsfiddle.net/Ls9kfwot/2/ 但是我的问题是如何在特定区域拍摄视频播放器的屏幕截图? 就像drawImag
如果 onTap: changeName, void changeName() { setState(() { name = "Your own codes"; }
我正在尝试为从api中获取的list实现延迟加载。我为ListView实现了一个侦听器,以检查它何时到达底部。我在这里的问题是: 1)如何为列表设置初始加载项数? 2)如何在调用loadMore()方
我正在使用流从REST API检索数据,但是当数据库中的数据更新时,流不会刷新应用程序中的数据。 StreamController _productsController = new StreamCo
我还没有看到这个问题在 SO 中被提及,所以就这样吧。我有一个搜索栏,可以防止搜索超出次要进度(在本例中为音乐缓冲)。假设这首歌长 5 分钟,已缓冲 4 分钟,并且正在一分钟标记处播放。当我去拖动
我的应用程序基于 GPS 数据,为此我使用了 Fused-location-provider。从现在开始,我看到有一个 gps 抖动,一些 GPS 坐标偏离了道路。这是无法接受的。我试图做的是实现 K
我是一名优秀的程序员,十分优秀!