Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy wielkość klasy ma znaczenie?

Ostatnio zmodyfikowano 2011-07-31 03:26
Autor Wiadomość
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:

C/C++
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;
   
    // konstruktory itd
};

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?
P-36636
akwes
» 2011-07-23 01:18:11
C/C++
sizeof( Ship );


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.

P-36642
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ęć.
P-37011
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ęć.
?
P-37013
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ć.
P-37014
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.
P-37017
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.

P-37034
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];

?

P-37446
« 1 » 2 3 4
  Strona 1 z 4 Następna strona