Показать сообщение отдельно
Старый 01.10.2006, 19:44   #1
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Методы оптимизации

Итак, что же такое оптимизация? А это просто изменение исходного кода программы / добавление новых модулей с целью повышения её быстродействия. Рассмотрим конкретный пример:

 
...
If MouseHit(1) PickUnit()
...
Function PickUnit()
  Pick=CameraPick(camera,MouseX(),MouseY())
  For u.unit = each unit
    If Pick=u\model SelectUnit(u)
  Next
End Function
С функцианальной точки зрения код совершенно правильный, и всегда будет получаться ожидаемый результат, но посмотрим что можно же здесь улучшить:

1) "Отброс невозможных вариантов"
Нетрудно заметить, что при нажатии кнопки мыши мы можем выделить только одного юнита, значим мы можем изменить код функции так:
 
Function PickUnit()
  Pick=CameraPick(camera,MouseX(),MouseY())
  For u.unit = each unit
    If Pick=u\model 
        SelectUnit(u)
        Return
    EndIf
  Next
End Function
Итак, мы в среднем увеличили скорость выполнения цикла в два раза!

2)"Задание условий выполнения"
Так же можно заметить, что при нажатии кнорки мыши мы не всегда попадаем в юнита, а значит поставить проверку попали ли мы вообще в юнита? Изменим код так:
 
Function PickUnit()
  Pick=CameraPick(camera,MouseX(),MouseY())
  If Pick=0 Return
  For u.unit = each unit
    If Pick=u\model SelectUnit(u)
    Return
  Next
End Function
Здесь важно заметить, что подразумевается, что кроме юнитов никакие другие объекты не выделяются. Если это не так, то можно попробовать сделать следующее:

Function CreateUnit()
  u.unit= New unit
  ...
  NameEntity(u\model,"Unit")
  ...
End Function
 
Function PickUnit()
  Pick=CameraPick(camera,MouseX(),MouseY())
  If Pick=0 Return
  If EntityName$(u\model)<> "Unit" Return
  For u.unit = each unit
    If Pick=u\model 
        SelectUnit(u)
        Return
    EndIf
  Next
End Function
P.S. Если вы имеете дело не с функцией, или кроме цикла (не обязательно цикла) имеется что-то ещё, то для первого случая нужно использовать Exit, а для второго If...End If.
(Offline)
 
Ответить с цитированием