ФлеймФорумПрограммирование

Оптимизация классов

Страницы: 1 2 Следующая »
#0
21:15, 7 авг 2011

Я решил в своей игре сделать один класс содержащий подклассы которые в свою очередь содержат другие подклассы, но реализовав этот класс понял что я явно неправильно его сделал, так как он занимает 450 мегабайт оперативной памяти, я хотел спросить есть ли какие-то правила классостроения? или может быть мне лучше сделать много маленьких классов без объединяющих их других классов?

#1
21:19, 7 авг 2011

ох щи

#2
21:41, 7 авг 2011

OCHE TOLSTO

#3
22:59, 7 авг 2011

да

#4
1:07, 8 авг 2011

честно не знаю поможет или нет, но вот смотри:
Допустим нам надо реализовать дерево классов. Базовый - класс А, из него выходят класс B и C. В классе B есть классы BA и BB, в классе C - CA.
Вариант 1
При этом при создании классов сразу объявляем объекты.

  class BA
  {...
  };
  class BB
  {...
  };
  class CA
  {...
  };
  class B
  { ...
     BA ba;
     BB bb;
   };
   class C
   {
     ...
    CA ca;
   };
class A
{
  ...
  B b;
  C c;
};

Вариант 2
Вместо объявления объектов делаем указатели на объекты. Создаем объекты в нужном нам месте и удаляем когда надо.

 class BA
 {...
 };
 class BB
 {...
 };
 class CA
 {...
 };
 class B
 {...
   BA *ba;
   BB *bb;
   ...
   somefunc_ba() {...;ba = new BA;...}
   somefunc_bb() {...;bb = new BB;...}
 };
 class C
 {...
   CA *ca;
   ...
   somefunc_ca() {...;ca = new CA;...}
 };
 class A
 {...
   B *b;
   C *c;
   ...
   somefunc_b() {...;b = new B;...}
   somefunc_c() {...;c = new C;...}
 };

При использовании второго способа мы не будем тратить лишнюю память на те объекты, которые в данный момент не нужны.

Или мой ответ не совсем в ту струю?

#5
2:10, 8 авг 2011

kroonk

> Я решил в своей игре сделать один класс

Нафига?

#6
2:27, 8 авг 2011

Drazd я сейчас использую 1 способ, 2-ой мне не подходит потому что мне постоянно нужны все объекты. Antilеgent так удобней.

#7
2:33, 8 авг 2011

kroonk

> так удобней.

Чем? Так неправильно ведь нифига. Объединять суперклассом нужно только те классы, у которых значительная часть свойств и методов - одинаковые.

#8
9:44, 8 авг 2011

Принципы ООП не спасают отца русской демократии? Ну напишешь ты всё в одном классе и что? Потом будешь листать - искать нужный тебе объект в этих дебрях? Разве это "удобно"?

правка: added

имхо книжков почитать надо...

#9
10:30, 8 авг 2011

У меня так.

class  geObject{
public:
  std::vector<geObject>  Components;      // Список компонентов объекта
};

Вкратце - делаешь один суперкласс, от него наследуешь все остальные, их можешь запихивать в его компоненты сколько тебе влезет.

#10
11:59, 8 авг 2011

Лис®©™
> std::vector<geObject*> Components;
fxd

#11
12:11, 8 авг 2011

Antilegent
> Объединять суперклассом нужно только те классы, у которых значительная часть
> свойств и методов - одинаковые.
Ну и так я так делаю:

Игрок:
{
  ...
}
NPC:
{
  ...
  ИИ
}
Суперкласс:
{
  Игрок А
  NPC Б[100]
  ...
}

Например игрок от NPC отличается только тем, что у NPC есть описание поведения.

typedef
> Принципы ООП
Что это такое?

Лис®©™
Я не пользовался std, можно подробнее, как реализовать этот метод?

#12
12:52, 8 авг 2011

kroonk
> Ну и так я так делаю:
Не так.
Надо

Игрок:
{
  ...
}
NPC: Игрок
{
  ИИ
}

#13
13:21, 8 авг 2011

kroonk
Показываю еще раз. С фиксом от Пушкова.

class  myObject{
public:
  std::vector<myObject*>  Components;      // Список компонентов объекта
};


class myPhysObject: public myObject;
class myAIObject: public myObject;
...
class myDestructibleObject: public myPhysObject;
...
class myMeshObject: public myObject;

То, что все эти ниже приведенные объекты наследуются от myObject так же делает их myObject'-ами и позволяет записывать в список компонентов любого другого myObject. std::vector - это стандартный контейнер библиотеки STL (Standard Template Library), и может быть заменен (по желанию) самописным. Мне было влом возиться со своими контейнерами, поэтому я и взял вектор.

#14
14:17, 8 авг 2011

Лис®©™
> std::vector<myObject*> Components; // Список компонентов объекта
std::vector< boost::shared_ptr<myObject> >  Components;      // Список компонентов объекта
[тролфацэ.жпэг]

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.