在Delphi 10.1柏林,我正在制作一个Android应用程序.我创建了一个这样的计时器:
fTimer := TTimer.Create(nil);
fTimer.Interval := 1;
fTimer.OnTimer := OnTimer;
fTimer.Enabled := True;
Run Code Online (Sandbox Code Playgroud)
在这种情况OnTimer下,我只是这样做:
procedure TMyForm.OnTimer(Sender: TObject);
begin
MyStopWatch.Stop;
Inc(acounter);
if acounter mod 1000 = 0 then
allog('delay', FloatToStr(xStopWatch.Elapsed.TotalMilliseconds));
MyStopWatch := TStopWatch.StartNew;
end;
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,OnTimer事件每10毫秒而不是每1毫秒触发一次.但是,如果我触摸屏幕并用手指移动它,则事件每隔1.3-1.5毫秒触发一次.
有人可以向我解释这种奇怪的行为吗?
当我的手指触摸屏幕时,为什么应用程序(或至少是计时器)更具反应性?如何使应用程序始终被反应?
关于J的评论..
我认为这不是小生命(但我不确定),因为如果我使用线程而不是像这样的计时器:
TThread.createAnonymousThread(
procedure
var MyStopWatch: TstopWatch;
acounter: integer;
begin
acounter := 0;
MyStopWatch := TStopWatch.StartNew;
while True do begin
TThread.synchronize(nil,
procedure
begin
MyStopWatch.Stop;
Inc(acounter);
if acounter mod 1000 = 0 then
allog('delay', FloatToStr(MyStopWatch.Elapsed.TotalMilliseconds));
MyStopWatch := TStopWatch.StartNew; …Run Code Online (Sandbox Code Playgroud) 我想知道是否更优化使用本地函数(在下面的例子中_drawBitmap)只需要3个参数而不能内联,因为函数访问一些所有者过程变量,或者使用可以内联的全局函数(但是它会真正内联吗?)并且需要5个参数.
也不知道它是否重要,但这段代码主要用于android/ios编译
代码具有本地功能:
procedure TMyObject.onPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
function _drawBitmap(const aBitmap: {$IFDEF _USE_TEXTURE}TTexture{$ELSE}Tbitmap{$ENDIF}; const aTopLeft: TpointF; Const aOpacity: Single): boolean;
var aDestRect: TrectF;
begin
Result := False;
if aBitmap <> nil then begin
//calculate aDestRect
aDestRect := canvas.AlignToPixel(
TRectF.Create(
aTopLeft,
aBitmap.Width/ScreenScale,
aBitmap.Height/ScreenScale));
//if the aBitmap is visible
if ARect.IntersectsWith(aDestRect) then begin
Result := True;
{$IFDEF _USE_TEXTURE}
TCustomCanvasGpu(Canvas).DrawTexture(aDestRect, // ATexRect
TRectF.Create(0,
0,
aBitmap.Width,
aBitmap.Height), …Run Code Online (Sandbox Code Playgroud)