![]() |
|
Модераторы: bsa |
![]()
|
|
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
Долго я думал, как сделать, так и не придумал. Теперь жду совета тут. Суть:
Есть класс c_engine ( движок, понятно ) Упрощённая версия:
Вот. Движок надо инициализировать, после чего с его помощью можно будет грузить рисунки и рисовать их. Проблема начинается в других классах. Дело в том, что функции загрузки и отображения рисунка требуются чуть ли не на каждом углу, то есть надо передавать экземпляр движка в каждую функцию, которой требуется что-нибудь на экране нарисовать. По-моему это криво как-то. Собственно, вопрос, как спроектировать прогу так, чтобы функции для работы с рисунками были видны везде, где нужно и это бы не создавало громоздкого кода? |
|||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Обычно функции рисования принадлежат самим графическим объектам.
Классический пример: class Shape { ... virtual void Draw(); } class Circle : public Shape { ... virtual void Draw(); ... } хотелось бы посмотреть на код движка, подозреваю что там вагон if с else или switch здоровый |
|||
|
||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
Что ж мне, двадцать раз один и тот же код писать? |
|||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Почему 21 раз? ООП для того и придуман, что бы писать один раз.
Почему один и тот же? Каждая фигура рисуется поразному. |
|||
|
||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
В том то и дело, что у меня не фигуры а рисунки, из файлов загружаемые, и принцип их отображения везде один.
|
|||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
тогда так:
class Image { ... c_engine & engine; Image(c_engine & engine):engine(engine) { } } Когда создаём объект изображения (Image) передаём ему ссылку на движок |
|||
|
||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Например, написать движок как синглтон. Он будет доступен в произвольном месте программы. Либо же, дейсвительно хранить ссылку на движок везде, где надо. |
|||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Я так понимаю объект движка один на всю программу. Сделай функцию которая вернет ссылку на него
static c_engine engine; c_engine & GetEngine() { return engine; } |
|||
|
||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
Его нельзя делать статическим: если обратится к его функциям до инициализации движка - всё полетит.
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Это сообщение отредактировал(а) Cheloveck - 19.9.2010, 18:02 -------------------- ![]() |
|||
|
||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
К сожалению, если каждый раз, когда надо нарисовать рисунок, проверять, инициализирован ли движок, пострадает производительность.
Есть мысли, что надо как-то наследовать все классы от движка, только вот сомнительно это всё видится... |
|||
|
||||
| vnf |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
На выполнении if(is_init) пострадает производительность? Не смешите меня. На сколько я помню у вас картинки с файлов грузяться, затраты времени несравнимы. О смертном грехе преждевременной оптимизации и до меня много сказано. Никто не мешает инициализировать движок при запуске программы или использовать отложенную инициализацию
Это сообщение отредактировал(а) vnf - 19.9.2010, 18:54 |
||||
|
|||||
| Cheese |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
||||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
Даже если в памяти, работа с массивом битов в памяти (каким является картинка) займет на много больше времени.
Возможно проверка условия будет выполняться паралельно с другой операцией процессора и ни одного лишнего такта не потратиться а может её вообще оптимизатор компилятора выкинет. В общем когда речь идет о производительности, сначала напишите код, отпрофилируйте его, а потом начинайте оптимизировать. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |