skax Temat założony przez niniejszego użytkownika |
Czy wielkość klasy ma znaczenie? » 2011-07-23 00:45:42 Witam. Pisze gre. Mam taka oto klate statku bojowego: class Ship { private: SHIP_TYPE shipType; Way * w; unsigned goldPrice; unsigned metalPrice; float timeProduction; unsigned deuterUse; unsigned speed; unsigned hp; unsigned allHp; unsigned attack; unsigned defense; float timeAttack; unsigned x; unsigned y; unsigned frontX; unsigned resultX; unsigned amount; };
metod jest ok 3-4 ... Chcialbym sie dowiedziec, czy ta klasa nie jest za duza? Chodiz mi o to, zeby ten kod byl poprawy pod wzgledem zalozen OOPu ;).. tak sie zastanawialem i sa tu wszystkie niezbedne wlasciwosci STATKU bojowego. Jednak czytalem, ze klasy nie moga byc zbyt wielkie. Co o tym sadzicie? |
|
akwes |
» 2011-07-23 01:18:11 Pamiętaj że metody są w pamięci tylko raz. Można powiedzieć że są wykonywane na rzecz obiektów, i potrzebne są w pamięci tylko raz. Ważne żeby klasa nie miała w pamięci tekstur ani obiektów ciężkich, najlepiej te obiekty trzymać w klasie za pomocą wskaźnika, co sprawia że klasy są naprawdę małe. |
|
Dawidsoni |
» 2011-07-25 18:47:21 Jeśli zamierzasz stworzyć 1000 obiektów tej klasy, to ma znaczenie. Jeśli kilka, to różnicy raczej dużej nie ma. Sam możesz to sprawdzić stosując operator sizeof() i mnożąc przez ilość istniejących obiektów.
Jeśli twoja gra nie będzie taka duża, że może "zamulać" to nie musisz się nawet tym przejmować.
A co do metod to jeśli stworzysz zaledwie kilka obiektów tej klasy to też mają wpływ na pamięć. |
|
akwes |
» 2011-07-25 18:52:30 Co? Metody klasy są w pamięci tylko raz. Nie ważne ile stworzyć obiektów danej klasy, metody będą stworzone raz i zawsze zajmują tyle samo miejsca, nie ważne czy masz 1 obiekt czy 100000. Na przyrost wagi ma wpływ tylko waga zmiennych. Wiec co rozumiesz przez: A co do metod to jeśli stworzysz zaledwie kilka obiektów tej klasy to też mają wpływ na pamięć.
|
? |
|
m4tx |
» 2011-07-25 18:54:46 Zastanawiam się, czy wszędzie musisz używać intów. Na przykład przy hp chyba nie potrzebujesz 4-bajtowego unsigned inta, wystarczyłby unsigned short (czy nawet lepiej - uint16_t). Jednak jeśli nie będziesz miał zbyt wielu obiektów tej klasy nie ma się czym przejmować. |
|
akwes |
» 2011-07-25 18:58:00 12 unsigned * 4 bajty = 48 bajtów, 48 bajtów * 1000 obiektów = 48 000 bajtów = 46,8 KB Myślę że to nie jest dużo, jeżeli ktoś ma komputer >640 kB RAM :P
+ jeden wskaźnik czyli praktycznie nic, i jeszcze jeden typ całkowity enum, no to ok, 13 usigned :P
Textura waży więcej.... Niż 1000 obiektów tego statku.
Co więcej dodam że sf::Sprite czyli LEKKA KLASA! dostarczona przez SFML waży 196 bajtów, czyli naprawdę, ta klasa jest malutka.
|
|
Dawidsoni |
» 2011-07-25 20:28:36 Nie zrozumiałeś mnie akwes. Chodzi o to, że jeśli metody mają 100 bajtów, a składniki klasy 50 bajtów to: - jeśli stworzymy zaledwie 4 obiekty tej klasy to metody stanowią jej 33(3)% pamięci - jeśli stworzymy 98 obiektów tej klasy to metody stanowią jej 2% pamięci
A więc jeśli tworzymy mało obiektów klasy, to funkcje stanowią duży jej % pamięci. Można więc pomyśleć o ich optymalizacji.
|
|
skax Temat założony przez niniejszego użytkownika |
» 2011-07-28 20:02:41 Dziekuje wszystkim. Zoptymalizuje jak sie da ;) Ale nadal sie zastanawiam czy np pole float timeProduction; powinno byc polem STATKU BOJOWEGO czy tez STOCZNI, w ktorej znajduja sie te statki bojowe Ship* ships[3]; ? |
|
« 1 » 2 3 4 |