Перейти к содержанию
Fire Monkey от А до Я

serser

Пользователи
  • Постов

    16
  • Зарегистрирован

  • Посещение

Активность репутации

  1. Like
    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 видел.
  2. Like
    serser отреагировална Brovin Yaroslav в В каких координатах выполняется отрисовка на канве?   
    В FMX работа с канвой принципиально отличается от работы в VCL. В VCL канва была у каждого оконного контрола своя. В FMX одна канва на все контролы в одной форме. Несколько важных фактов, которые помогут вам:
    Канва одна на всю форму и на все контролы формы. Из пункта 1 следует - Значит каждый контрол рисует себя на одной общей канве При передачи управления на отрисовку контролу, канве задаются настройки (матрица трансформации, кисти и тд) таким образом, чтобы отрисовка выполнялась в локальных координатах контрола. Значит если вы рисуете в другом месте, то отрисовка выполняется в глобальных координатах формы. По этому отрисовку нужно выполнять в абсолютных координатах (координатах формы) Прямую отрисовку на форме нельзя выполнять по нажатию на кнопку. Так как в FMX есть четкая последовательность фаз отрисовки. Места отведенные для рисования - это событие OnPaint. В противном случае, не гарантируется корректная отрисовка на всех платформах.
  3. Like
    serser отреагировална AngryOwl в Целесообразно ли использовать Synchronize для отрисовки   
    Сталкивались. По началу очень много))
     
    Приложение, активно использующее GUI, то бишь всякие прогресс-бары, видео, большое кол-во элементов с картинками и т.д. и т.п., требует обязательного использования TThread.Synchronize.
    Иначе вы можете сначала ничего не заметить, может не быть никаких глюков и т.п.. А потом они могут так же внезапно появиться. Может быть такое, что у Вас их не будет (глюков), а на другом компе - будут. Может зависеть от множества факторов.
    НО!
    Стоит отметить, что если тот или иной элемент интерфейса не требует именно "моментального" отображения информации (например простое отображение нового значения TLabel), и в данный момент у Вас не происходит ничего активного на форме приложения (например - вывод видео или частая смена картинок и т.п.), то, конечно, делать синхронизацию не обязательно. Однако, это может привести в дальнейшем к непониманию возникновения багов, в том случае если ваш код изменится и появится что-то "тяжелое" для отрисовки.
    Эти баги могут быть не явными. Т.е. вы, например, делаете обновление TLabel при "загрузке" чего-либо и обновлении TProgressBar, а текст (новое значение) не отображается. А вот если сделать обновление TLabel и TProgressBar в TThread.Synchronize, то все будет ок.
    Тут есть еще одно НО )))
    Оно заключается в том, чтобы процесс "обновления" был оптимизирован. Это как слишком частый вызов Application.ProcessMessage в процедуре выполняющий вычисления - будут приличные тормоза!
    Пишите код оптимально. Не делайте лишних вызовов TThread.Synchronize, но и не забывайте о них...
     
    Как-то так)
  4. Like
    serser отреагировална Равиль Зарипов (ZuBy) в Целесообразно ли использовать Synchronize для отрисовки   
    Ну вам выше вроде ответили, если не хотите лагов интерфейса то используюте синхронизацию
  5. Like
    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
×
×
  • Создать...