Показать сообщение отдельно
Старый 29.09.2007, 16:21   #1823
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: М: Скриптинг в Готике

2Ukur:
в этом случае вызов функции B_MM_AssessEnemy(); выполняется ВСЕГДА при соблюдении одного из двух условий.
Правильно, давай порассуждаем, (хотя, если использовать правила булевой алгебры, то и рассуждать незачем): для простоты понимания первое условие примем за "аа", а второе условие за "bb", следовательно будут справедливы следующие выражения, которые приведут к вызову функции B_MM_AssessEnemy();:
1). "аа" && "bb" (первая ветка if -> if)
2). "!aa" (вторая ветка, else)
обобщая их получаем ("аа" && "bb") || "!aa"
Условие же не вызова функции проще и может быть записано так: "аа" && "!bb", следовательно по закону дуальности булевой алгебры условие вызова функции можно записать так: "!аа" || "bb", что я и сделал в предыдущем посте.
Булева алгебра - интересная вещь - на данную функцию можно написать ещё несколько выражений *и все они будут справедливы и правильно работать, но только одно из них, а может быть и несколько, будет(ут) оптимальным(и), а какое на первый взгляд сказать трудно, только построив таблицу Вейче можно сказать это с уверенностью.


Добавление от 09/29/07, в 16:29:32
2HikeR:
кстати, подобные оптимизации хоть как-то могут повлиять на скорость выполнения? или откомпилированный результат будет одинаков в любом случае, и овчинка выделки не стоит?
Всё зависит от того, как выполняется код, конкретно по Готикам (движок их я изучил почти полностью) можно сказать, что при оптимизации:
1. Уменьшится размер стека (он равен 2048), т.е. движок при выполнении кода все переменные действия с ними и промежуточные результаты записывает в стек. Если стек закончится, то получим вылет игры, но не узнаем по какой причине он произошел. Следовательно, лучше экономить место в стеке.
2. Быстродействие - если в функции будет выполняться меньше проверок, то это лучше.

Если вернуться к разбираемой функции, то можно записать условие так "bb" || "!аа", по правилам булевой алгебры это идентично, но относительно быстродействия это совсем разные вещи: какое условие чаще встречается? "!аа" - self не лежит, или "bb" - расстояние между self и other < 200 метров. Для оптимизации быстродействия при операции || первым надо ставить выражение, которое реже бывает истинным, следовательно второе выражение выполняться не будет и быстродействие повысится.


Добавление от 09/29/07, в 16:40:59
Извиняюсь за ошибку (но почему-то добавленное сообщение нельзя редактировать *:( ):
предыдущий абзац следует читать так "... первым надо ставить выражение, которое реже бывает ложным ..."
Ответить с цитированием