Сейчас 22:29:42 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Урок 5] Учимся оптимизировать код
[DUОS]Дата: Пятница, 29 Апреля 2011, 14:29:22 | Сообщение # 1
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
На этом уроке мы попрактикуемся в оптимизации кода GUI-триггеров на Jass.
Все мы уже знаем, какие жуткие следы в коде карты оставляет триггер и зачастую очень много утечек. Я думал, что бы такое разобрать на этом уроке, сделанное триггерно и решил - вот это подходит.
Итак...
Откроем JassCraft. В нём создадим новое окно. Конвертируем триггер Start в текст и копируем код. Будет такой код:
Code
function Trig_Start_Actions takes nothing returns nothing
     // Это включает Заставку
     call CinematicModeBJ( true, GetPlayersAll() )
     call CameraSetupApplyForPlayer( true, gg_cam_Camera_004, Player(0), 0.00 )
     call TriggerSleepAction( 1.00 )
     call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_Hamg_0059, "TRIGSTR_015", null, "TRIGSTR_016", bj_TIMETYPE_ADD, 0.00, true )
     call TriggerSleepAction( 1.00 )
     call CameraSetupApplyForPlayer( true, gg_cam_Camera_001, Player(0), 3.00 )
     call TriggerSleepAction( 1.00 )
     call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_hkni_0000, "TRIGSTR_001", null, "TRIGSTR_002", bj_TIMETYPE_ADD, 0.00, true )
     call TriggerSleepAction( 1.00 )
     call SetCameraTargetControllerNoZForPlayer( Player(0), gg_unit_hkni_0000, 0.00, 0.00, false )
     call GroupPointOrderLocBJ( GetUnitsInRectAll(gg_rct________________002), "move", GetRectCenter(gg_rct________________001) )
     call TriggerSleepAction( 10.00 )
     call TransmissionFromUnitWithNameBJ( GetPlayersAll(), gg_unit_hkni_0000, "TRIGSTR_009", gg_snd_IceTrollYesAttack1, "TRIGSTR_010", bj_TIMETYPE_ADD, 0.00, true )
endfunction

//===========================================================================
function InitTrig_Start takes nothing returns nothing
     set gg_trg_Start = CreateTrigger(  )
     call TriggerAddAction( gg_trg_Start, function Trig_Start_Actions )
endfunction

Давайте разберёмся.
Code
call CinematicModeBJ( true, GetPlayersAll() )
НИКОГДА не оставляйте BJ без внимания. Давайте это как-то развернём. В развёртке это выглядит так:
Code
call CinematicModeExBJ(cineMode, forForce, bj_CINEMODE_INTERFACEFADE)

Тоже не подходит. Снова BJ... Разворачиваем и её.
Code
function CinematicModeExBJ takes boolean cineMode, force forForce, real interfaceFadeTime returns nothing
     // If the game hasn't started yet, perform interface fades immediately
     if (not bj_gameStarted) then
         set interfaceFadeTime = 0
     endif

     if (cineMode) then
         // Save the UI state so that we can restore it later.
         if (not bj_cineModeAlreadyIn) then
             set bj_cineModeAlreadyIn = true
             set bj_cineModePriorSpeed = GetGameSpeed()
             set bj_cineModePriorFogSetting = IsFogEnabled()
             set bj_cineModePriorMaskSetting = IsFogMaskEnabled()
             set bj_cineModePriorDawnDusk = IsDawnDuskEnabled()
             set bj_cineModeSavedSeed = GetRandomInt(0, 1000000)
         endif

         // Perform local changes
         if (IsPlayerInForce(GetLocalPlayer(), forForce)) then
             // Use only local code (no net traffic) within this block to avoid desyncs.
             call ClearTextMessages()
             call ShowInterface(false, interfaceFadeTime)
             call EnableUserControl(false)
             call EnableOcclusion(false)
             call SetCineModeVolumeGroupsBJ()
         endif

         // Perform global changes
         call SetGameSpeed(bj_CINEMODE_GAMESPEED)
         call SetMapFlag(MAP_LOCK_SPEED, true)
         call FogMaskEnable(false)
         call FogEnable(false)
         call EnableWorldFogBoundary(false)
         call EnableDawnDusk(false)

         // Use a fixed random seed, so that cinematics play consistently.
         call SetRandomSeed(0)
     else
         set bj_cineModeAlreadyIn = false

         // Perform local changes
         if (IsPlayerInForce(GetLocalPlayer(), forForce)) then
             // Use only local code (no net traffic) within this block to avoid desyncs.
             call ShowInterface(true, interfaceFadeTime)
             call EnableUserControl(true)
             call EnableOcclusion(true)
             call VolumeGroupReset()
             call EndThematicMusic()
             call CameraResetSmoothingFactorBJ()
         endif

         // Perform global changes
         call SetMapFlag(MAP_LOCK_SPEED, false)
         call SetGameSpeed(bj_cineModePriorSpeed)
         call FogMaskEnable(bj_cineModePriorMaskSetting)
         call FogEnable(bj_cineModePriorFogSetting)
         call EnableWorldFogBoundary(true)
         call EnableDawnDusk(bj_cineModePriorDawnDusk)
         call SetRandomSeed(bj_cineModeSavedSeed)
     endif
endfunction
Ого. Вот это развёртка. Но её тоже можно посворачивать.
Code
    constant real      bj_CINEMODE_INTERFACEFADE        = 0.50
