serser
-
Постов
16 -
Зарегистрирован
-
Посещение
Активность репутации
-
serser получил реакцию от Kitty в Целесообразно ли использовать Synchronize для отрисовки
Исходя из реализации TCanvasGpu:
function TCanvasGpu.DoBeginScene(const AClipRects: PClipRects; AContextHandle: THandle): Boolean; begin if FGlobalBeginScene = 0 then begin FCanvasHelper.SetContext(Context); FCanvasHelper.BeginRender; TTextLayoutNG.BeginRender; end else begin FCanvasHelper.Flush; FCanvasHelper.SetContext(Context); FContext.SetMatrix(TMatrix3D.Identity); FContext.SetContextState(TContextState.cs2DScene); FContext.SetContextState(TContextState.csAllFace); FContext.SetContextState(TContextState.csZWriteOff); FContext.SetContextState(TContextState.csZTestOff); end; Inc(FGlobalBeginScene); FSaveCanvas := FCurrentCanvas; if Assigned(FSaveCanvas) and FSaveCanvas.FClippingEnabled then FSavedScissorRect := FCanvasHelper.ScissorRect; FCurrentCanvas := Self; Result := inherited DoBeginScene(AClipRects) and Assigned(FContext) and FContext.BeginScene; if Result then begin FClippingEnabled := False; FCurrentClipRect := TRect.Create(0, 0, Width, Height); FCanvasHelper.ResetScissorRect; FCanvasHelper.UpdateDrawingMode; end; end; В частности из условия второго и последующих вхождений в DoBeginScene: if FGlobalBeginScene = 0 then ... else ...
выходит, что если вошли второй раз, то происходит какой-то FCanvasHelper.Flush куда-то. Возможно и суммарная картинка отобразится. Надо пробовать.
Но скорее всего сначала все-таки промелькнет первая отрисованная сцена, а за ней вторая, но уже без изменений в первой сцене. Да, для одновременного рисования на одной канве наверное нужны методы блокировки части изображения. По-моему такие то ли в winapi, то ли в gdi видел.
-
serser отреагировална Brovin Yaroslav в В каких координатах выполняется отрисовка на канве?
В FMX работа с канвой принципиально отличается от работы в VCL. В VCL канва была у каждого оконного контрола своя. В FMX одна канва на все контролы в одной форме. Несколько важных фактов, которые помогут вам:
Канва одна на всю форму и на все контролы формы. Из пункта 1 следует - Значит каждый контрол рисует себя на одной общей канве При передачи управления на отрисовку контролу, канве задаются настройки (матрица трансформации, кисти и тд) таким образом, чтобы отрисовка выполнялась в локальных координатах контрола. Значит если вы рисуете в другом месте, то отрисовка выполняется в глобальных координатах формы. По этому отрисовку нужно выполнять в абсолютных координатах (координатах формы) Прямую отрисовку на форме нельзя выполнять по нажатию на кнопку. Так как в FMX есть четкая последовательность фаз отрисовки. Места отведенные для рисования - это событие OnPaint. В противном случае, не гарантируется корректная отрисовка на всех платформах. -
serser отреагировална AngryOwl в Целесообразно ли использовать Synchronize для отрисовки
Сталкивались. По началу очень много))
Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize.
Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов.
НО!
Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки.
Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок.
Тут есть еще одно НО )))
Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза!
Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них...
Как-то так)
-
serser отреагировална Равиль Зарипов (ZuBy) в Целесообразно ли использовать Synchronize для отрисовки
Ну вам выше вроде ответили, если не хотите лагов интерфейса то используюте синхронизацию
-
serser отреагировална Brovin Yaroslav в Целесообразно ли использовать Synchronize для отрисовки
Под андроидом нужно понимать, что есть следующие потоки:
Main Thread - поток в Delphi, в котором все выполняется. Он же UI Thread в Delphi, в котором происходит отрисовка. UI Thread Java - поток на стороне Java, в котором выполняется отрисовка и работа со всеми нативными контролами. UI Thread Java <> UI Thread Delphi. То есть, если вы работаете с нативными контролами из Java, то вам нужно с ними работать из Java UI Thread. Для это нужно использовать методы из FMX.Helpers.Android:
procedure CallInUIThread(AMethod: TMethodCallback); overload; procedure CallInUIThread(AMethod: TCallBack); overload; procedure CallInUIThreadAndWaitFinishing(AMethod: TMethodCallback); overload; procedure CallInUIThreadAndWaitFinishing(AMethod: TCallBack); overload; Если же вы работаете с FMX графикой, до достаточно выполнять обычный TThread.Synchronize и Queen