szukałem wokół dużo i tylko metody znalazłem tworzenia Texture2D z Bitmap to:Czy istnieje szybka alternatywa dla tworzenia Texture2D z obiektu Bitmap w XNA?
using (MemoryStream s = new MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}
i
Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Gdzie rgbValues jest tablica bajtów zawierających bitmapy dane pikselowe w 32-bitowym formacie ARGB.
Moje pytanie brzmi, czy są jakieś szybsze podejścia, które mogę spróbować?
Piszę edytor map, który musi odczytywać obrazy w formacie niestandardowym (kafelki mapy) i konwertować je w tekstury Texture2D do wyświetlenia. Poprzednia wersja edytora, która była implementacją C++, przekształciła obrazy najpierw w bitmapy, a następnie w tekstury, które zostaną narysowane przy użyciu DirectX. Próbowałem zastosować to samo podejście, jednak oba powyższe podejścia są znacznie zbyt powolne. Aby załadować do pamięci wszystkie tekstury wymagane dla mapy wymagają pierwszego podejścia ~ 250 sekund i dla drugiego podejścia ~ 110 sekund na rozsądnym komputerze spec (dla porównania kod C++ trwa około 5 sekund). Jeśli istnieje metoda edycji danych tekstury bezpośrednio (np. W metodzie LockBits klasy Bitmap) to byłbym w stanie przekonwertować obrazy w formacie niestandardowym prosto na Texture2D i mam nadzieję, że zaoszczędzę czas przetwarzania.
Każda pomoc będzie bardzo ceniona.
Dzięki
Czy nie powinno to być "od osoby dzwoniącej", a nie "odbiór"? Z celów użytkownika tego kodu jest to ta funkcja, która jest adresatem. – drxzcl
Dziękuję za odpowiedź, jednak miałem na myśli w pierwotnym pytaniu, że próbowałem tego podejścia - za pomocą SetData(). Przebiegłem dalszą analizę, a do stworzenia bitmap za pomocą LockBits potrzebowałem 2,7 sekundy. Kiedy dodałem do tego kodu, dla każdej wygenerowanej bitmapy: Texture2D tx = new Texture2D (urządzenie, bmp.Width, bmp.Height, 0, TextureUsage.None, SurfaceFormat.Color); Zwiększono czas potrzebny do 74 sekund !! Wystarczy utworzyć pustą teksturę dla każdej bitmapy, a nawet jej nie wypełniać. Ten rodzaj czasu ładowania jest niedopuszczalny w przypadku gier 2D. Nie sądziłem, że XNA będzie tak powolny. :/ –
@Ranieri, dzięki - naprawione! – bufferz