Лучше заменить на .5 - быстрее будет работать.
По сути из всей функции, исходя из того, что cineMode принимается как true, нам нужна только эта часть кода:
Code
// Save the UI state so that we can restore it later.
         if (not bj_cineModeAlreadyIn) then
             set bj_cineModeAlreadyIn = true
             set bj_cineModePriorSpeed = GetGameSpeed()
             set bj_cineModePriorFogSetting = IsFogEnabled()
             set bj_cineModePriorMaskSetting = IsFogMaskEnabled()
             set bj_cineModePriorDawnDusk = IsDawnDuskEnabled()
             set bj_cineModeSavedSeed = GetRandomInt(0,1000000)
         endif

         // Perform local changes
         if (IsPlayerInForce(GetLocalPlayer(), forForce)) then
             // Use only local code (no net traffic) within this block to avoid desyncs.
             call ClearTextMessages()
             call ShowInterface(false,.5)
             call EnableUserControl(false)
             call EnableOcclusion(false)
             call SetCineModeVolumeGroupsBJ()
         endif

         // Perform global changes
         call SetGameSpeed(bj_CINEMODE_GAMESPEED)
         call SetMapFlag(MAP_LOCK_SPEED, true)
         call FogMaskEnable(false)
         call FogEnable(false)
         call EnableWorldFogBoundary(false)
         call EnableDawnDusk(false)

         // Use a fixed random seed, so that cinematics play consistently.
         call SetRandomSeed(0)
Финальный вариант после очистки лишнего будет такой:
Code
// Ýòî âêëþ÷àåò Çàñòàâêó
     // Save the UI state so that we can restore it later.
     if (not bj_cineModeAlreadyIn) then
         set bj_cineModeAlreadyIn = true
         set bj_cineModePriorSpeed = GetGameSpeed()
         set bj_cineModePriorFogSetting = IsFogEnabled()
         set bj_cineModePriorMaskSetting = IsFogMaskEnabled()
         set bj_cineModePriorDawnDusk = IsDawnDuskEnabled()
         set bj_cineModeSavedSeed = GetRandomInt(0,1000000)
     endif

     call ClearTextMessages()
     call ShowInterface(false,.5)
     call EnableUserControl(false)
     call EnableOcclusion(false)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UNITMOVEMENT,bj_CINEMODE_VOLUME_UNITMOVEMENT)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UNITSOUNDS,bj_CINEMODE_VOLUME_UNITSOUNDS)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_COMBAT,bj_CINEMODE_VOLUME_COMBAT)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_SPELLS,bj_CINEMODE_VOLUME_SPELLS)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_UI,bj_CINEMODE_VOLUME_UI)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_MUSIC,bj_CINEMODE_VOLUME_MUSIC)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_AMBIENTSOUNDS,bj_CINEMODE_VOLUME_AMBIENTSOUNDS)
     call VolumeGroupSetVolume(SOUND_VOLUMEGROUP_FIRE,bj_CINEMODE_VOLUME_FIRE)
     call SetGameSpeed(bj_CINEMODE_GAMESPEED)
     call SetMapFlag(MAP_LOCK_SPEED, true)
     call FogMaskEnable(false)
     call FogEnable(false)
     call EnableWorldFogBoundary(false)
     call EnableDawnDusk(false)
     call SetRandomSeed(0)
Камера развернётся так:
Code
if GetLocalPlayer() == Player(0) then
         call CameraSetupApplyForceDuration(gg_cam_Camera_004,true,0.)
     endif

Остальное - по аналогии
Д/з: Закончить оптимизацию триггера.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

lawsonДата: Пятница, 29 Апреля 2011, 15:32:53 | Сообщение # 2
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Не красиво дуос. Извини но я тебя больше не уважаю.
Но на счет урока - красавчик, но новичкам будет сложно.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Пятница, 29 Апреля 2011, 15:45:02
 

ШтормДата: Пятница, 29 Апреля 2011, 20:32:49 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 835
Награды: 0
Репутация: 165
Блокировки:
Quote (lawson)
Не красиво дуос. Извини но я тебя больше не уважаю.

Я того же мнения. Извини, но ты балабол.
 

ДжинжерДата: Воскресенье, 16 Октября 2011, 14:36:32 | Сообщение # 4
3 уровень
Группа: Пользователи
Сообщений: 47
Награды: 0
Репутация: 8
Блокировки:
О, боги... %)

Я - подлая сволочь, которая может написать любовный рассказ, а потом твердить каждой второй девушке, что просто имя изменил. Типа.
 

PUVerДата: Понедельник, 30 Января 2012, 11:13:51 | Сообщение # 5
Сухопутные крысы!
Группа: Модераторы
Сообщений: 4462
Награды: 8
Репутация: 1845
Блокировки:
Согласен с лавсоном. До 3-го урока прочитал. Всё понятно. Потом - тёмный лес. Думаю нужно разобрать поподробней в уроках как задавать события на джассе и т.п.
 

DreiiДата: Понедельник, 30 Января 2012, 11:39:21 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
PUVer, события можно и с помощью гуи+конверт

 

Ty3uKДата: Понедельник, 30 Января 2012, 11:50:13 | Сообщение # 7
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Я так и делаю, бтв. Лень писать функцию, которую можно получить за парочку кликов мышкой

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz