【问题标题】:Using Win32 API calls over .NET GDI Classes通过 .NET GDI 类使用 Win32 API 调用
【发布时间】:2012-02-14 06:59:08
【问题描述】:

我有一个用 C# 开发的 winforms 应用程序,其中涉及很多屏幕绘制。绘画涉及自定义控件和其他 2D 对象的渲染。现在的问题是,绘制整个屏幕大约需要 4 到 5 秒。我已将代码优化到一个级别,所有需要的数据都在内存中可用,而不是从磁盘或网络中读取。

为了进一步缩短渲染时间,我打算选择以下选项

  1. 直接调用Win32API公开的GDI函数,而不是使用.NET提供的GDI类

  2. 使用 DirectX,因为我听说它在渲染方面非常有效。我的应用程序不涉及任何类型的 3D 渲染。

请帮我决定选择哪个选项?除此之外还有其他选择吗,例如任何高性能的第三方组件或库。

【问题讨论】:

  • 您有多少个控件?数百?
  • @HansPassant:大约 5K 到 7K 控件
  • 哇,神奇的是它只需要 7 秒。您将不得不将其减少到 100 左右。
  • @HansPassant:我绘制控件并在单击时进行命中测试以使控件具有交互性。请让我知道您对 Win32 API 调用或使用“不安全”块之类的意见,这会有什么不同吗?

标签: c# .net winapi gdi+ win32gui


【解决方案1】:

个人经验:

  • GDI+ 仅比 GDI 慢

  • Direct2D 与 GDI 一样慢——至少对于绘制基本形状而言。因此,除非您正在做一些更复杂的事情,否则它可能无济于事。

您最好的选择可能是减少绘图,并双缓冲数据。

如果它不起作用,您可能希望在内存中生成位图(使用 byte[] 或其他东西,完全避免图形 API),然后简单地将其直接 blit(复制)到屏幕上。这很难,但结果几乎总是最快的。

【讨论】:

  • 感谢您的意见,请让我知道直接调用 win32 api 是否明智,因为我觉得我可以跳过一些可能会提高性能几毫秒的 .NET 层。跨度>
  • @AbrahamJP:就像我已经提到的那样,它最多可能会缩短一两秒钟,但仍然不会令人满意。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 2014-08-25
  • 1970-01-01
  • 2017-10-05
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多