176

(31 odpowiedzi, napisanych Programowanie - 16/32bit)

Nie miałem czasu zerknąć jeszcze do Twojego clippingu. Mógłbyś ogólnie napisąć jak to wygląda wydajnościowo. Powiedzmy mam jakiś trójkąt ustalonego rozmiaru wystający w połowie za ekran. Ile procentowo czasu zajmie mi clipping a ile samo wypełnianie? Jaki jest narzut dla trójkątów których nie trzeba clippować? (pewnie prawie zerowy, nie?)
PS. ja clipping odpuszczałem na razie sobie z powodów które opisał Cyprian. Bardziej przydaję się on przy renderowaniu całych scen a nie pojedyńczych obiektów. I am not there yet;)

177

(6 odpowiedzi, napisanych Programowanie - 16/32bit)

Tomasz Wachowiak napisał/a:

Jedyne o czym trzeba pamiętać, to żeby współrzędne były podawane w kierunku przeciwnym do ruchu wskazówek zegara. Procedura nie musi nawet sortować wierzchołków, wystarczy, że wyznaczy sobie yMin i yMax.

Podobnie jak mam u siebie:) Też wyznaczam min i max bez sortowania tylko chyba kierunek mam zgodny z zegarem;)

Tomasz Wachowiak napisał/a:

Zanim zabiorę się za wektory, potrzebuję jeszcze obcinania wielokątów. Ktoś może zajmował się już tematem, czy będę musiał sam przysiąść i sobie napisać?

Clippingu nie mam więc nie poratuje. Chętnie zobaczę rezultat. Twoje kody traktuje edukacyjnie, parę pomysłów i wniosków dla siebie już wyniosłem. (choć i tak jestem z wydajnością jeszcze sporo za Wami hehe)

Rozumiem, to u mnie jest trochę inaczej. Ja nie tablicuję przypadków ujemnych tylko jakby co je neguję - parę operacji więcej mam przez to.

Pół mega? Dlaczego tak dużo? Nie miałem czasu zerknąć w Twój kod... ale limitująć dx do 0-255 a dy do 0-127 co już powinno wystarczyć do "życiowych trójkątów" to masz 256*128*2b = 64K - zakladajac ze wynik jest word'em. 64k jest fajne bo mozna to zalignowac i dostęp jest wygodny... No chyba, że ta tablica u Ciebie to co innego niż myśle, albo potrzebujesz większej precyzji niż ja (ja u siebie mam obie delty limitowane do 0-127 czyli 32k i taka precyzja mi wystarcza).

Tomasz Wachowiak napisał/a:

ale jak zwykle moim największym wrogiem będzie czas. :)

Niezłe cuda robicie. Wiem jak to jest z czasem bo sam go na atari prawie nie mam:/ ale skoro masz już super filler i pisałeś coś o swoich mega szybkich prockach do rotacji to do prostego pipeline'u 3d już droga krótka:) Myslałeś by złożyć to do kupy razem? Namawiam i motywuję :)

181

(98 odpowiedzi, napisanych Scena - 16/32bit)

Co do trackerów to jest na PC też Vortex Tracker: http://bulba.untergrund.net/vortex_e.htm
Co prawda głównie dla ZX i ST pobocznie, więc nie jestem pewien czy wspiera on efekty na timer'ach - być może tylko czysty YM, nie wiem. Aha, jego player routine na ST wydawał mi się jakiś podejrzany jeśli chodzi o utylizacje cpu... Ale ogólnie słuszna droga to emulator + maxymiser lub musicmon jak napisał Bober.

182

(18 odpowiedzi, napisanych Programowanie - 16/32bit)

Nie nazwał bym tego swoją procką;) Użyłem jej dla eksperymentów, ale nie ja jestem autorem i nie podejrzewaj mnie to taką wiedzę by napisać coś takiego samemu hehe;)
Tak, tam jest zostawione domyślne 200Hz i z tego jest "syntentyzowane" tyle ile podasz.

Jeśli chodzi o cała inicjalizacje timer'a to.... znalazłem faktycznie skąd ją wziałem - tak, z maxymizer'a. Więc ściagnij sobie go z http://www.preromanbritain.com/maxymiser/download.html i wejdz do katalogu MYM_V133/SOURCE i zobacz PLAY_TC.S - tam masz wszystko.

Edit: aha, pytałem kiedys gwEm czemu to syntetyzuje a nie zmiania freq TC i pisał, że zmiana frq TC jest bardzo ryzykowna ze względu na transmisję z hdd. jeśli restore się nie uda konsekwencje mogą być słabe, ale nie znam detali.

