Autor Wątek: zmniejszanie rozmiaru intra 4kb  (Przeczytany 3728 razy)

Offline maxmad

  • Użytkownik

# Sierpień 29, 2009, 00:53:10
Czesc,

Napisalem intro 4kb. Wykorzystalem do tego Visual Studio i Crinklera do skompresowania. Intro po skompresowaniu zajmuje 4296 bajtow. Jak mozna jeszcze skompresowac intro bardziej do 4096 bajtow? Mozna cos ustawic w opcjach Visual Studio aby nie linkowalo nie potrzebnych bibliotek, plikow itd?

Pozdro i dzieki

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Charibo

  • Redaktor

# Sierpień 29, 2009, 01:22:48
Probowales z flagami /COMPMODE:SLOW i /TRUNCATEFLOATS? Pare bajtow powinno obciac. :)

Offline Esidar

  • Użytkownik

# Sierpień 29, 2009, 03:28:53
/NODEFAULTLIB w linkerze

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 29, 2009, 03:52:25
Cytuj
Napisalem intro 4kb.
Na Riverwasha? Wybierasz się? :)

Cytuj
ntro po skompresowaniu zajmuje 4296 bajtow. Jak mozna jeszcze skompresowac intro bardziej do 4096 bajtow? Mozna cos ustawic w opcjach Visual Studio aby nie linkowalo nie potrzebnych bibliotek, plikow itd?
O 200 bajtów nie zejdziesz żadnymi opcjami Crinklera, czy Visuala, jeżeli masz je sensownie ustawione.

Krótka checklista:
- sprawdź, czy ustawienia Crinklera są przynajmniej tak mocne, jak domyślne (bardziej wykręcać nie trzeba, bo nie zdarzyło mi się w ten sposób oszczędzić więcej niż kilka bajtów),
- Optimization: Minimize Size,
- Favor Size or Speed: Favor Small Code,
- Inline Function Expansion: Only __inline,
- Omit Frame Pointers: Yes,
- Enable String Pooling: Yes,
- Enable C++ Exceptions: No,
- wszystko, co ma w nazwie "check": No/Default,
- Function Level Linking: Yes,
- Floating Point Model: Fast,
- Calling Convention: __stdcall (wybrane empirycznie, możesz sprawdzić wszystkie dla swojego przypadku),


Dodatkowo możesz trochę zaoszczędzić na wywołaniach funkcji w prosty sposób: wszystkie swoje funkcje, które wywołujesz tylko z jednego miejsca oznacz jako __forceinline (naturalnie kod funkcji musi być w tym samym pliku, ale w ostateczności cały kod intra można #includami połączyć w jeden plik).


Daj znać, czy i ile pomogło. :)


Cytuj
/NODEFAULTLIB w linkerze
Jakby miał domyślne liby, to by chyba w życiu do 4.2kB nie zszedł. :)

Offline maxmad

  • Użytkownik

# Sierpień 29, 2009, 12:06:44
Witam,

Dzieki wszystkim za wskazowki dotyczace zmniejszenia rozmiaru intra za pomoca ustawien opcji VS. Wszystkie sie przydaly. Samymi ustawieniami srodowiska VS mozna bardzo osiagnac wiele. Intro teraz po skompresowaniu ma 4031. Moze komus sie to przyda w przyszlosci, oto komenda wywolania Crinklera jaka zastosowalem:

C:\crinkler>crinkler.exe /OUT:intro.exe /SUBSYSTEM:WINDOWS /COMPMODE:SLOW /TRU
NCATEFLOATS /HASHSIZE:256 /HASHTRIES:256 /ORDERTRIES:1024 /UNSAFEIMPORT /PROGRES
SGUI main.obj ImcSongPlayer.obj ImcSongData.obj msvcrt_old.lib kernel32.lib user
32.lib gdi32.lib opengl32.lib glu32.lib winmm.lib

Dorzuce jeszcze tego linka od siebie http://forum.warsztat.gd/index.php/topic,6684.30.html

Krzysiek K.: Intro jest na Riverwasha, na ktorym nie bede fizycznie. Bede za to duchem i umyslem tam:)

Watek mozna zamknac
« Ostatnia zmiana: Sierpień 29, 2009, 12:12:30 wysłana przez maxmad »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 29, 2009, 13:47:14
Cytuj
Krzysiek K.: Intro jest na Riverwasha, na ktorym nie bede fizycznie. Bede za to duchem i umyslem tam:)
Nieźle. Też właśnie siedzę nad intrem na "pranie". Szkoda tylko że nie jedziesz. Uchylisz na PM chociaż rąbka tajemnicy, co to będzie (ot, wrodzona ciekawość)? ;)

Cytuj
msvcrt_old.lib
Skąd to masz i co właściwie to robi (chociaż co robi, to się chyba domyślam)? :)

