【问题标题】:Options for pure-graphics display in Delphi 2009Delphi 2009 中纯图形显示的选项
【发布时间】:2011-05-11 14:45:16
【问题描述】:

我直接使用图形的全部经验包括多年前在一台 386 机器上使用 Turbo Pascal 的 gdi 单元绘制形状,发现它慢得难以忍受,并且从未考虑过。换句话说,我几乎不知道从哪里开始。

对于一个简单的 Internet 广播播放器应用程序,我想设计一个类似于 Winamp 的图形显示(但更大更容易看,因为这种显示难以辨认是我尝试做我的一个原因自己的)。

当然,像那些模仿 LED 显示屏这样的简单图形组件还远远不够。我不希望绘制可点击的 UI 控件,当然也不是皮肤——只是读数,带有文本、数字和一些符号。我了解 Delphi 2010 支持 Direct2D,但我只有 D2009。

我有哪些选择?是否有任何第三方组件可以提供帮助?

编辑时两个小点。我需要绘图没有闪烁(即,与我多年前在 Turbo Pascal 中所经历的不同:-)。 TCanvas 会足够快吗?此外,我可能想使用 alphablending,我认为我无法通过基本的 TextOut、LineTo 等图形 API 获得它。 (我只是不知道有什么可能)。 GDI+呢?

【问题讨论】:

  • 我会使用 OpenGL 手动编写所有代码。在 Delphi 中开始使用 OpenGL 编程非常容易。我的第一个项目之一:privat.rejbrand.se/vis3dproj.exe

标签: delphi graphics delphi-2009 gdi


【解决方案1】:

看看TCanvas。它内置于大多数可视控件中,并包含用于您正在查看的那种简单绘图的简单方法,而无需使用 DirectX 或 OpenGL。如果您想要一个可以在其上绘制的非常简单的表面,请在表单上放置一个空白的 TImage TPaintBox,并将其 Canvas 作为您的绘图表面。

【讨论】:

  • TImage 用于显示图像(并具有StretchProportionalAutoSizeCenter 等属性)。最好直接在表格上绘制,或者TPaintBox
  • @Andreas:嗯,我不喜欢直接在表单上绘图的想法,因为它没有像控件那样的有界区域。不过,TPPaintBox 看起来不错。谢谢!我以前从未听说过。
  • 嗯,当然,在许多情况下,最好的办法是编写一个组件(TCustomControlTGraphicControl)并在其画布上绘图。
  • 我应该在我的问题中添加我需要绘图不闪烁(即,与我多年前在 Turbo Pascal 中所经历的不同:-)。 TCanvas 的绘图速度够快吗?
  • David - 如下所述,如果您设置了 Paintbox 的父级(面板或滚动框)的 DoubleBuffered 属性,您不必再为您执行此操作了..
【解决方案2】:

我主要同意 Mason 和 cmets。 TPaintBox 真的是一个非常简单的组件。您实现 OnPaint 事件并完全控制。在足够快的机器上它已经足够快了。

把它放在一个 TScrollBox 上,你甚至不需要担心用户滚动到哪里:)

确保检查父控件(面板/滚动框)的 DoubleBufferred 属性。

如果它是复杂的绘图/图形,还请查看InvalidateRect - 它控制画布的哪个区域被重绘。

当然,就像所有图形/绘图一样,它很快就会变得相当复杂:(

【讨论】:

  • 而且,进行 GDI 渲染最重要的一点是双缓冲。我总是将图像绘制到屏幕外的TBitmap,然后在适当的时候“交换缓冲区”。
  • TPaintBox 至少从 D5/6 开始就已经存在多年了,它是一个非常有用的组件!易于以编程方式创建和销毁。轻松为您提供具有所有重要手柄的画布,有时这正是您所需要的。很惊讶你不知道。
【解决方案3】:

刚刚看到您的编辑。如果您需要 alpha 混合和无闪烁绘图,TCanvas 可能对您来说不够好。您应该查看封装 OpenGL 或 Direct3D 并为您提供高性能图形画布的组件。

一个这样的包是Asphyre,虽然我不确定他们是否有一个可以在Delphi 2009+ 上运行的版本。我还有一个定制的库,它包装了SDL 1.3,并为您提供了一个可以放置在 Delphi 表单上的绘图框架组件。它确实适用于 Delphi 2009 及更高版本,但我还没有将它作为自己的包发布。如果您在我的游戏引擎的 SVN 存档中四处寻找它,您可以找到它,但如果您可以等待一两天,我可以尝试将它制作成易于使用的 BPL 组件包并可供下载。

【讨论】:

    【解决方案4】:

    Delphi 的快速 2D 图形库在 Sourceforge 上以开源形式提供:

    Graphics32(主页:http://www.graphics32.org/

    Graphics32 是一个图形库,用于 德尔福和 Kylix/CLX。针对 32 位像素格式,它提供快速 像素和图形操作 原语。在大多数情况下 Graphics32 大大优于标准 TBitmap/TCanvas 方法。

    特性 Graphics32 的一些特性包括:

    • 与标准 TBitmap 相比,每像素访问速度快 100 倍;
    • 高性能位图 alpha 混合(包括每像素 alpha 混合);
    • 具有亚像素精度的像素、线和多边形抗锯齿(结合 Alpha 混合);
    • 任意多边形变换和自定义填充;
    • 使用高质量重建过滤器(例如 Lanczos、Cubic、Mitchell)进行位图重采样;
    • 独特的先进光栅化系统;
    • 位图的仿射变换:具有亚像素精度的旋转、缩放等;
    • 位图的任意投影变换;
    • 位图的任意重映射转换(例如,用于 Warping、Morphing);
    • 灵活的超级采样实施可实现最高采样质量;
    • 通过基于 MicroTiles 的高级重绘优化器优化双缓冲的无闪烁图像显示组件;
    • 多个可自定义且易于使用的叠加层;
    • 锁定位图以实现安全多线程;
    • 用于加载 RGB 和 Alpha 通道的属性编辑器;
    • 标准 TPicture 支持的图像格式的设计时加载;
    • 适用于 Borland Delphi、C++ Builder 和 Kylix(支持 Kylix 的最后一个版本是 1.8.3)。

    自 1.5.1b 版起,Graphics32 已根据 Mozilla 公共许可条款获得许可。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      相关资源
      最近更新 更多