Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2010, 23:19   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Оптимизация If + Or

Требуется помощь в оптимизации и создании функции перемещения:
Код:
 Const
  D_NULL  = $0000;
  D_LEFT  = $0001;
  D_RIGHT = $0002;
  D_UP    = $0004;
  D_DOWN  = $0008;
Код:
 Procedure MoveP(Direct : Byte);
  Begin
   {..}
  End;
Код:
 Procedure ControlClick(X,Y : Integer);
  Begin
   With Player Do
    Begin
     If (XS = X + 1) And (YS = Y     ) Then MoveP(D_LEFT  Or D_NULL ) Else
     If (XS = X + 1) And (YS = Y + 1 ) Then MoveP(D_LEFT  Or D_DOWN ) Else
     If (XS = X + 1) And (YS = Y - 1 ) Then MoveP(D_LEFT  Or D_UP   ) Else
     If (XS = X - 1) And (YS = Y     ) Then MoveP(D_RIGHT Or D_NULL ) Else
     If (XS = X - 1) And (YS = Y + 1 ) Then MoveP(D_RIGHT Or D_DOWN ) Else
     If (XS = X - 1) And (YS = Y - 1 ) Then MoveP(D_RIGHT Or D_UP   ) Else
     If (XS = X    ) And (YS = Y     ) Then MoveP(D_NULL  Or D_NULL ) Else
     If (XS = X    ) And (YS = Y + 1 ) Then MoveP(D_NULL  Or D_DOWN ) Else
     If (XS = X    ) And (YS = Y - 1 ) Then MoveP(D_NULL  Or D_UP   );
    End;
   DrawMap;
  End;
Проблемы в создании функции перемещения - как сделать проверку возможных состояний? Простыми IFами?
Код:
If Direct = D_DOWN Then ВНИЗ
If Direct = D_DOWN Or {Или And - запутался} D_LEFT Then ВНИЗ И ВЛЕВО
etc.
И можно ли что-то улучшить в ControlClick?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 08.06.2010, 23:33   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

1. Проверка либо if либо case, третьего не дано.
2. Если ты хочешь побитово слаживать флаги, то оператор или + или or.

p.s. Высчитай заранее значения для диагональных направлений, забей их в константы и используй проверку case Direct of
Если сделать Direct перечисляемым типом, то новые версии IDE Дельфи даже за тебя будут значения подставлять (правда не всегда срабатывает, но бывает =)).
Case предпочтительнее с точки зрения оптимизации, т.к. проверка всего одна производится, в отличии от серии if операторов.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 08.06.2010 в 23:42.
mutabor вне форума Ответить с цитированием
Старый 08.06.2010, 23:34   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Насчет
Цитата:
Простыми IFами?
возможно удобнее будет через Case .. Of
EDIT:
ой, mutabor опередил...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 08.06.2010, 23:36   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А Case адекватно поддерживает Or?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 08.06.2010, 23:46   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
А Case адекватно поддерживает Or?
Нет, нужны константы, я поэтому и говорю, определи их заранее, их не так много, четыре всего. Хотя если слаживать константы, думаю можно, компилятор посчитает сразу, главное - не использовать переменные.

Что касается ControlClick, то тут есть простор для оптимизации. Т.к. у тебя побитово слаживаются, то есть возможность добавлять по ходу флаги, в зависимости от условий, т.е. по условиям если xs больше x то добавляем один флаг, если ys > y то другой плюсуем (просьба не понимать буквально, я концепцию хочу донести просто), таким образом можно свести к нескольким выражениям, но читаемость кода пропадет, я лишний раз бы подумал делать ли так. Т.е. по этому алгоритму в коде будет всего один вызов функции MoveP, а перед ним несколько выражений с рассчетами флагов, полученное значение и передадим в функцию.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 09.06.2010 в 00:00.
mutabor вне форума Ответить с цитированием
Старый 08.06.2010, 23:50   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Спасибо. Так и поступим...


Цитата:
p.s. Высчитай заранее значения для диагональных направлений, забей их в константы и используй проверку case Direct of
Обошелся всего с четырьмя. Case прекрасно поддерживает Or.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 09.06.2010 в 00:01.
Alex Cones вне форума Ответить с цитированием
Старый 09.06.2010, 01:42   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

уже не очень надо(пока у нас форум барахлил), но тем не менее выложу на будущее:
Цитата:
Case предпочтительнее с точки зрения оптимизации, т.к. проверка всего одна производится, в отличии от серии if операторов.
поддерживаю, сводится к вычитаю, без явного сравнения(правда оно тоже на вычитании основано, но там неявное вычитание, через теневые регистры...что медленнее(особенно серия сравнений)).
насчет case некоторые правила оптимизации в нем(тут все про беззнаковое сравнение...то есть когда нет отрицательных значений):
1)не стоит сравнивать с нулем(если у вас без знаковое сравнение естественно), лучше использовать else
2)выставлять все по возрастанию.
на примере Алекса это будет
Код:
case Direct of
 1{D_LEFT}:ВЛЕВО
 2{D_RIGHT:ВПРАВО
 3{D_LEFT+D_RIGHT}:ПРАВО И ВЛЕВО//не думаю что возможно, так что пропускаем
 4{D_UP}:ВВЕРХ
 5{D_UP+D_LEFT}:ВВЕРХ И ВЛЕВО
 6{D_UP+D_RIGHT}:ВВЕРХ И ВПРАВО
 7{D_UP+D_LEFT+D_RIGHT}:ВВЕРХ И ВЛЕВО И ВПРАВО//не думаю что возможно, так что пропускаем
 8{D_DOWN}:ВНИЗ
 9{D_DOWN+D_LEFT}:ВНИЗ-ВЛЕВО
 10{D_DOWN+D_RIGHT}:ВНИЗ-ВПРАВО
 11{D_DOWN+D_LEFT+D_RIGHT}:ВНИЗ-ВЛЕВО-ВПРАВО//не думаю что возможно, так что пропускаем
 12{D_DOWN+D_UP}:ВНИЗ-ВВЕРХ//не думаю что возможно, так что пропускаем
 13{D_DOWN+D_UP+D_LEFT}:ВНИЗ-ВВЕРХ-ВЛЕВО//не думаю что возможно, так что пропускаем
 14{D_DOWN+D_UP+D_RIGHT}:ВНИЗ-ВВЕРХ-ВПРАВО//не думаю что возможно, так что пропускаем
 15{D_DOWN+D_UP+D_RIGHT+D+LEFT}:ВНИЗ-ВВЕРХ-ВПРАВО-ВЛЕВО
 else НОЛЬ
end;
ну или ошибки показывайте на строках с комментами(то что поидее невозможно)
вот так самое быстрое поидее
цифры можно заменить на константы которые в комменте({})
(есть у меня еще идея, но это на асме надо писать, и это извращение уже...и я не уверен что оно быстрее(знаю точно что в коде скорее всего больше выйдет даже)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многокритериальная оптимизация derzkaya_88 Помощь студентам 0 08.06.2010 02:44
Оптимизация Viper1287 Операционные системы общие вопросы 7 13.09.2009 15:33
Оптимизация Flangini Microsoft Office Excel 5 11.06.2009 11:48
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03