我在.NET中快速绘制内容时遇到问题。我不认为任何特别的东西应该花费很多时间,但是在我试过的每台机器上,我都会遇到严重的问题。这是在vs2008 .NET中实现的,使用C#(在C ++中有一些东西,但与绘图无关)。
我有三个屏幕,用户应该能够在没有延迟的情况下在它们之间切换。在第一个屏幕上,有四个按钮,八个用户控件,包括两个按钮和每个6个标签,一个文本字段和一个下拉框。我不认为它那么多。
在第二个屏幕上,我有四个标签,六个按钮和两个控件,它们有六个按钮,一个是opengl绘图上下文,每个都有十个标签。
在第三个屏幕上,我有一个opengl上下文和10个按钮。
从任何屏幕翻转到任何屏幕大约需要一秒钟。例如,如果我从第二个屏幕翻转到第一个屏幕,则整个应用程序会显示空白,显示背景屏幕,然后绘制第一个屏幕。很多时候,屏幕是零敲碎打的,好像机器是故意在瑞典的一家工厂手工制作精美可口的字母,然后将每一个单独地运送到我的屏幕上。我夸大了,我想说清楚,因为我不认为瑞典人和这次重绘一样慢。
第一个和第二个屏幕在内存中绘制,并存储在那里,只有一个'.Hide()'和'.Show()',使它们显示和消失。双缓冲似乎并不重要。每次重新绘制第三个屏幕,并且绘制的时间与第一个和第二个相同。
有什么想法?会发生什么事?我该如何追踪它?
谢谢!
编辑:我应该补充说,任何C ++处理等都发生在自己的线程中。偶尔有一个MethodInvoke将操作的结果绘制到屏幕上,但是这个问题在没有调用任何函数的情况下发生,只需按下按钮从一个屏幕进入下一个屏幕。
答案 0 :(得分:1)
除了提到的分析器之外,您还可以关闭OpenGL上下文。如果您注意到加速,那么您将知道它是您的图形内容,并且您可以相应地集中优化。
瑞典幽默奖励。
答案 1 :(得分:1)
如何追踪?
dotTrace - http://www.jetbrains.com/profiler/
答案 2 :(得分:0)
您是否在“屏幕翻转”活动期间进行任何其他处理?除了让表格重新绘制之外?如果你正在处理翻转之间的东西(也许你的c ++添加?),并且你没有多线程,你会得到白色效果。表单可能正在等待CPU时间重绘自己。
答案 3 :(得分:0)
我自己从未以这种方式使用OpenGL,但您可能想看看OpenGL上下文被翻转的方式。从一个页面切换到另一个页面时,您可能会重置设备(以DirectX术语),这可能会导致延迟。
如果可能的话,有一个设备绘制到后面的System.Drawing.Bitmap,并在屏幕上使用该位图。让您的OpenGL代码了解用户所在的当前页面,并且可能可以提高您的搜索速度。
要在进行大量更改之前对此进行测试,请尝试删除表单上的OpenGL显示。
这是一时兴起。