Postaram się jak najdokładniej opisać mój problem bo jest dość nietypowy
na głównym oknie mam datagridview i dataset w których trzymam ścieżki do obrazków.
Obrazków może być od kilkudziesięciu do kilkuset.
Mam też 3 przyciski /stop play pause
drugie okno to okno odtwarzania i tu zaczynają się schody.
wymiary okna w pikselach to 4608x96
obrazki z listy muszę wyświetlać w postaci płynącej kolejki z lewej do prawej z możliwością regulacji prędkości przewijania.
Oczywiście najpierw przeskalowane proporcjonalnie do wysokości 96.
GDI albo przesuwanie pictureboxów raczej odpada ze względów wydajnościowych
myślałem o XNA lub czymś podobnym ale nie wiem nawet jak spiąć WFA z XNA
Nie miałam zbyt wiele doświadczenia z xna directx czy opengl.
z góry zaznaczę że maszyna do odtwarzania sprzętowo będzie mocnym kombainem na i7 albo xeonie z mocną grafiką.
Witam ponownie
zrobiłem to w ten sposób:
złożyłem wszystkie obrazki w jeden długi
potem w tikach zegara odświeżam okno (doublebuffer) i ndpisuje Painta
w ten sposób
private void Plansza_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(Abmp, locationX1, 0);
e.Graphics.DrawImage(Abmp, locationX2, 0);
locationX1 = locationX1 + 2;
locationX2 = locationX2 + 2;
if (locationX1 == 0)
{
locationX2 = -Abmp.Width;
}
if (locationX2 == 0)
{
locationX1 = -Abmp.Width;
}
}
Wydajność pozostawia wiele do życzenia
podobnie jest jak przesuwam 2 pictureboxy
Jeśli dysponujecie jakimiś pomysłami to proszę o podpowiedź
A jak to zapisać w dX lub openGL ?
drugie okno to okno odtwarzania i tu zaczynają się schody.
wymiary okna w pikselach to 4608x96
gwoli ścisłości: i całe to okno jest widoczne dla użytkownika?
Całe jest widoczne na 3 lub 4 monitorach
samo przewijanie obrazków w zasadzie zrobiłem w DX
w ten oto sposób korzystając z jakiegoś sampla
protected override void OnRender(WindowRenderTarget renderTarget)
{
if (this._image != null)
{
renderTarget.Transform = Matrix3x2.Translation( locationX1,0);
SizeU imageSize = this._image.PixelSize;
double scale = Math.Min((double)(ClientSize.Width ) / imageSize.Width, (double)(ClientSize.Height ) / imageSize.Height);
int imageWidth = (int)(imageSize.Width * scale);
int imageHeight = (int)(imageSize.Height * scale);
RectF imageBounds = new RectF((ClientSize.Width - imageWidth) / 2, (ClientSize.Height - imageHeight) / 2, imageWidth, imageHeight);
renderTarget.DrawBitmap(this._image, imageBounds, 1, BitmapInterpolationMode.Linear);
if (ShowBorder)
renderTarget.DrawRect(this._borderBrush, 8, imageBounds);
//---------------------------------------------
renderTarget.Transform = Matrix3x2.Translation(locationX2, 0);
renderTarget.DrawBitmap(this._image, imageBounds, 1, BitmapInterpolationMode.Linear);
if (ShowBorder)
renderTarget.DrawRect(this._borderBrush, 8, imageBounds);
}
}
pozostaje mi złapanie obiektu Bitmap z GDI w obiekcie Bitmap z DX
bo mój sampel ma tylko dopisaną metode Bitmap.LoadBitmap(string path)
to może kilka okien, mniejszych, na każdym ekranie osobne? to się może, wbrew pozorom, okazać wydajniejsze.
Azarien napisał(a):
to może kilka okien, mniejszych, na każdym ekranie osobne? to się może, wbrew pozorom, okazać wydajniejsze.
czyli sugerujesz takie rozwiązanie picturebox[n] ???