在 FireMonkey 中绘制像素的最快方法
我编写了以下代码:
procedure TForm15.Button1Click(Sender: TObject);
var
Bitmap1: TBitmap;
im: TImageControl;
Color: TColor;
Scanline: PAlphaColorArray;
x,y,i: Integer;
begin
for i:= 1 to 100 do begin
im:= ImageControl1;
Bitmap1:= TBitmap.Create(100,100);
try
for y:= 0 to 99 do begin
ScanLine:= Bitmap1.ScanLine[y];
for x:= 0 to 99 do begin
ScanLine[x]:= Random(MaxInt);
end;
end;
ImageControl1.Canvas.BeginScene;
ImageControl1.Canvas.DrawBitmap(Bitmap1, RectF(0,0,Bitmap1.Width, Bitmap1.Height)
,im.ParentedRect,1,true);
ImageControl1.Canvas.EndScene;
finally
Bitmap1.Free;
end;
end;
end;
是否有更快的方法在 Firemonkey 中绘制像素?
我的目标是使用康威的生命游戏制作一个演示程序。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
所有的时间都花在执行这两行代码上:
您可以删除所有使用位图的代码和实际绘制位图的代码,这对运行时没有丝毫影响。换句话说,瓶颈是场景代码而不是位图代码。我认为你没有办法优化它。
我的测试代码如下所示:
这与您的代码具有相同的运行时间,在我的机器上为 1600 毫秒。如果删除
BeginScene
、DrawBitmap
和EndScene
调用,那么您的代码在我的计算机上运行时间为 3 毫秒。All the time is spent performing these two lines of code:
You can delete all the code that works with the bitmap and the code that actually draws the bitmap and it makes not one iota of difference to the runtime. In other words, the bottleneck is the scene code not the bitmap code. And I see no way for you to optimise that.
My test code looked like this:
This has the same elapsed time as your code, 1600ms on my machine. If you remove the
BeginScene
,DrawBitmap
andEndScene
calls then your code runs in 3ms on my machine.您可以像这样优化代码:
删除:
在循环中调用
try
finally
在循环中创建
TBitmap
调用
TBitmap.ScanLine
方法< /p>You can optimize your code like this:
Removed:
calling
try
finally
in loopcreating
TBitmap
in loopcalling
TBitmap.ScanLine
method这是一种更快的方法:
快速且优化!...
Here is a faster way to do that :
Quick and Optimized !...