183

(18 odpowiedzi, napisanych Programowanie - 16/32bit)

Ok, wybacz kod wyjęty z większego kontekstu, ale może da jakiś obraz:

initMsxSNDH:
        move.l    #sndhPlayTimerC60,$114.w ; setup tc
        rts

sndhPlayTimerC60:
        sub.w    #SNDH_TC_REPLAY_FREQ,sndhPlayTimerC_tccount        
        bgt.s    sndhPlayTimerC_nocall
        add.w    #200,sndhPlayTimerC_tccount

        move.w    sr,-(sp)
        move.w    #$2500,sr
        movem.l d0-a6,-(a7)    
        jsr SNDH_FILE+8
        movem.l (a7)+,d0-a6
        move.w    (sp)+,sr
sndhPlayTimerC_nocall
        move.l  _old_tc(pc),-(sp)
        rts

sndhPlayTimerC_tccount    ds.w    200

SNDH_TC_REPLAY_FREQ to stała z częstotliwością grania. Kiedyś mi to działało, więc jest szansa że działa nadal;) To jest kod wyciągnięty chyba z jakiś przykładów maxymiser'a - nie pamiętam dokładnie gdzie go znalazłem.

184

(18 odpowiedzi, napisanych Programowanie - 16/32bit)

No tak, jeśli nie rozpakowałeś plików to pewnie to jest przyczyna f**k up'u.
A jesteś pewien, że chcesz to robić na Timer C? Mam taki kod i mogę go odkopać, ale... jeśli tylko tempo pozwala grać raz na ramkę to lepiej to podpiąć na vbl. No chyba, że musisz częsciej....

185

(18 odpowiedzi, napisanych Programowanie - 16/32bit)

Hej, musi działać:) poniżej kilka hintów opartych o problemy które ja miewałem:
- musisz mieć rozpakowany plik SNDH a większość jest spakowanych; do rozpakowania uzyj ICE
- init i play jak piszesz; init +0, play +8
- jeśli nadal nie działa to patrz procedure awaryjną poniżej
- zdarzyło mi się trafić na SNDH z playerami które nie backupja rejestrów, więc przed play zbackupuj rejestery dla testu by zweryfikowac czy to nie problem
- czasem player SNDH chce zaalokować pamięc, więc musimy ją zwrócić na starcie by jakaś była dostępna;) zazwyczaj przez to nie działają sndh z samplami o ile nie dasz na poczatku (pierwsze co robi Twoj kod) swojego programu:

            move.l  4(sp),a5                ; address to basepage
            move.l  $0c(a5),d0              ; length of text segment
            add.l   $14(a5),d0              ; length of data segment
            add.l   $1c(a5),d0              ; length of bss segment
            add.l   #$1000,d0               ; length of stackpointer
            add.l   #$100,d0                ; length of basepage
            move.l  a5,d1                   ; address to basepage
            add.l   d0,d1                   ; end of program
            and.l   #-2,d1                  ; make address even
            move.l  d1,sp                   ; new stackspace

            move.l  d0,-(sp)                ; mshrink()
            move.l  a5,-(sp)                ;
            move.w  d0,-(sp)                ;
            move.w  #$4a,-(sp)              ;
            trap    #1                      ;
            lea     12(sp),sp               ;  

- robisz cuda z timer'ami a SNDH wymaga timer'ów i masz problem. o ile robisz podmiany palet itp co pisałes w innym wątku to musisz mieć pewność, że nie używasz tych samych przerwań co muzyka

edit: jeśli nadal masz problem to daj znać to wyślę Ci example

186

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

Cyprian napisał/a:

ok.
W necie krąży sporo mitów dot. hardware i kodowania, może to być jeden z nich.

tak na szybko widzę że ustawiasz i Video Base oraz Video Counter. Ja tylko modyfikuję Video Counter.

Ok, znalazłem to źródło o którym pisałem: http://alive.atari.org/alive12/ste_hwsc.php
Tu jest opisany ten trick nie wymagający czekania na hbl - tak jak pisałem wymaga ustawienia i base i counter w odpowiedniej kolejności. Paranoid/PDX to solidna firma więc mit to nie jest - poza tym u mnie działa:)

@Wachu a widzisz, ja nie łączyłem horizontal scrollingu z buforowaniem, więc nie mam doświadczeń co do takiej kombinacji. no, ale faktycznie z tego co piszesz to musiałeś się solidnie napracować by to pogodzić;) z buforowniem łączyłem tylko hardware vertical scorlling i tam nie było problemów... no ale jest to bardziej prosty mechanizm.

