Używam animacji w aplikacji WinForms o wartości 18.66666 ... klatek na sekundę (jest zsynchronizowana z muzyką przy 140 BPM, dlatego częstotliwość klatek jest dziwna). Każda cel animacji jest wstępnie obliczana, a animacja jest sterowana za pomocą timera multimedialnego o wysokiej rozdzielczości. Animacja sama w sobie jest płynna, ale widzę znaczną część "łzawienia" lub artefaktów, które wynikają z tego, że celowniki zostały częściowo przechwycone podczas odświeżania ekranu.Jak wyeliminować łzy z animacji?
Po pobraniu zestawu obiektów renderowanych przez mój program i zapisaniu ich do pliku AVI, a następnie odtworzeniu pliku AVI w programie Windows Media Player, nie widzę żadnego rozerwania. Zakładam, że WMP odtwarza plik płynnie, ponieważ używa DirectX (lub czegoś innego) i jest w stanie zsynchronizować rendering z działaniem odświeżania ekranu. Nie zmienia to liczby klatek na sekundę, ponieważ animacja pozostaje zsynchronizowana z dźwiękiem.
Czy to jest powód, dla którego WMP potrafi renderować animację bez łez, czy też czegoś brakuje? Czy istnieje sposób, w jaki mogę korzystać z DirectX (lub czegoś innego) w celu umożliwienia mojemu programowi zorientowanie się, gdzie znajduje się aktualna linia skanowania, a jeśli tak, to w jaki sposób mogę wykorzystać te informacje, aby wyeliminować rozdarcie bez korzystania z DirectX do wyświetlania cels? Czy muszę w pełni korzystać z DirectX do renderowania, aby poradzić sobie z tym problemem?
Aktualizacja: zapomniałem o szczegółach. Moja aplikacja renderuje każdą komórkę na PictureBox za pomocą Graphics.DrawImage. Czy jest to znacznie wolniejsze niż przy użyciu BitBlt, tak, że mogę wyeliminować przynajmniej część łez używając BitBlt?
Aktualizacja 2: efekt, który widzę, zdecydowanie nie jest migotaniem (co różni się od łzawienia). Mój panel jest podwójnie buforowany, ustawia style kontrolne dla AllPaintingInWmPaint, UserPaint, OptimizedDoubleBuffer itd., Zastępuje on PaintBackGround i tak dalej. Wszystko to jest konieczne, aby wyeliminować migotanie, ale problem z łzawieniem pozostaje. Jest to szczególnie widoczne, gdy animacja zawiera bardzo szybko poruszające się obiekty lub obiekty, które bardzo szybko zmieniają się z jasnego na ciemne. Kiedy obiekty poruszają się wolno i nie zmieniają kolorów szybko, efekt łzawienia jest znacznie mniej zauważalny (ponieważ kolejne celowniki są zawsze bardzo podobne do siebie).
Czy renderujesz na osobnym wątku? –
@Ardman: tak, renderowanie odbywa się w oddzielnym wątku (oddzielnym od wątku UI). – MusiGenesis