Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 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)
 
Ответить с цитированием
Старый 01.10.2006, 19:57   #2
jimon
 
Сообщений: n/a
Re: Методы оптимизации

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

Конечно, рассмотренные выше методы не являются исчерпывающими. Рассмотрим ещё несколько видов оптимизации:

1) "Замена условий формулой"
Это просто замена нескольких IF одной формулой. Вот основные виды:

а)"Переключатель двух состояний"
То есть просто переменная, которая может принимать значения 1 или 0 :
If KeyHit(57) N=1-N
или
If KeyHit(57) N=Not(N)
Всё просто.

б)"Преключатель N состояний"
Это переменная, которая может принимать значения 0,1...N :
If KeyHit(57) K=(K+1) Mod N
в)"Минимумы и максимумы"
Часто используется для переменных, которые возратают (или уменьшаются) только до какого-то определенного значения (например для скорости):
Speed=Speed + (1 And Speed < 2)*.5
г)"Модули"
Используется реже, например здесь:
вместо
If EntityPitch(cam)<75 And EntityPitch(cam)>-75 Then
можно использовать
If Abs(EntityPitch(cam))<75 Then

2)"Исключение медленных операций"
Например, если вам надо определить расстояние между точками в 2D ( в 3D всегда исрользуйте EntityDistance - эта команда значительно быстрее любых подсчетов через координаты!), вы наверняка используете что-то вроде этого:
 
d=Sqr((x1-x2)^2+(y1-y2)^2)
 
If d<10 Then
  ...
End If
Но вы должно быть знаете, что Sqr - ОЧЕНЬ МЕДЛЕННАЯ команда, поэтому лучше написать так (как бы возвести все в квадрат):
 
d=(x1-x2)^2+(y1-y2)^2
 
If d<100 Then
  ...
End If
Результат от этого не изменится, а скорость выполнения увеличится!

P.S. Ну вот вроде все ! Если знаете что-то еще, добавляйте.
(Offline)
 
Ответить с цитированием
Старый 01.10.2006, 20:21   #4
jimon
 
Сообщений: n/a
Re: Методы оптимизации

про If KeyHit(57) K=(K+1) Mod N незнал
пасибки
 
Ответить с цитированием
Старый 01.10.2006, 22:08   #5
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: Методы оптимизации

а мгновенный доступ к елементу типа без перебора ?

Object -есть такая фишка.

Function CreateUnit()
u.unit= New unit
...
name$=Handle (u)
NameEntity u\model, name$
...
End Function

Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
If Pick
u.unit=Object.unit(EntityName(Pick))
If u<>Null
SelectUnit(u)
EndIf
EndIf
End Function
__________________
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 08:25   #6
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Re: Методы оптимизации

Сообщение от jimon
про If KeyHit(57) K=(K+1) Mod N незнал
Лучше такую конструкцию не юзать, ибо она наоборот медленнее чем
K = K + 1
If K > N Then K = 0
Раз в 10 быстрее чем mod.

а)"Переключатель двух состояний"
То есть просто переменная, которая может принимать значения 1 или 0 :
If KeyHit(57) N=1-N
или
If KeyHit(57) N=Not(N)
Всё просто.
Тут как раз первый вариант предпочтительнее, ибо быстрее в 2-3 раза чем NOT.

в)"Минимумы и максимумы"
Часто используется для переменных, которые возратают (или уменьшаются) только до какого-то определенного значения (например для скорости):
Speed=Speed + (1 And Speed < 2)*.5
Здесь тоже лучше такую конструкцию не использовать, ибо медленне чем
If x < 10 Then x = x * 0.5
раза в 2-3

И насчет знака возведения в степень "^", если известна степень, то лучше заменить на умножение N раз, будет быстрее намного.
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 08:48   #7
jimon
 
Сообщений: n/a
Re: Методы оптимизации

Тут как раз первый вариант предпочтительнее, ибо быстрее в 2-3 раза
чем NOT.
not выполняется ALU в один такт
что является самой быстрой операцией за все время существования процесоров

И насчет знака возведения в степень "^", если известна степень, то лучше заменить на умножение N раз, будет быстрее намного.
необязательно, хотя возможно

Здесь тоже лучше такую конструкцию не использовать, ибо медленне чем
If x < 10 Then x = x * 0.5

раза в 2-3
тоже самое, притом компилятор всеравно обе конструкции разворачивает

и надо писать все в одном сообщении !
 
Ответить с цитированием
Старый 02.10.2006, 08:53   #8
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Re: Методы оптимизации

jimon
Этот топик по Блицу или по ассемблеру а?
Может написав на ассемблере такую конструкцию с Not, она будет быстрее выполняться, чем эта же конструкция с Sub, а блиц интерпретирует хз. как. Если неверишь, то проверь практически что будет быстрее работать.
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 18:08   #9
jimon
 
Сообщений: n/a
Re: Методы оптимизации

втом то и дело что блиц конвертит код в asm
 
Ответить с цитированием
Старый 02.10.2006, 20:31   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: Методы оптимизации

Сообщение от Michael
1) "Отброс невозможных вариантов"
Нетрудно заметить, что при нажатии кнопки мыши мы можем выделить только одного юнита, значим мы можем изменить код функции так:
 
Function PickUnit()
  Pick=CameraPick(camera,MouseX(),MouseY())
  For u.unit = each unit
    If Pick=u\model SelectUnit(u)
    Return
  Next
End Function
Итак, мы в среднем увеличили скорость выполнения цикла в два раза!
Ну в "среднем" из цикла производится выход сразу же после проверки первого элемента... работать правильно будет вот так:
[highlight=blitzbasic]
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Return
EndIf
Next
End Function
[/highlight]
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 22:02   #11
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Методы оптимизации

Сообщение от jimon
про If KeyHit(57) K=(K+1) Mod N незнал
пасибки
Эта формула была в топике про форумлы в разделе по алгоритмике
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 22:13   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: Методы оптимизации

А вообще правильнее выход из цикла выполнять так:

[highlight=blitzbasic]
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Exit
EndIf
Next
End Function [/highlight]
Return производит выход из функции или подпрограммы, а не из цикла. Выход из цикла выполнятся оператором Exit.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 22:14   #13
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Re: Методы оптимизации

2 PAX:
А я это писал (насчет Exit).
(Offline)
 
Ответить с цитированием
Старый 02.10.2006, 22:58   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: Методы оптимизации

Сообщение от Michael
2 PAX:
А я это писал (насчет Exit).
Перечитал первый пост еще раз... извините что повторился
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 03.10.2006, 01:00   #15
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Re: Методы оптимизации

Спор бессмысленен, есть способ найти элемент без перебора. Я его привел.
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
A* и способы его оптимизации SubZer0 Алгоритмика 29 24.01.2011 12:10
Методы zheland BlitzMax 5 22.11.2007 22:58
Достижения Оптимизации johnk 3D-программирование 42 19.08.2007 13:46
еффективные методы логинга jimon C++ 7 21.02.2006 23:23


Часовой пояс GMT +4, время: 21:16.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com