Çırpınan motor yöntemleri başka bir iş parçacığından nasıl çağrılır


9

Linux için flutter masaüstü kullanıyorum. MarkTextureFrameAvailableMotor denen bir dokuyu işaretlemesi gereken bir yöntem arıyorum . Bir video oynatıcı programladığım için MarkTextureFrameAvailable, oynatıcının iş parçacığından aramam gerekiyor . Sorun, motorun beni MarkTextureFrameAvailable(ve diğer herhangi bir motor yöntemini) motoru oluşturan iplikten aramaya zorlamasıdır .

Motora yapılan tüm çağrıların, çağrıların çağrıyı oluşturan aynı iş parçacığından yapılıp yapılmadığını görmek için her zaman kontrol yapan kabukta olduğunu görebilirsiniz:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()

( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )

Çırpınan motorunu şu şekilde yaratıyorum:

int main(int argc, char **argv) {
  //..

  flutter::FlutterWindowController flutter_controller(icu_data_path);

  // Start the engine.
  if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path,
                                       arguments)) {
    return EXIT_FAILURE;
  }

  // Register any native plugins.
  FlutterWebRTCPluginRegisterWithRegistrar(
      flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin"));

  // Run until the window is closed.
  flutter_controller.RunEventLoop();
  return EXIT_SUCCESS;
}

gördüğünüz gibi, motoru oluşturan iş parçacığı tarafından engellenir flutter_controller.RunEventLoop();tek şey ana olay iş parçacıkları yürütmek zorunda şeyler bir olay dağıtıcı koymak olabilir. Bu fikri sevmiyorum. Olsa da RunEventLoopWithTimeout, bir zaman aşımı koymak ve MarkTextureFrameAvailablearamalar için bir kuyruk kontrol etmeye devam etmeliyim . Bunun en uygun olduğunu düşünmüyorum.

Peki MarkTextureFrameAvailableana mesaj dizisini nasıl aramalıyım ?

MarkTextureFrameAvailableBurada kullanım için bir örnek buldum : https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 ve onu çağıran başka bir iş parçacığı gibi görünüyor. Bu nasıl mümkün olaiblir? Yaptığımda, bir FATAL hatası alıyorum, ama öyle ve işe yarıyor mu?

Bu örnekte OnFrame'i hangi iş parçacığını çağırdığını anlamaya çalışırken iki gün geçirdim, ancak google'ın webrtc'sini kullanan https://github.com/flutter-webrtc/libwebrtc kullandığı için bulamadım: https://github.com/ OnFrame'in nereden çağrıldığını bulmak benim için çok büyük olan JumpingYang001 / webrtc . Ama bir iş parçacığından beni almalı. Bu nasıl mümkün olaiblir?


Ana çalışma döngüsünde periyodik görevleri çalıştırmak için bir zaman aşımı kullanmanın alternatifini istiyorsanız, bir paketleyici aracılığıyla glfwPostEmptyEvent'i göstermek için bir Flutter motoru PR gönderebilirsiniz. Ana çalışma döngüsünü uyandırmanın bir yolu olması, GLFW gömme API'sine makul bir ektir.
smorgan

Bunu deneyeceğim @smorgan, ancak bu örneği nasıl şaşırdım: github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/... RunEventLoopWithTimeOut olmadan yapar. Ana ipliği ile engellediğinden flutter_controller.RunEventLoop(), o zaman kesin MarkTextureFrameAvailableolarak imkansız olması gereken başka bir iplikten çağrılmalıdır!
Lucas Zanella

Yorumumdan önce hızlı bir uyarı - Flutter'ı hiç duymadım, Linux hakkında çok az şey biliyorsunuz ve mobil cihazdayım, şu anda kesinlikle kodlara bakmıyorum. Umarım hala yardım edebilirim. :) Verdiğiniz örnekte video oluşturucu, ana çarpıntı oluşturucu örneğine benzeyen videodan miras kalmıştır. Onların OnRenderFlutter sanal bir geçersiz kılma olduğunu, bu yüzden Flutter iş parçacığı tarafından çağrılır.
Turşu Rick

Yanıtlar:


3

Bu cevaba verilen uyarı için yorumuma bakın. Verdiğiniz örnek proje bunu basit bir hile ile başarıyor. Çarpıntı oluşturucu sınıfını devralan , OnFramediğer şeylerin arasında geçersiz kılan yeni bir sınıf yaratırlar . Bu geçersiz kılma çağrıldığında, Flutter iş parçacığı bağlamındadır ve beklendiği gibi çalışır.


Yardım etme çabanızla çok teşekkür ederim! Ancak, Flutter sınıfının alt sınıf olduğu Texture,onFrame yöntemi yoktur. Bu onFrame yöntemi RTCVideoRendererFlutter ile ilgisi yoktur.
Lucas Zanella

Buraya bakın . Görünüşe göre Flutter'ı geçersiz kılıyorlar ve muhtemelen desteklenen bir eklenti sistemi kullanıyorlar. En iyi tavsiyem Flutter belgelerini okumak olacaktır. OnFrame'e bir BP yerleştirirseniz, beklendiği gibi Flutter iş parçacığı bağlamında olacağına bahse girerim.
Turşu Rick

Eklenti sistemini kullanıyorum ve belgeleri okudum, onFrame yöntemi yok. FlutterVideoRenderer sınıfındaki Flutter'dan tek şey onFrame yöntemi olmayan Texture'dır. Aslında onFrame'in nerede tanımlandığını buldum ve burada gördüğünüz gibi WebRTC kütüphanesinden bir şey github.com/JumpingYang001/webrtc/…
Lucas Zanella

@LucasZanella Pickle Rick haklıdır, iki sınıftan FlutterVideoRenderer miras alır - Texture(satır 16) ve RTCVideoRenderer<scoped_refptr<RTCVideoFrame>>(satır 17) (C ++ çoklu kalıtıma izin verir) ve sonra OnFrameyöntemi (satır 24) geçersiz kılar . Ne zaman OnFrameolay tetiklenir, bu ana iş parçacığı bağlamında yürütülür.
4LegsDrivenCat

@ 4LegsDrivenCat ama OnFrame Flutter'dan değil, Flutter'den olmayan RTCVideoRenderer'dan
Lucas Zanella
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.