187

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

Właśnie. To pewnie powoduje różnice.

188

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

No właśnie ja czytałem o tym wałku z hbl i że ustawienie rejestrów w odpowiedniej kolejności go niweluje - o ile dobrze pamiętam. PS. nie wiem czy nie zamieniłem nazw rejestrów w poście, ważne by było tak jak u mnie kodzie. Jak będzie miał czas to sprawdź - ja do niedzieli nie będę miał możliowści więc się nie dowiem;)

189

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

A to jest ciekawe. Bo ja tego nie robię i u mnie jest OK. Ciekaw jestem dlaczego?
Gdzieś czytałem - nie pamiętam gdzie, że aby hscroll dzialal poprawnie trzeba ustawiać rejestry w ścisłej kolejności: video counter registers, hardwarescroll registers, video base registers. Może to jest u Ciebie powodem?

190

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

Cyprian, nie mówię że można robić tego na hbl'u. Twierdzę, że NIE ma takiej potrzeby bo to było podejrzeniem Tomka - że jest to niezbędne. Kluczem jest uwzględnienie przesunięcia "-" o którym piszę i ja i Ty - wtedy można to zrobić wszędzie czy vbl (by scrolować cały ekran) czy hbl (choć niestabilość może poknocić trochę) czy timer b (by na przykład dzielić ekran i scrollować poziomo tylko część).

191

(14 odpowiedzi, napisanych Programowanie - 16/32bit)

Hej,
Coś jest nie tak. Takie tricki nie są potrzebne. Aha, rozumiem, że chodzi o hscroll jak w tytule..... a nie vscroll jak na końcu posta, tak?
Wydaje mi się, że zapomniałeś o jednym małym ale przy aktualizacji rejestru $ffff8265. Jeżeli wrzucasz w niego coś innego niż 0 to shifter automatycznie będzie pobierać o 16px więcej z framebuffer'a.
Czyli jeśli Twoj framebuffer to 640px i robisz hscroll ste to przy przesunieciu PX = 0 (w rejestrze 8265) to szerokosc framebuffer'a ustawiasz na 640px, ale jeśli masz przesuniecie PX z zakresu 1-15 to musisz to skompensować i ustawić szerokość framebufffera na 640-16px. Pewnie tego nie zrobiłeś i dlatego przy przejsciu z zerowych na niezerowe warotości masz kaszanke.

Kod wyjęty z takeover (z boobswatch part):

boobs_hscroll_vbl:
            movem.l    d0-d2,-(a7)
            move.l  scr1,d0
            add.l    boobs_hscroll_byteOffset,d0

            move.l    d0,d1
            lsr.l #8,d1
            
            move.l    d1,d2
            lsr.w #8,d2
            
            ; video base
            move.b d2,$ffff8201.w
            move.b d1,$ffff8203.w
            move.b d0,$ffff820d.w

            ; pixel offset
            move.b boobs_hscroll_pixelOffset,$ffff8265.w
            ; line offset
            tst.b    boobs_hscroll_pixelOffset
            beq.s    boobs_hscroll_pxOffsetZero
            move.b    #76,$ffff820f.w
            bra.s    boobs_hscroll_afterPxOffset
boobs_hscroll_PxOffsetZero
            move.b    #80,$ffff820f.w
boobs_hscroll_afterPxOffset

            ; video counter
            move.b d2,$FFFF8205.w
            move.b d1,$FFFF8207.w
            move.b d0,$FFFF8209.w

            ; dodajemy
            add.b    #1,boobs_hscroll_pixelOffset
            cmp.b     #15,boobs_hscroll_pixelOffset
            ble.s    boobs_hscroll_notIncByteOffset
            add.l    #8,boobs_hscroll_byteOffset
            move.b  #0,boobs_hscroll_pixelOffset
boobs_hscroll_notIncByteOffset
            movem.l    (a7)+,d0-d2
            rts

Nie uzywałem tam nic więcej niz VBL i działało to ok. Chodzi o warunek ustawienia rejestru $ffff820f.w w zależności od ffff8265.

Tak jak przypuszczałem. Blitterem zyskałeś na długich liniach ale straciłeś na krótkich. Mógłbyś teoretycznie zrobić wersje mieszaną wywołującą kod cpu lub blitter'a w zależności od długości linii. Oczywiście taki warunek to dodatkowy koszt, ale pewnie na takim dużym trójkącie będzie na najszybsza wersja. Choć dla zyciowego case'a wypełniania obiektu 3d, który ma wiele face'ów ale długości linii będą relatywnie krótkie obstawiałbym lepsze wyniki wersji cpu. Ale to tylko guess:)

