×
Меню
Индекс

MSFD Сохранение процессорного времени

 
Если вы планируете мод с большим количеством или с длинными и запутанными скриптами, тогда можно подумать и о сохранении процессорной мощи.
 
Для этого можно сделать несколько вещей:
 
Если скрипту не обязательно исполняться в каждом кадре,  поместите маленький счетчик:
 
Begin My_super_long_script
 
Short framecounter
 
If ( framecounter < 10 ) ;значение таймера может быть любым, чем оно выше, тем реже будет исполнятся скрипт.
     set framecounter to ( framecounter + 1 )
     Return
Endif
set framecounter to 0
[супер длинный скрипт идет дальше]
end
 
Этот маленький кусочек кода, который всегда должен быть в самом начале вашего скрипта, позволит скрипту (ну большей его части, той, что занимает много процессорного времени) исполняться только каждый 10-ый кадр. То же самое можно сделать и с таймером и исполнять скрипт каждые 3 секунды или раз в минуту.
 
Также!
В целях оптимизации, исполняйте скрипт, только когда игрок в пределах досягаемости.
Если вы заскриптовали забавный прыгающий волшебный мячик, да и любой видимый эффект, то нет резона запускать скрипт, если игрок не видит его.
 
Так поместите в начало скрипта следующий код:
 
If ( GetDistance, player < 5000 ) ;если объект в интерьере то 1024 или 512 будет достаточно. В остальном надо смотреть на реальную дистанцию видимости объекта.
     Return
Endif
 
Укорачивайте не нужные более скрипты.
Если у вас есть локальные скрипты, которые не требуются после некоторого момента, например, потому что Актер мертв, или объект был отключен, тогда уменьшите их требования к процессору, поместив в их начало следующие строки:
 
If ( GetDisabled == 1 )
     Return
Endif
 
If ( GetHealth <= 0 )
     Return
Endif
 
Останавливайте глобальные скрипты.
Помните, глобальные скрипты исполняются все время, пока вы не остановите их командой StopScript?
Можно сделать выполняющийся только один раз глобальный скрипт, поместив в его конец команду StopScript.
 
Begin do_once_global_script
 
[ваш код здесь]
 
StopScript "do_once_global_script"
 
End
 
Попытайтесь использовать локальные скрипты вместо глобальных.
С ними можно быть уверенным в том, что выполняются они только, когда вы по рядом.
Серьезно задумайтесь перед созданием глобального скрипта в тех случаях, когда можно обойтись локальным.
Будьте осторожны с while-петлями, GetDetected, GetLOS и другими «медленными» функциями.
Используйте методы, описанные выше (например, счетчик или таймер), чтобы быть уверенным в том, что они не вызываются слишком часто.
 
Останавливайте скрипт под меню.
Всегда, если только у вас нет на то особой причины, помещайте следующие строки в начало скрипта, чтобы предотвратить замедление мыши в меню и другие нежелательные эффекты.
 
If ( MenuMode == 1)
     Return
Endif
 
или
 
If ( MenuMode )
     Return
Endif
 
In general, reducing the number of scripts running improves efficiency more than reducing the complexity of individual scripts.
So, for example, if you have two short globals running all the time, it is better to merge them into one global.
If you've got a few global scripts which only need to run based on some check, it makes sense to place the checks in one "parent" script, and startscript the others from there when they need to run (remembering to ensure to run them once per game session if they need to conserve variable values).