- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以现在在我的 OpenGL 游戏引擎中,当我的渲染线程实际上无事可做时,它占用了我的 CPU 可以提供的最大容量。 Windows 任务管理器显示我的应用程序占用了 25% 的处理时间(我有 4 个硬件线程,因此 25% 是一个线程可以占用的最大值)。当我根本不启动渲染线程时,我得到 0-2%(这本身就令人担忧,因为它所做的只是运行 SDL 输入循环)。
那么,我的渲染线程到底在做什么?这是一些代码:
Timer timer;
while (gVar.running)
{
timer.frequencyCap(60.0);
beginFrame();
drawFrame();
endFrame();
}
让我们逐一分析。 Timer
是我使用 SDL_GetPerformanceCounter
创建的自定义计时器类。 timer.frequencyCap(60.0);
旨在确保循环每秒运行不超过 60 次。以下是 Timer::frequencyCap()
的代码:
double Timer::frequencyCap(double maxFrequency)
{
double duration;
update();
duration = _deltaTime;
if (duration < (1.0 / maxFrequency))
{
double dur = ((1.0 / maxFrequency) - duration) * 1000000.0;
this_thread::sleep_for(chrono::microseconds((int64)dur));
update();
}
return duration;
}
void Timer::update(void)
{
if (_freq == 0)
return;
_prevTicks = _currentTicks;
_currentTicks = SDL_GetPerformanceCounter();
// Some sanity checking here. //
// The only way _currentTicks can be less than _prevTicks is if we've wrapped around to 0. //
// So, we need some other way of calculating the difference.
if (_currentTicks < _prevTicks)
{
// If we take difference between UINT64_MAX and _prevTicks, then add that to _currentTicks, we get the proper difference between _currentTicks and _prevTicks. //
uint64 dif = UINT64_MAX - _prevTicks;
// The +1 here prvents an off-by-1 error. In truth, the error would be pretty much indistinguishable, but we might as well be correct. //
_deltaTime = (double)(_currentTicks + dif + 1) / (double)_freq;
}
else
_deltaTime = (double)(_currentTicks - _prevTicks) / (double)_freq;
}
接下来的 3 个函数要简单得多(在这个阶段):
void Renderer::beginFrame()
{
// Perform a resize if we need to. //
if (_needResize)
{
gWindow.getDrawableSize(&_width, &_height);
glViewport(0, 0, _width, _height);
_needResize = false;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
void Renderer::endFrame()
{
gWindow.swapBuffers();
}
void Renderer::drawFrame()
{
}
渲染线程是使用 std::thread 创建的。我能想到的唯一解释是 timer.frequencyCap
不知何故不起作用,除非我在我的主线程中使用完全相同的函数并且我空闲在 0-2%。
我在这里做错了什么?
最佳答案
如果启用了 V-Sync 并且您的程序遵守交换间隔,那么您看到您的程序占用 100% 实际上是 Windows 测量 CPU 时间的一个人工制品。这是一个早已为人所知的问题,但只要您的程序在驱动程序上下文中阻塞(这是 OpenGL 在 V-Sync 上阻塞时发生的情况),Windows 都会将此归因于程序实际消耗 CPU 时间,而它实际上只是空闲。
如果您在交换缓冲区之后立即添加一个Sleep(1)
,它会欺骗Windows 使其进入更理智的计算;在某些系统上,甚至 Sleep(0)
也能达到目的。
无论如何,大多数时候 100% 只是外观问题。
在过去的几周里,我对低延迟渲染进行了一些详尽的研究(即最大限度地减少用户输入和相应光子从显示器中出来之间的时间),因为我很快就会得到一个 VR 耳机。以下是我发现的有关定时 SwapBuffers 的内容:解决该问题的明智方法实际上是对帧渲染时间进行计时,并在 SwapBuffers
之前添加一个人工 sleep ,这样您就可以在 V 之前几毫秒醒来-同步。然而,这说起来容易做起来难,因为 OpenGL 是高度异步的,显式添加同步会降低吞吐量。
关于c++ - 为什么我的渲染线程占用了 100% 的 cpu?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031666/
我正在阅读 SQL/92(我是新手),它经历了不同的数据类型。其中之一是CHAR,我当然知道它与java中的String非常相似,而不是java中的char。但我们假设它是 CHAR(1)。只有一个字
我的 mysqld 进程消耗了 232% 的 CPU,并且有 14000 多个连接 (我对这件事有点陌生,但关注 Stack Overflow 寻求帮助)。 顶部: PID USER P
Tomcat 服务器占用 100% 的 CPU,但仅在 PRD。我们无法在其他环境中重现这一点。 进行线程转储后,我们发现有一些线程处于等待/可运行状态,但无法找到我们如何找到根本原因。 你能帮忙吗?
我正在使用 Xcode、SpriteKit 和 Swift 构建我的第一款 iPhone 游戏。我对这些技术不熟悉,但我熟悉一般的编程概念。 这是我想用英语做的事情。我想让圆圈随机出现在屏幕上,然后开
我的套接字消耗了 100% 的计算机 CPU。有 150 个客户端每 30 秒异步向服务器发送消息。有谁知道如何解决这个问题?下面是我的 ServerSocket 类 public class Ser
一段时间后(有时几分钟,有时几天),我的应用开始消耗 100% 的 CPU。正如我从 VisualVM 看到的那样,它总是发生在 org.elasticsearch.common.netty.chan
在我的容器 Controller 中,用户可以平移 View 以切换到不同的 View 。当平移手势开始时,它会将新 View Controller 的 View 添加到 View 中:view.in
假设我在数据框中有两列,其中一列不完整。 df = pd.DataFrame({'a': [1, 2, 3, 4], 'b':[5, '', 6, '']}) df Out: a b
在Ubuntu 16.04 LTS中,pyteserract脚本吃得太高,导致系统间歇性重启。 top命令输出为 top - 21:23:31 up 27 min, 4 users, lo
我在具有 88 个内核和 60 个 reducer 的 hadoop 集群上运行 mapreduce 作业。由于某种原因,它只使用了 79 个集群核心。开始时它运行 79 个映射器,但当完成一半拆分时
我正在对机器上的所有用户进行查询,当它执行时,它会占用 100% 的 CPU 并锁定系统。我已经等了 5 分钟,但什么也没有发生。 在任务管理器中,wmiprvse.exe 占用了所有 CPU。当我终
我正在从套接字(通过 TCP 协议(protocol))读取消息,但我注意到 CPU 花费大量时间来调用 BufferedInputStream 的 available() 方法。这是我的代码:
我有 6 个线程。其中一个线程进入某个范围并打开“锁定”和所有其他线程线程正在等待并希望进入相同的范围。 现在,其他线程是否会获得 CPU 时间?其他线程是否在线程调度中?我知道所有其他线程都处于等待
我正在尝试创建一个社交媒体应用程序。但它需要大约 300mb 内存。所以我的主页上有 5 个包含帖子的 fragment 。总体内存使用量为 250-300mb 然后为了测试,我禁用了这些 fragm
我有一个带有一些 TextFormField 的表单,我想扩展最后一个 TextFormField 以占据屏幕的其余部分。最后一个 TextFormField 可以有多行文本。 我没能做到这一点,并尝
我收到磁盘几乎已满的警告,所以我运行 DaisyDisk .. 显然 Xcode 占用了 15GB 的空间: http://imgur.com/a/cTIZZ iOS 设备支持为 12.3 GB: h
我正在使用 Xcode Playground 研究 Swift 内存布局,我创建了一个带有 bool、double 和 int32 的结构,如下所示。基于这种结构,MemoryLayout 的打印结果
一旦执行“self.navigationController pushviewcontroller:vc animated:YES”,我的 CPU 就会达到 100%。我在 Stack Overflo
警告:CPU 使用率达到 100%,请小心。 Link to the jsFiddle 编写此脚本是为了设计动态蛇梯板。每次刷新页面时,都会创建一个新板。大多数时候所有的背景图像都不会出现,CPU 使
我不知道为什么,但是MYSQL给CPU带来了很大的负载。我必须每秒多次更新数据库,并且用户群正在不断增长。 一开始还好,但是现在 CPU 负载每天都在增加 这是日志中的慢速查询: *Query_tim
我是一名优秀的程序员,十分优秀!