- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前即将将旧组件的绘图代码从 GDI + UniScribe 替换为 Direct2D 和 DirectWrite(后继者)。
到目前为止,转换很简单,因为大多数时候我需要做的就是将对 Canvas(TCanvas 类)的调用替换为自定义 FDirect2DCanvas 实例(来自 Direct2D 单元的 TDirect2DCanvas 类)。
不幸的是,当尝试将 TImageList 实例中的字形绘制到 FDirect2DCanvas 上时,这似乎并不那么简单,因为绘制方法仅适用于 TCanvas,而不适用于相当通用的 TCustomCanvas(它是 TCanvas 和 TDirect2DCanvas 的祖先) )。
解决这个困境的方法是将 TImageList 字形绘制到临时位图上,然后将其绘制到 TDirect2DCanvas 上。但是,我担心这可能会大大降低绘图性能。
到目前为止,有人这样做过吗?我有什么选择?
最佳答案
如果您查看如何实现将图形对象绘制到 TDirect2DCanvas
,您会发现它通过此例程进行路由。
procedure TDirect2DCanvas.StretchDraw(const Rect: TRect; Graphic: TGraphic;
Opacity: Byte);
var
D2DBitmap: ID2D1Bitmap;
D2DRect: TD2DRectF;
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Graphic);
D2DBitmap := CreateBitmap(Bitmap);
D2DRect.Left := Rect.Left;
D2DRect.Right := Rect.Right;
D2DRect.Top := Rect.Top;
D2DRect.Bottom := Rect.Bottom;
RenderTarget.DrawBitmap(D2DBitmap, @D2DRect, Opacity/255);
finally
Bitmap.Free;
end;
end;
让我们取消所涉及的步骤:
ID2D1Bitmap
并将临时位图复制到其中。ID2D1Bitmap
绘制到渲染目标上。这看起来已经相当低效了。当然,调用这个传递 TBitmap
的函数并无缘无故地创建一个副本是令人难堪的。
当您尝试混合两个不同的图形框架时,这种事情很难避免。您的图像列表是基于 GDI 的,因此当您尝试将其发送到 Direct2D Canvas 时必然会遇到摩擦。根本无法将 GDI 位图直接传递到 Direct2D Canvas ,必须先将它们转换为 Direct2D 位图。
如果性能对您来说很重要,那么您不应该从图像列表开始。当您从 GDI 图像列表中提取位图,然后将其转换为等效的 Direct2D 对象 ID2D1Bitmap
时,这将不可避免地产生成本。
为了获得最佳性能,请勿使用图像列表。从图像列表中提取每个图像并使用 TDirect2DCanvas.CreateBitmap
获取 Direct2D 位图 ID2D1Bitmap
。存储这些而不是图像列表。然后,当您需要绘制时,在 RenderTarget
上调用 DrawBitmap
,并传递 ID2D1Bitmap
。
关于delphi - 将 TImageList 字形绘制到 TDirect2DCanvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44565105/
我是一名优秀的程序员,十分优秀!