Tomasz Wachowiak napisał/a:

Macie gdzieś jakieś materiały o tym?

Rysujesz sam obrys trojkat'a. Nie linie tylko obrys tak by mieć dla każdego X dokładnie dwa punkty Y1, Y2 zapalone na ekranie. Potem robiś EOR każdej linii z linia-1. i masz wypełniony cały blitowany obszar nie zaleznie ile obrysów i i lle face'ów tam masz. czas jest stały - czasem to dobrze a czasem to źle;) Wady: blitter musi czytac i zapisywać dane przez co działa wolniej, jesli masz mało face'ów ale na wielu bitplanach to pewnie wyjdzie wolniej. Jeśli masz dużo małych face'ów np. na 2 planach to może wyjść fajnie.

194

(51 odpowiedzi, napisanych Scena - 16/32bit)

wieczór to jest tylko flat shade (z ditherem). liczony pewnie jako efekt dodatkowy współczynnika od backface culling'u. fakt, też fajnie wygląda.

@Wachu no właśnie miałem podobne obserwacje, aż moje face'y miały relatywnie krótkie linie to nie widziałem ogólnie zysku ze scan line fill na bliterze. przy duuuuzych face'a racja zysk będzie dokładnie jak to udowodniłeś.

@Adam blitterem można wypełniać kilka obiektów na raz ale nie scan line fill'em tylko eor fill'em. technika jest tu inna. no ale wtedy blitter musi czytać i zapisywać dane przez co działa wolniej. ale jest inicjalizowany raz i tak jak mówisz wypełniasz całą scenę "na raz". wszystko ma swoje wady i zalety:) dodatkowo eor fill'em dostajesz bonus wypełniania obiektów niewypukłych.

Fajnie:) Mam nadzieję, że w przyszłym tygodniu będę miał trochę czasu by zerknąć dokładniej w kod i go przeanalizować. Z tego co widziałem to jest scan line fill, gdzie wyznaczać X1,x2 dla Y'ków i rysujesz H line blitter'em, tak?
Ciekawi mnie czy robiłeś porównanie cpu / blitter dla różnych trójkątów? Robiłem podobny eksperyment kiedyś i dla dużych trójkątów było znacznie szybciej blitter'em, ale już przy małych trójkątach (które są bardziej życiowe o obiektach 3d) inicjalizacja blitter'a była bardziej kosztowna niż zysk z jego prędkości ponad cpu i bardziej opłacało mi się używać cpu dla takich sytuacji. Testy był robiony na szybko więc pewnie dało się tą inicjalizację zrobić szybciej i zniwelować efekt. Ciekaw jestem Twoich odczuć i czy robiłeś takie porównania praktyczne? (nie chodzi mi o teoretyczne timingi)

197

(51 odpowiedzi, napisanych Scena - 16/32bit)

@wieczor w skali kraju faktycznie tak. w skali europy to już być może nie:)

a tak w ogóle to w dzisiejszych czasach jest już tylko jedna wspólna scena;)

198

(51 odpowiedzi, napisanych Scena - 16/32bit)

Tomasz Wachowiak napisał/a:

Witam

Witam:)

Tomasz Wachowiak napisał/a:

Czy ktoś z szanownych grupowiczów "uprawia" jeszcze zapomnianą sztukę pisania w assemblerze?

Od niedawna próbuję swoich sił w tej dziedzinie - co nieco można było zobaczyć na ostatnim SV. Fajnie, że będzie kolejna osoba do wymiany pomysłów / doświadczeń :)

199

(14 odpowiedzi, napisanych Software, Gry - 16/32bit)

Jest to Falcon 030 z 14MB i FPU a obraz mam w 256kolorach po RBG. Jest to najnowsza chyba wersja Netsurf'a która mam z http://www.netsurf-browser.org/downloads/atari/
Generalnie działa do czasu aż dostanę Bus Error;) No i demon prędkości to to nie jest hehe ale pewnie pod 060 będzie już fajnie.
Próbowałem odpalić Highwire (pod Mintem), ale stwierdził że nie podoba mu się znalezione VDI - nie miałem czasu zgłębić tematu jeszcze.

200

(9 odpowiedzi, napisanych Software, Gry - 16/32bit)

@artik-wroc mam dokładnie ten sam problem. udało Ci się go rozwiązać? jestem maniakiem MC a te dziwne skróty klawiszowe to... nie dla mnie;)