Cytuj
Watek mozna zamknac
Od kiedy to zamykamy tutaj wątki po zakończeniu dyskusji? :)

Offline maxmad

  • Użytkownik

# Sierpień 29, 2009, 17:13:21
Krzysiek K.: msvcrt_old.lib jest to stara biblioteka msvcrt.lib, ktora byla dolaczana do VS6. Podczas kompresowania Crinklerem kompresor wypluwal blad blabla ImageBase blabla. Doradzono mi, ze to przez najnowsza biblioteke msvcrt.lib, z ktorej korzystaja najnowsze srodowiska VS. Sciagnalem ze strony Microsoftu SDK dla VS6, wydobylem stara wersje biblioteki msvcrt.lib (nazwalem ja msvcrt_old.lib) i dolaczylem ja do mojego projektu robionego na nowym VS. Calosc skompresowalem Crinklerem tym razem bez problemow. 

PM powedrowal do Ciebie, dostales go?

Offline ConayR

  • Użytkownik

# Lipiec 28, 2010, 00:27:44
Necro.

Mam pytanie odnośnie tego:
Function Level Linking: Yes

W jaki sposób ma to pomóc w zmniejszeniu rozmiaru pliku wykonywalnego, skoro jest to funkcja współpracująca z generowaniem COMDATów, które z definicji pozwalają na bezstresowe mnożenie kodu w programie (czyli na bloat kodu)?

No i jeszcze odnośnie calling conventions. Teoretycznie __fastcall powinien generować mniejszy kod, bo piersze dwa parametry zawsze idą w rejestrach a nie przez stos. Jeśli nie robi się funkcji foo(a, b, c, d, e, f, g, h) to zysk może być znaczny. Sugerowany __stdcall jak i __cdecl wszystko przesyłają przez stos, więc dochodzą pushe/popy w kodzie.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 28, 2010, 01:40:36
Cytuj
No i jeszcze odnośnie calling conventions. Teoretycznie __fastcall powinien generować mniejszy kod, bo piersze dwa parametry zawsze idą w rejestrach a nie przez stos. Jeśli nie robi się funkcji foo(a, b, c, d, e, f, g, h) to zysk może być znaczny. Sugerowany __stdcall jak i __cdecl wszystko przesyłają przez stos, więc dochodzą pushe/popy w kodzie.
Najlepszym calling convention w przypadku intr 4k jest najczęściej __forceinline. ;)

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 28, 2010, 01:44:05
Najlepszym calling convention w przypadku intr 4k jest najczęściej __forceinline. ;)
Chcesz powiedzieć, że inlinowanie funkcji generuje _mniejszy_ kod? Chyba, że funkcja jest odpalana w tylko jednym miejscu.
« Ostatnia zmiana: Lipiec 28, 2010, 01:46:01 wysłana przez Kos »

Offline ConayR

  • Użytkownik

# Lipiec 28, 2010, 01:51:25
Najlepszym calling convention w przypadku intr 4k jest najczęściej __forceinline. ;)
Dla funkcji wywoływanych raz - tak. Dla praktycznie wszystkich innych - nie zgodzę się. ;P

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 28, 2010, 10:44:16
Cytuj
Chcesz powiedzieć, że inlinowanie funkcji generuje _mniejszy_ kod? Chyba, że funkcja jest odpalana w tylko jednym miejscu.
W większości moich intr 100% własnych funkcji odpalanych jest tylko w jednym miejscu. :)

Cytuj
Dla funkcji wywoływanych raz - tak. Dla praktycznie wszystkich innych - nie zgodzę się. ;P
Rzadko się zdarza (ale czasami tak), byś w 4k musiał wywoływać jedną funkcję z wielu miejsc. Na dobrą sprawę, rzadko się zdarza, żebyś w intrze 4k w ogóle potrzebował jakichkolwiek funkcji poza WinMainCRTStartup. Mi się jeszcze nie zdarzyło i jeżeli funkcje były, to tylko dla wygody. :)

Offline ConayR

  • Użytkownik

# Lipiec 28, 2010, 15:38:07
Rzadko się zdarza (ale czasami tak), byś w 4k musiał wywoływać jedną funkcję z wielu miejsc. Na dobrą sprawę, rzadko się zdarza, żebyś w intrze 4k w ogóle potrzebował jakichkolwiek funkcji poza WinMainCRTStartup. Mi się jeszcze nie zdarzyło i jeżeli funkcje były, to tylko dla wygody. :)
Zapomniałem, że Ty sphere tracingu używasz i 99% kodu znajduje się w shaderze. ;]

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 28, 2010, 15:51:16
Zapomniałem, że Ty sphere tracingu używasz i 99% kodu znajduje się w shaderze. ;]
Póki co, tak było tylko w jednym.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Lipiec 28, 2010, 22:06:11
Wygląda na to, że obecnie większość nowych intr 4k to jeden wielki pixel shader.