6

我在 .NET 中快速绘制某些东西时遇到问题。我不认为任何特别的事情应该花费太多时间,但是在我尝试过的每台机器上,我都会遇到严重的问题。这是在 vs2008 .NET 中使用 C# 实现的(在 C++ 中有一些东西,但与绘图无关)。

我有三个屏幕,用户应该能够毫无延迟地在它们之间切换。在第一个屏幕上,有四个按钮、八个用户控件(包括两个按钮和每个 6 个标签)、一个文本字段和一个下拉框。我不认为它有那么多。

在第二个屏幕上,我有四个标签、六个按钮和两个控件,每个控件有六个按钮、一个 opengl 绘图上下文和大约十个标签。

在第三个屏幕上,我有一个 opengl 上下文和 10 个按钮。

从任何屏幕翻转到任何屏幕实际上需要大约一秒钟。例如,如果我从第二个屏幕翻转到第一个屏幕,整个应用程序就会空白,显示背景屏幕,然后绘制第一个屏幕。很多时候,一块块地绘制屏幕,​​就好像这台机器在瑞典的一家工厂里故意手工制作精致美味的字母,然后将每个字母单独运送到我的屏幕上。我夸大了,我想把这一点说清楚,因为我不认为瑞典人像这次重画那么慢。

第一个和第二个屏幕被绘制在内存中,并存储在那里,只有一个“.Hide()”和“.Show()”来使它们出现和消失。双缓冲似乎无关紧要。第三个屏幕每次都重新绘制,并且绘制时间似乎与第一个和第二个相同。

有什么想法吗?会发生什么?我怎样才能找到它?

谢谢!

编辑:我应该补充一点,任何 C++ 处理等都发生在它自己的线程中。偶尔会有 MethodInvoke 将操作的结果绘制到屏幕上,但是这个问题在没有调用任何函数的情况下发生,只需按下按钮从一个屏幕转到下一个屏幕。

4

4 回答 4

1

除了提到的分析器之外,您还可以关闭 OpenGL 上下文。如果您注意到加速,那么您就会知道这是您的图形内容,您可以相应地集中优化。

瑞典幽默得分。

于 2009-01-09T00:51:02.193 回答
1

我怎样才能找到它?

dotTrace - http://www.jetbrains.com/profiler/

于 2009-01-09T01:17:02.203 回答
0

在“屏幕翻转”事件期间您是否进行了任何其他处理?除了让表单被重绘吗?如果您在翻转之间处理某些东西(也许是您的 c++ 添加?),并且您不是多线程,您会得到那种白色的效果。表单可能正在等待 CPU 时间重新绘制自身。

于 2009-01-08T23:41:32.830 回答
0

我自己从未以这种方式使用过 OpenGL,但您可能想看看 OpenGL 上下文被翻转的方式。从一页切换到另一页时,您可能会重置设备(以 DirectX 术语),这可能会导致延迟。

如果可能的话,让设备绘制到后面的 System.Drawing.Bitmap,并在屏幕上使用该位图。让您的 OpenGL 代码了解用户所在的当前页面,您可能会获得所需的速度。

要在进行重大更改之前对此进行测试,请尝试删除表单上的 OpenGL 显示。

这都是一时兴起。

于 2009-01-09T06:51:14.447 回答