OpenGL:如何最小化绘图?
Posted
技术标签:
【中文标题】OpenGL:如何最小化绘图?【英文标题】:OpenGL: How to minimize drawing? 【发布时间】:2018-12-02 04:34:37 【问题描述】:我的 OpenGL 屏幕由 2 个三角形和 1 个纹理组成,仅此而已。我想尽可能少地更新屏幕,以节省电量并限制 CPU/GPU 的使用。不幸的是,当我的 draw_scene 例程提前返回而没有绘制任何东西时,OpenGL 屏幕会变黑——即使我从未调用过 glutSwapBuffers。顺便说一句,我的背景颜色不是黑色。似乎如果我不绘制,OpenGL 窗口会丢失其内容。我怎样才能最大限度地减少绘制的数量?
【问题讨论】:
请提供一个重现问题的最小代码示例。 【参考方案1】:现代图形系统假设,当开始重绘时,整个内容都会被重绘。此外,如果您从图形系统获得重绘事件,那通常是因为窗口的内容已变得未定义并且需要重新创建,因此您必须在这种情况下重绘。
为了节省电量,您必须禁用空闲循环(或者只是传递所有执行的操作并立即返回给操作系统调度程序)并且不要让计时器创建事件。
【讨论】:
嗨,听起来不错。关于空闲循环,您只是指 GLUT 空闲回调吗?我调用了 glutMainLoop 并设置了空闲回调,但在空闲回调中我没有做任何事情。 @popoe:如果您使用 GLUT,那么是的,我的意思是空闲回调。您可以随时通过将空指针传递给glutIdleFunc
来关闭空闲回调。或者您可以在空闲功能中向操作系统屈服。在 POSIX 系统上调用 sched_yield
,在 Windows 上等效的函数是 SwitchToThread
。
idle 函数不也是插入调用usleep 以确保FPS 不会太高的好地方吗?当没有空闲功能并且不需要对纹理进行更新时,我目前看到每秒超过 200 帧。
@popoe:只有在没有未完成的事件时才调用空闲函数。如果您不断重绘,您将在每次重绘结束时或在空闲函数内无条件地调用glutPostRedisplay
。睡眠可用于实现帧率限制,但更好的方法是使用高分辨率计时器来限制重新显示(即,如果自上次重绘后没有足够的时间,则不要调用 glutPostRedisplay
)。以上是关于OpenGL:如何最小化绘图?的主要内容,如果未能解决你的问题,请参考以下文章