Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу спроектировать прогу 
V
    Опции темы
Cheese
Дата 19.9.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



Долго я думал, как сделать, так и не придумал. Теперь жду совета тут. Суть:
Есть класс c_engine ( движок, понятно )

Упрощённая версия:
Код

class c_engine
{
     private:
          int screen_width;
          int screen_height;
     public:
          c_engine( int screen_width, int screen_height );
          draw_image( image* i ); /* image - просто вымышленная структура */
          image* load_image( std::string filename );
};


Вот. Движок надо инициализировать, после чего с его помощью можно будет грузить рисунки и рисовать их.
Проблема начинается в других классах. Дело в том, что функции загрузки и отображения рисунка требуются чуть
ли не на каждом углу, то есть надо передавать экземпляр  движка в каждую функцию, которой требуется что-нибудь
на экране нарисовать. По-моему это криво как-то. 

Собственно, вопрос, как спроектировать прогу так, чтобы функции для работы с рисунками были видны везде, где нужно
и это бы не создавало громоздкого кода?
PM MAIL   Вверх
vnf
Дата 19.9.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Обычно функции рисования принадлежат самим графическим объектам.
Классический пример:

class Shape
{
...
   virtual void Draw();
}

class Circle : public Shape
{
...
   virtual void Draw();
...
}

хотелось бы посмотреть на код движка, подозреваю что там вагон if с else или switch здоровый
PM MAIL   Вверх
Cheese
Дата 19.9.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



Цитата(vnf @ 19.9.2010,  15:47)
Обычно функции рисования принадлежат самим графическим объектам.
Классический пример:

class Shape
{
...
   virtual void Draw();
}

class Circle : public Shape
{
...
   virtual void Draw();
...
}

хотелось бы посмотреть на код движка, подозреваю что там вагон if с else или switch здоровый

Что ж мне, двадцать раз один и тот же код писать?
PM MAIL   Вверх
vnf
Дата 19.9.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Почему 21 раз? ООП для того и придуман, что бы писать один раз.
Почему один и тот же? Каждая фигура рисуется поразному.

PM MAIL   Вверх
Cheese
Дата 19.9.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



В том то и дело, что у меня не фигуры а рисунки, из файлов загружаемые, и принцип их отображения везде один.
PM MAIL   Вверх
vnf
Дата 19.9.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



тогда так:

class Image
{
...
   c_engine & engine;
   Image(c_engine & engine):engine(engine)
  {
  }
}

Когда создаём объект изображения (Image) передаём ему ссылку на движок

PM MAIL   Вверх
Cheese
Дата 19.9.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



Цитата(vnf @  19.9.2010,  16:18 Найти цитируемый пост)
Когда создаём объект изображения (Image) передаём ему ссылку на движок


А откуда ж взять эту ссыльку в произвольном месте программы?
PM MAIL   Вверх
JackYF
Дата 19.9.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(Cheese @  19.9.2010,  15:27 Найти цитируемый пост)
эту ссыльку в произвольном месте программы? 

Например, написать движок как синглтон. Он будет доступен в произвольном месте программы.

Либо же, дейсвительно хранить ссылку на движок везде, где надо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vnf
Дата 19.9.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Я так понимаю объект движка один на всю программу. Сделай функцию которая вернет  ссылку на него

static c_engine engine;

c_engine & GetEngine()
{
   return engine;
}
PM MAIL   Вверх
Cheese
Дата 19.9.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



Его нельзя делать статическим: если обратится к его функциям до инициализации движка - всё полетит.
PM MAIL   Вверх
Cheloveck
Дата 19.9.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

class c_engine
{
    static c_engine engine;
    static bool is_init /*= false*/;

public:
    static c_engine * GetEngine()
    {
        c_engine * result = NULL;
        if(is_init)
            result = & engine;
        return result;
    } 

    static void Init()
    {
        is_init = true;
    }
};


Это сообщение отредактировал(а) Cheloveck - 19.9.2010, 18:02


--------------------
user posted image
PM Jabber   Вверх
Cheese
Дата 19.9.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



К сожалению, если каждый раз, когда надо нарисовать рисунок, проверять, инициализирован ли движок, пострадает производительность.

Есть мысли, что надо как-то наследовать все классы от движка, только вот сомнительно это всё видится...
PM MAIL   Вверх
vnf
Дата 19.9.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Цитата(Cheese @  19.9.2010,  18:14 Найти цитируемый пост)
К сожалению, если каждый раз, когда надо нарисовать рисунок, проверять, инициализирован ли движок, пострадает производительность.


На выполнении if(is_init) пострадает производительность? Не смешите меня. 
На сколько я помню у вас картинки с файлов грузяться, затраты времени несравнимы.
О смертном грехе преждевременной оптимизации и до меня много сказано.

Никто не мешает инициализировать движок при запуске программы или использовать отложенную инициализацию
Код

class c_engine
{
    static c_engine engine;
    static bool is_init /*= false*/;

public:
    static c_engine * GetEngine()
    {
        if(!is_init)
            Init();
        return c_engine;
    } 

    static void Init()
    {
        is_init = true;
        ....
    }
};



Это сообщение отредактировал(а) vnf - 19.9.2010, 18:54
PM MAIL   Вверх
Cheese
Дата 19.9.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 25.11.2007

Репутация: нет
Всего: нет



Цитата(vnf @  19.9.2010,  18:42 Найти цитируемый пост)
На сколько я помню у вас картинки с файлов грузяться


Сначала грузятся с файлов, а потом уже хранятся в памяти.
PM MAIL   Вверх
vnf
Дата 19.9.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



Даже если в памяти, работа с массивом битов в памяти (каким является картинка) займет на много больше времени.
Возможно проверка условия будет выполняться паралельно с другой операцией процессора и ни одного лишнего такта не потратиться
а может её вообще оптимизатор компилятора выкинет.

В общем когда речь идет о производительности, сначала напишите код, отпрофилируйте его, а потом начинайте оптимизировать.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.