是否可以使用 Qt 在 QGLWidget 中完全脱离屏幕进行渲染,而无需将场景重新绘制到屏幕,从而避免缓冲区在监视器上完全翻转?
我需要保存在帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组成并且屏幕上的时间间隔为 15ms 我花费了 4000*15ms=60s 但我需要比 60s 快得多(计算不是这里的瓶颈,只是更新问题)。
在帧缓冲区上进行离屏渲染可以更快吗?我可以避免 QGLWidget 中的显示器刷新率吗?
如何在没有缓慢的 paintGL() 调用的情况下完全在帧缓冲区上渲染?
最佳答案
现在我假设我们正在谈论 Qt4。
Is it possible to render totally offscreen in a QGLWidget
离屏渲染根本不是一个依赖于窗口系统的任务。在大多数工具包中,WGL(至少)和 GLX 的唯一问题是您不能拥有无表面上下文,即未绑定(bind)到窗口系统提供的可绘制对象的上下文。换句话说,您将始终拥有窗口系统提供的默认帧缓冲区,只要当前上下文存在,它就是不可变的。
有一些方法可以用 X11 手动创建不需要窗口的上下文,但通常不值得这么麻烦。例如,对于 EGL 和 OpenGL ES,这个问题不存在,因为有一个扩展恰好解决了这个问题,即离屏渲染。
但是,您可以在设置有效上下文后简单地隐藏 QGLWidget,并使用帧缓冲区对象执行所有操作,而无需默认帧缓冲区干预。
Can I avoid the monitor refresh rate in my QGLWidget?
不,据我所知,Qt4 的 OpenGL 模块无法以编程方式关闭 vsync。您可以求助于 SDL 或 GLFW 以获得类似的东西(不确定 FreeGLUT)。
但是,您始终可以在驱动程序设置中关闭这些内容。这也会影响 QGLWidget(或者更确切地说,底层窗口系统的交换行为。)
Can rendering offscreen on a framebuffer be faster?
最后真的不应该重要。您需要在 VRAM 以外的其他地方获取图像数据,因此在将当前帧渲染到 FBO 之后,无论如何您都需要获取图像。您要么将结果 blit 到前台缓冲区(如果您需要双缓冲和交换,则为后台缓冲区),或者您需要在进一步处理当前帧之前回读内容。
但是,对于任何与 OpenGL 和性能相关的事物,不要猜测 - 分析!
How do I render completely on framebuffer without the slow paintGL() calls?
设置上下文后,您根本不需要小部件。您可以在没有 Qt 干预的情况下自己完成所有魔术。 paintGL() 存在的唯一原因是为用户提供一个易于使用的界面,保证在需要更新小部件时调用该界面。
编辑:关于您在评论中的查询,请参阅这个最小的代码示例,它应该无需更改即可跨平台工作。
#include <iostream>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QApplication>
void renderOffScreen ()
{
std::cout << glGetString(GL_VENDOR) << std::endl;
std::cout << glGetString(GL_RENDERER) << std::endl;
std::cout << glGetString(GL_VERSION) << std::endl;
// do whatever you want here, e.g. setup a FBO,
// render stuff, read the results back until you're done
// pseudocode:
//
// setupFBO();
//
// while(!done)
// {
// renderFrame();
// readBackPixels();
// processImage();
// }
}
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGLWidget gl;
// after construction, you should have a valid context
// however, it is NOT made current unless show() or
// similar functions are called
if(!gl.isValid ())
{
std::cout << "ERROR: No GL context!" << std::endl;
return -1;
}
// do some off-screen rendering, the widget has never been made visible
gl.makeCurrent (); // ABSOLUTELY CRUCIAL!
renderOffScreen ();
return 0;
}
在我当前的机器上,程序打印:
ATI Technologies Inc.
AMD Radeon HD 7900 Series
1.4 (2.1 (4.2.12337 Compatibility Profile Context 13.101))
请注意 QGLWidget 从未真正可见并且没有发生任何事件处理。 Qt OpenGL 库仅用于上下文创建。无需 Qt 干预即可完成任何其他操作。只是不要忘记根据您的需要设置视口(viewport)和其他东西。
请注意:如果您只需要一些方便的方法来设置上下文,您可能希望切换到一些比 Qt4 更轻量级的工具包,例如 FreeGLUT。就我个人而言,我发现 FreeGLUT 在某些硬件上完全按照我想要的方式设置有效上下文时更加可靠,例如Sandy Bridge CPU。
关于c++ - QGLWidget 和快速离屏渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934102/
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
有没有办法快速将表格格式的ruby哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题: