kategoria: C++
[#1] [C] Silnik 3D
Mam klopot ktory wymaga pomocy lepiej ogarnietych postaci...
Otoz silnik jest w C - ma robic prosta rzecz... odpalac sie. Odpala sie niestety raz na dwa razy. Zwykle zawiesza sie albo przy starcie, albo przy koncu dzialania - petla programu obraca kostke przez pare sekund... Wszystko byloby dobrze gdyby program normalnie startowal i normalnie wychodzil. Gdy jednak uda mu sie wyjsc to widac ze zjadlo troche pamieci.
W linku zrodla wraz z assetami- model, tekstura. Zalaczam tez binarke moze to tylko mi nie dziala z jakiegos magicznego powodu.
Uprzedzam jest tam mnostwo wykomentowanych rzeczy i rzeczy ktore maja zmienic sie w przyszlosci w inne rzeczy ale bez rozwiazania tego problemu nie robie dalej.
Moje podejrzenie ze cos z otwieraniem/zamykaniem ekranu lub operacjami dyskowymi.

link do Githuba
Filmik ktory pokazuje jak ma dzialac
[youtube]https://youtu.be/Mr4SliS6Nmg?si=eZGjI84MZfjPRFgXi binarka w katalogu[/youtube]
Czas na biadolenie:
prosze o pomoc/ nie moge pojsc dalej / cisnalem to w kąt na kilka miesiecy / szlag mnie trafia / brak mi pomyslow / odpowiednich kompetencji
[#2] Re: [C] Silnik 3D

@arturB, post #1

a kompilowales na morphosie z -g? wtedy w logtoolu byś mial na której linijce w C się wysypuje
[#3] Re: [C] Silnik 3D

@arturB, post #1

Skoro wysypuje Ci się losowo, spróbuj zwiększyć stos programu, lub zmniejszyć liczbę zmiennych w ramce stosu.

Widzę, że w funkcji fileRead() masz ogromne tablice w ramce stosu. Albo zamień je na static, by były alokowane na stercie, albo użyj funkcji alokacji pamięci.

Domyślny stos to 4096 bajtów.
2
[#4] Re: [C] Silnik 3D

@arturB, post #1

Na początek widzę, że do tablicy lineReadPal o rozmiarze 8 kB próbujesz wczytać 64 kB danych... Ja wiem, że Fgets() się zatrzyma na końcu linii, ale jaką masz gwarancję, że ten koniec linii nastąpi? Ten sam błąd powtarzasz przy lineRead niżej (tablica 2 kB, czytasz 16 kB).

Hexmage ma całkowitą rację, robisz duże tablice na stosie (jako zmienne lokalne) i stos Ci się przepełnia. Programując na Amidze zawsze trzeba mieć z tyłu głowy, że po pierwsze stos jest zazwyczaj niewielki (np. domyślnie pod OS 3.0 tylko 4 kB), po drugie nie ma żadnej kontroli jego przepełnienia.

Trochę mnie to dziwi, że takie drobiazgi jak struct timerequest alokujesz dynamicznie, a kloce w stylu tablica 3000 floatów albo 8192 bajtów rzucasz beztrosko na stos...

Przy okazji struct BitMap nie musi (a nawet nie powinna, jeżeli jest taka możliwość) być w chip-RAM. Tylko bitplany muszą. W ogóle zamiast dziergać się ręcznie z AllocRaster() użyłbym AllocBitMap(), która odwala masę nudnej roboty i alokuje wszystko gdzie trzeba.

To tyle co mi się rzuciło w oczy przy pobieżnym przeglądzie kodu.
2
[#5] Re: [C] Silnik 3D

@Krashan, post #4

Owszem w buforach/tablicach do odczytu plikow jest bajzel. Kilka kombinacji zostawilo swoje slady. Niemniej po uporzadkowaniu tego nie nastepuje poprawa zachowania. Nie mam specjalnie doswiadczenia ani w C ani w specyfice Amigi - wczesniej programowalem w java a tam jest gc i wiele klas ktore robia za nas robote.
Zastanawiajace jest, ze jak sie wysypuje to na samym starcie, lub na samym koncu dzialania programu.
[#6] Re: [C] Silnik 3D

@arturB, post #5

Wpisz z CLI
stack 100000
i zobacz czy pomoze.
[#7] Re: [C] Silnik 3D

@arturB, post #5

Wydaje mi się, że pierwsze o co musisz zadbać to o środowisko jakieś sensowne, bez debuggera sie zajedziesz nie znająć specyfiki C ani Amigi.
Czym kompilowałes ten projekt?
[#8] Re: [C] Silnik 3D

@Mirq, post #7

crosskompilacja na gcc pod win i odpalanie na uae. Fakt bez debuggera to problem.
[#9] Re: [C] Silnik 3D

@Don_Adan, post #6

Samo zwiekszenie stosu nic nie poprawilo. Jak sie wywalalo tak sie wywala
[#10] Re: [C] Silnik 3D

@arturB, post #9

Czyli masz jakis blad w zrodlach, mozesz sprobowac wylapac za pomoca Enforcera/Mungwalla czy podobnego nowszego programu od Thora jak masz MMU.
[#11] Re: [C] Silnik 3D

@arturB, post #9

Znalazłem błąd w Twoim programie:

W wywołaniu funkcji OpenWindowTags() podajesz WA_Flags, WFLG_SUPER_BITMAP jednakże nie dostarczasz tej bitmapy.

Potencjalnie to może być przyczyna.
1
[#12] Re: [C] Silnik 3D

@Hexmage960, post #11

Czesciowe trafienie . Nawet udalo mi sie odpalic na rtg na Ami ale wciaz otwarcie/zamkniecie aplikacji to loteria. Co ciekawe na ami czesto tekstura to kaszana i zwiecha na starcie. na emu jak zwiesza sie przy starcie to nawet nie pokaze kaszankowej tekstury na modelu.
[#13] Re: [C] Silnik 3D

@arturB, post #12

Nie wiem czy nie potrzebujesz po prostu dobrego startupu, bo tam sa jakies wieksze waity wymagane na otwarciu i zamknieciu na RTG.
[#14] Re: [C] Silnik 3D

@arturB, post #12

Namierzyłem jeszcze jeden niewielki błąd, przy wywołaniu funkcji InitArea().

Zrobiłeś tu omyłkę:

WORD areabuf[SCR_WIDTH];

InitArea(&ainfo, areabuf, SCR_HEIGHT *2/4);

Skoro rozmiar areabuf to SCR_WIDTH, to parametr dla InitArea() powinien być taki:

InitArea(&ainfo, areabuf, (SCR_WIDTH * 2) / 5);

Warto też wcześniej wyzerować tablicę areabuf.

P.S. Jeśli chodzi o stos, to można spróbować skompilować przy pomocy SAS/C. Posiada on mechanizm sprawdzania przepełnienia stosu.

Ostatnia aktualizacja: 31.08.2023 14:45:10 przez Hexmage960
1
[#15] Re: [C] Silnik 3D

@Hexmage960, post #14

Nie no te InitArea wszyskie polecialy i wiele innych niepotrzebnych rzeczy. Wlasnie to porzadkuje i ukladam po osobnych klasach zeby dalo sie to czytac jakos.
Pytanie: Mam screen - tak jak byl, i okno uzywajace tego screena. Okno w tle ma otwarty kanal IDCMP dla RAWKEY. Jak nastepuje komunikacja okno->screen gdy dziala kod rysowania i przelaczania buforow w petli na screenie ?
[#16] Re: [C] Silnik 3D

@arturB, post #15

O jaka komunikacje ci chodzi?
[#17] Re: [C] Silnik 3D

@docent, post #16

Ok. Uporalem sie z problemem jednak napotkalem inny dziwny. Gdy program dziala w niskiej rozdzielczosci i manipuluje klawiatura (idcmp raw_key) to po chwili wywala komunikat #80000004... Gdy wolniej wbijam klawisze to nie wywala bledu. W wysokiej rozdzielczosci wogole nie wywala i pracuje Ok. No ale w hires laced ogolnie wszystko znacznie wolniej dziala wiec moze jest jakis myk zwiazany w odczytem klawiatury/deley-em?
[#18] Re: [C] Silnik 3D

@arturB, post #17

Zobacz sobie tutaj jak mateusz_s zrobił u siebie: (z resztą nie tylko to Ci się moze przydać)
https://github.com/mateusz83/msRay/blob/main/msRay_devpack_v0.36/EngineFrameworkAmiga/src/AMIGA_Framework.c
1
[#19] Re: [C] Silnik 3D

@arturB, post #17

Hej,
Taj jak Mirq wspominał zerknij na amiga framework w moim projekcie msray.
Chodzi o to że zanim zaczniesz cokolwiek wyświetlać to miej po kolei dobrze ogarniętą cała resztę czyli: otwieranie i zamykanie screena, okna, alokowanie i zwalnianie potrzebnej pamięci i bitmap. Np. Testuj na suchym systemie i popatrz ile pamieci jest przed uruchomieniem a ile po zamknięciu programu. Za pierwszym razem zostanie mniej pamieci. Ale następnie uruchom i zamknij program kilka razy i wtedy zawsze ilość pamieci powinna zostawać taką samą.. rob po kawałku bo jak wrzucisz wszystko naraz to nigdy nie znajdziesz buga. Debugować możesz np. Poprzez wyświetlanie jakiś zmiennych w konsoli, np. Czy progr wszedł w daną funkcję lub czy jakaś funkcją zwróciła błąd itp
3
[#20] Re: [C] Silnik 3D

@mateusz_s, post #19

zanim zaczniesz cokolwiek wyświetlać to miej po kolei dobrze ogarniętą cała resztę czyli: otwieranie i zamykanie screena, okna, alokowanie i zwalnianie potrzebnej pamięci i bitmap

Baaaardzo mądra uwaga. To niby wydaje się takie oczywiste, a wcale tak nie jest. Masa gier i to nawet takich za dziesiątki milionów dolarów jest zbudowana na tak mizernych, lamerskich podstawach, że aż trudno uwierzyć. Jeżeli na początku się nie ogarnie takich (mało interesujących niestety w programowaniu) podstaw to gdy później na czymś takim zbudujemy coś złożonego to ciężko będzie poprawiać te podstawy. A gdy zgrabnie sobie to wszystko zorganizujemy to później można wszystko. Nawet można zrobić przełączanie się z między oknem, a ekranem w trakcie gry (chociaż to raczej nie na standardowych układach graficznych). I co najważniejsze - robimy to raz w życiu, a później tylko z tego korzystamy we wszystkich kolejnych produkcjach (zwłaszcza jeżeli jest to zgrabnie odseparowane od kodu gry.

Ostatnia aktualizacja: 15.09.2023 11:19:13 przez MDW
1
[#21] Re: [C] Silnik 3D

@mateusz_s, post #19

Racja. Kod ktory byl zrobiony grubo ponad rok temu to poprostu ułańska fantazja niepodparta zadna wiedza. Na dzis uporzadkowalem go i podzielilem na moduly funkcjonalne gdzie wiekszosc logicznych elementow jest odseparowana. Blad z wysypywaniem sie wkoncu odnalazlem. Teraz nie ma z tym problemow a i pamiec nie ucieka. O ile wczesniejsze krolowaly zle praktyki o tyle teraz problemy wynika z nieznajomosci Amigi od strony programowania. Proste tematy jak np. wysypywanie sie programu przez "tony" sygnalow IDCMP wymagaly jedynie dodania jednej linii na ich bufforowanie. Ale szukanie powodu zajelo mi sporo czasu. No i pojawiaja sie nowe kwiatki, np: Jak dodalem okno w tle zeby miec raw_key to renderowanie modelu w obszarze (domyslam sie) niewidzialnej belki okna powoduje crash. Nie wiem czy to normalne ale jest jaks kolizja screen/window
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem