0, 1, 2, 2, 5, 4, 3, 1
tab[0] = %10000000 ; Położenie pikseli nr 0 tab[1] = %01000001 ; Położenie pikseli nr 1 tab[2] = %00110000 ; Położenie pikseli nr 2 tab[3] = %00000010 ; ... tab[4] = %00000100 ; ... tab[5] = %00001000 ; Położenie pikseli nr 5
@Hexmage960, post #1
@Krashan, post #2
Ten format jest przerażająco rozrzutny pod względem ilości zajmowanej pamięci. Weźmy linię w PAL LowRes (320 pikseli), w 256 kolorach. Przy zapisie bitplanowym każdy bitplan zajmie 40 bajtów, łącznie więc będziemy mieli 320 bajtów (8 bitplanów). W paletowym chunky wprost mamy 320 pikseli po 1 bajt każdy, czyli również 320 bajtów. W Twoim trybie każde 32 piksele zajmują 1 kB, zatem linia zajmuje 10 kB.
Dla typowego ekranu 320×256 w 256 kolorach mamy 80 kB danych zarówno dla planar jak i chunky, oraz 2560 kB (!!!) w Twoim trybie index.
2. Zamiast rysować w trybie chunky, rysujemy od razu w trybie index, a potem konwersja index->planar jest szybsza niż chunky->planar. Postawienie piksela w chunky to jedno MOVE.B. Postawienie go w index, to operacja logiczna na pamięci (odczyt/modyfikacja/zapis). To może miałoby szansę być (wraz z konwersją) mimo wszystko szybsze niż tradycyjne C2P, gdyby nie ten prosty fakt, że procedura "I2P" będzie miała do odczytania z pamięci 32 razy więcej danych. To też trzeba uwzględnić w szacowaniu wydajności, a nie tylko liczbę operacji arytmetyczno-logicznych. A najlepiej po prostu zmierzyć.
@Hexmage960, post #4
Oczywiście ta tablica nie będzie nigdy zawierać 256 elementów, ale co najwyżej 32.To co w takim razie oznacza "numer" piksela i w jakiej relacji pozostaje on do koloru tego piksela?
w praktyce wystarczy jeden zapis by zapisać 32 piksele o tej samej wartościTylko w szczególnym przypadku, gdy akurat piksele te znajdą się obok siebie w jednym poziomym pasku, zaczynającym się na granicy 32-bitowego słowa. Co prawda nie napisałeś jak kolejne tablice pikseli mapują się na docelowy ekran, ale zakładam, że w naturalnej kolejności linearnej...
Uwzględnia on to, że piksele mogą mieć wspólne bitplany. Jeżeli takie bitplany istnieją, to konwersja następuje raz dla takich wspólnych bitplanów.Konwersja tak, ale czytanie z pamięci i tak obejmuje całe tablice, nic nie możesz pominąć, chyba, że z góry założysz brak pikseli o określonym "numerze" (cokolwiek by on oznaczał) w obrazie. Samo proste przeczytanie 2,5 MB danych na ramkę... Nawet przy oczywistym założeniu, że czytamy z pamięci Fast i nieco mniej oczywistym, że mamy bardzo szybki, jak na Amigę, procesor, zajmie to sporo czasu.
@Krashan, post #5
Tylko w szczególnym przypadku, gdy akurat piksele te znajdą się obok siebie w jednym poziomym pasku, zaczynającym się na granicy 32-bitowego słowa. Co prawda nie napisałeś jak kolejne tablice pikseli mapują się na docelowy ekran, ale zakładam, że w naturalnej kolejności linearnej...
Konwersja tak, ale czytanie z pamięci i tak obejmuje całe tablice, nic nie możesz pominąć, chyba, że z góry założysz brak pikseli o określonym "numerze" (cokolwiek by on oznaczał) w obrazie. Samo proste przeczytanie 2,5 MB danych na ramkę... Nawet przy oczywistym założeniu, że czytamy z pamięci Fast i nieco mniej oczywistym, że mamy bardzo szybki, jak na Amigę, procesor, zajmie to sporo czasu.
@Hexmage960, post #6
W przypadku optymalizacji rozmiaru - elementów w tablicy (drzewie) jest tyle, ile różnych kolorów pikseli w 32-pikselowym zestawie.Wtedy jeszcze dojdzie Ci operacja mapowania lokalnego indeksu kolorów zestawu na globalny indeks kolorów ekranu. Plus pamięć na mapę. Oprócz tego, jeżeli chcąc oszczędzić na pamięci, zastosujesz drzewo binarne zamiast tablicy, to każde postawienie piksela będzie przejściem ścieżki po drzewie i może się okazać, że szybciej byłoby ten piksel postawić wprost na bitplanach, w ogóle pomijając kwestię konwersji C2P.
@Krashan, post #7
Wtedy jeszcze dojdzie Ci operacja mapowania lokalnego indeksu kolorów zestawu na globalny indeks kolorów ekranu. Plus pamięć na mapę. Oprócz tego, jeżeli chcąc oszczędzić na pamięci, zastosujesz drzewo binarne zamiast tablicy, to każde postawienie piksela będzie przejściem ścieżki po drzewie i może się okazać, że szybciej byłoby ten piksel postawić wprost na bitplanach, w ogóle pomijając kwestię konwersji C2P.
@Hexmage960, post #9
Konwersja z tradycyjnego Chunky do tego formatu ma koszt liniowy (jak zwyczajne mapowanie), gdyż po prostu kolejnym pikselom przypisuję element w tablicy (lub drzewie) jako indeks biorąc kolor tego piksela.Bardzo irytującą Twoją cechą w dyskusji jest to, że nie odnosisz się do postawionych argumentów, tylko powtarzasz to, co Ci się wydaje, bez jakichkolwiek danych. Unikasz skomentowania wskazanych problemów, powtarzając niczym mantrę zalety swojego rozwiązania. Ja pisałem o koszcie obliczeniowym postawienia piksela, który w przypadku użycia drzewa łatwo przekroczy koszt postawienia piksela bezpośrednio na ekranie planarnym. A to niweczy cały sens stosowania tego formatu i późniejszej konwersji I2P.
@Krashan, post #11
Oczywiście, my tu nie jesteśmy na konferencji naukowej, ale gdy się ogłasza, że „mój kod jest lepszy, niż 20 lat pracy całej amigowej demosceny” to wypadałoby to czymś podeprzeć.
Unikasz skomentowania wskazanych problemów, powtarzając niczym mantrę zalety swojego rozwiązania
Bardzo irytującą Twoją cechą w dyskusji jest to, że nie odnosisz się do postawionych argumentów, tylko powtarzasz to, co Ci się wydaje, bez jakichkolwiek danych.
@pisklak, post #13
Zawsze dobrze jest szukać nowych rozwiązań szeroki uśmiech.
Ja pisałem o koszcie obliczeniowym postawienia piksela, który w przypadku użycia drzewa łatwo przekroczy koszt postawienia piksela bezpośrednio na ekranie planarnym. A to niweczy cały sens stosowania tego formatu i późniejszej konwersji I2P.
@Hexmage960, post #12
A gdzie ja użyłem takiego sformułowania?W czasie dyskusji nad Twoim C2P ludzie zalinkowali Ci dostępne na Aminecie źródła procedur C2P napisane przez naprawdę bardzo dobrych programistów. Nie zrobiłeś żadnego porównania wydajnościowego i może nie napisałeś tego wprost, ale dałeś do zrozumienia, że uważasz swój kod za lepszy.
W przypadku drzewa jego głębokość to będzie max. 5 (przy 32 elementach zakładając zrównoważenie drzewa)Efektem takiego ograniczenia głębokości drzewa będzie to, że w danym polu 32 pikseli będziesz miał do dyspozycji tylko 32 kolory z 256, dodatkowo każde takie pole będzie musiało posiadać indywidualną tablicę mapowania numerów pikseli na kolory palety ekranu. Tablice te będziesz musiał przetwarzać w czasie konwersji I2P. Mimo to i tak będziesz miał 5 odczytów wskaźników drzewa i potem ustawienie bitu w pamięci – zapis piksela. Zwykły zapis piksela do ekranu planarnego to będą średnio cztery ustawienia bitu w pamięci.
@Krashan, post #15
A gdzie ja użyłem takiego sformułowania?
W czasie dyskusji nad Twoim C2P ludzie zalinkowali Ci dostępne na Aminecie źródła procedur C2P napisane przez naprawdę bardzo dobrych programistów. Nie zrobiłeś żadnego porównania wydajnościowego i może nie napisałeś tego wprost, ale dałeś do zrozumienia, że uważasz swój kod za lepszy.
@recedent, post #16
@Krashan, post #15
@Krashan, post #20
I w ten oto sposób będziesz miał 8 odczytów długich słów z pamięci na każdy piksel (tablica INDEX w kroku 2). Samo to zniszczy ten kod wydajnościowo.
@Hexmage960, post #21
@Krashan, post #22
W drugim kroku dla każdego niezerowego elementu tablicy INDEX[256] musisz wykonać operację OR elementu do każdego bitplanu, dla którego indeks elementu ma jedynkę w zapisie binarnym. To implikuje odczyt wszystkich 256 elementów tablicy INDEX, bo inaczej skąd będziesz wiedział, które są niezerowe. 256 odczytów na 32-pikselowe pole daje 8 odczytów na piksel.
@Hexmage960, post #23
@Krashan, post #24
@Hexmage960, post #25
@swinkamor12, post #27
Lepiej byś pokombinował jak podłączyć rpi jako kartę graficzną do klasyka.
Na klasyku bardzo brakuje taniej i w miarę szybkiej grafiki.
@Hexmage960, post #29
INDEX-4: $0: $ffff0000, $80008000 $1: $0000ffff, $40004000 $2: $00000000, $20002000 $3: $00000000, $10001000 $4: $00000000, $08000800 $5: $00000000, $04000400 $6: $00000000, $02000200 $7: $00000000, $01000100 $8: $00000000, $00800080 $9: $00000000, $00400040 $A: $00000000, $00200020 $B: $00000000, $00100010 $C: $00000000, $00080008 $D: $00000000, $00040004 $E: $00000000, $00020002 $F: $00000000, $00010001