XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Toadcop

offline
Опыт: 54,313
Активность:
ADOLF на факте ты phail =) и ничего не сделать... решил зделать что то крутое которое реально не кто не понял + смысл и практическое применение стоит очень под вопросом.

т.е. скока бы ты не расписывал это всё это много не изменит. надо правильно правильные задачи ставить =)
Старый 28.07.2008, 18:56
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Toadcop, такое ощущение, что у тебя нет желания въезжать (и ничего не сделать ^^)...
Вот, сделал вариант попроще. С точки зрения ООП второй (предыдущий) вариант сделан правильно, но он не катит в jass-реализации по понятным причинам.
Прикрепленные файлы
Тип файла: rar swdn_proj_3.rar (1.0 Кбайт, 35 просмотров )
Старый 28.07.2008, 20:28
Toadcop

offline
Опыт: 54,313
Активность:
ShadoW DaemoN конечно нету. ибо я написал на практике это очень относительно применимо. а смысла возитьса с практикой. ну и вообще много флавов здесь...
Старый 28.07.2008, 22:57
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
Сообщение от ADOLF
теперь по второй карте бай себра)

вроде все тоже норм, но, я так понял ты удаляешь из цикла обькта в самом цикле? хз, но впринципе приемлимо, но опять же тут идет тот же ТригерЕвалуате (который как правильно подметил Тс ресурсоемкий), вот только чего я немогу вкурить зачем каллс коунтер и первый цикл?

зы, извините за отсутсвие, завтро попробую выложить свой вариант)

ADOLF добавил:
а вообще молодцы, хотя бы за то что поняли задачу)

ADOLF добавил:
подумайте над оптимизацией цикла и выполнения не через ТригерЕвалуте

подсказка: есть на компах тема Execute vx Evaluate, хотя и там я дал не совсем тот вариант)))

Да я честно пока не понял эти ТригерЕвалуте. Разберусь.

Счётчик поставил - ну не понимал я, как потоки работают, думал один цикл не прошёл, а триггер опять стучится.
А вообще и сейчас толком не понимаю - буду благодарен за ссылку на толковую статью. рус/енг

А раз круче всех, то и нам растолкуй, что за "тема Execute vx Evaluate".

Цитата:
Сообщение от ShadoW DaemoN
С точки зрения ООП второй (предыдущий) вариант сделан правильно, но он не катит в jass-реализации по понятным причинам.

Мой? Разъясни причины.
Старый 28.07.2008, 23:01
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sebra, нет, я про свой вариант, который размещен в посте #11.
Насчет темы (http://wc3campaigns.net/showthread.php?t=101398): суть заключается в том, что функции, создающие новый поток, отнимают довольно много времени, и при частом выполнении разница с обычным вызовом в текущем потоке (через call) значительна. А нам такие тормоза не нужны.
Старый 28.07.2008, 23:38
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
на практике это очень относительно применимо

хорошо, как ты еще предлагаешь обрабатывать массовые события с мелким периодом?

я не говорю что я сама лаконичность, но всетаки...

так, теперь)

Цитата:
А вообще и сейчас толком не понимаю - буду благодарен за ссылку на толковую статью. рус/енг


http://xgm.guru/forum/showthread.php?t=13118

Цитата:
Мой? Разъясни причины.


ООП будет работать в большинстве случаев медленее... я лично вообще не сторонник ооп не только в жассе но и вообще)

достаточно просто открыть вар3мап.дж (ну т.е. то что оно по сути откомпилит) и посмотреть насколько там все не хорошо (иногда это не решает) - но в нашем случае когда важна полная оптимизация - нет

теперь по самой задаче



ну что...

я понимаю что я поставил наверное не очень хорошо сформулированную задачу, но тем не менее хранение данных впринципе организовать лучше чем на паралельных массива (ака структ в вЖасс) низя

а вот цикл - думаю да) хотя свдн предложил вариант, который в разы быстре с тригерЕвалуте, имхо мона еще немного лучше)
Старый 29.07.2008, 21:27
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
Насчет темы (http://wc3campaigns.net/showthread.php?t=101398): суть заключается в том, что функции, создающие новый поток, отнимают довольно много времени, и при частом выполнении разница с обычным вызовом в текущем потоке (через call) значительна. А нам такие тормоза не нужны.

Спасибо, но я имел в виду кхорошую статью про потоки в jass, как создаются, как обрабатываются ...
Если нет, может напишет кто понимающий...
Если нет таких... чтож.
Цитата:
ООП будет работать в большинстве случаев медленее... я лично вообще не сторонник ооп не только в жассе но и вообще)

достаточно просто открыть вар3мап.дж (ну т.е. то что оно по сути откомпилит) и посмотреть насколько там все не хорошо (иногда это не решает) - но в нашем случае когда важна полная оптимизация - нет

Конечтно, круче ассемблера ничего не будет.
Развитый язык программирование ускоряет разработку.
Например помогает избежать многих ошибок.
Без ООП я бы так быстро ту систему не написал.
Да и расширять её без ООП сильно проблематичнее.
Цитата:
свдн предложил вариант, который в разы быстре с тригерЕвалуте, имхо мона еще немного лучше)
Блесни...
Старый 30.07.2008, 23:41
Deviator
Feel the purification...
offline
Опыт: 10,376
Активность:
- ADOLF так тебе нужно, чтобы твои юниты летали в массовом объёме (всмысле в мультиплеере баггов небыло из-за одинаковых спеллов). И чтобы когда выходили за определённый ранг, то ликвидировались, я так понял? В таком случае юзай 2 переменные отряды. Кастеры и снаряды...

Deviator добавил:
- Данные можно хранить и изменять при каждом мованье юнита в кастом валуе юнита, если я правильно тебя понял...
Старый 30.07.2008, 23:54
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Конечтно, круче ассемблера ничего не будет

asm is our god! =)

Цитата:
Развитый язык программирование ускоряет разработку.

ну это уже все кастом т.е. сказать что оно намного быстрее/медленне нельзя, тот же асм с некоторыми макросредствами очень даже тру)

Цитата:
Без ООП я бы так быстро ту систему не написал

концепция ооп - это когда ты пишешь большой медленный неелегантный код а потом убеждаешь себя что ты написал очень простой и удобный код) имхо чВ

Цитата:
Да и расширять её без ООП сильно проблематичнее

не факт т.е. это опять же зависит от самого кода, а не от стиля

Цитата:
Блесни...


http://xgm.guru/forum/showpost.php?p=421960&postcount=22 - ???

//пишу свой вариант

ADOLF добавил:
//чиорт, щас віложить неуспеваю
Старый 31.07.2008, 11:46
adic3x

offline
Опыт: 108,439
Активность:
примерно так бы делал это я, хотя тут могут быть опечатки
» projectile mover
Код:
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// {struct projectile} (c) ADOLF
//
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//===============
// allocator and destructor
//===============

globals

 integer DTM_i_p_a=0x00
 integer DTM_i_p_b=0x00
 integer array DTM_i_p

endglobals

function DTM_pGet takes nothing returns integer
 local integer i=DTM_i_p_a
 if i!=0x00then
  set DTM_i_p_a=DTM_i_p[i]
 else
  set DTM_i_p_b=DTM_i_p_b+0x01
  set i=DTM_i_p_b
 endif
 set DTM_i_p[i]=0xffffffff
 return i
endfunction

function DTM_pRemove takes integer i returns nothing
 if DTM_i_p[i]==0xffffffffthen
  set DTM_i_p[i]=DTM_i_p_a
  set DTM_i_p_a=i
 endif
endfunction


//===============
// members
//===============

globals

 // all members placed here

 integer array test

endglobals


//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// end {struct projectile}
//
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// [projectile mover] (c) ADOLF
//
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

globals

 timer SPL_t_pm=CreateTimer()         // global timer

 integer SPL_i_pm_mx=0x00

 integer SPL_i_pm_mx_00=0x00
 integer SPL_i_pm_mx_01=0x00
 integer SPL_i_pm_mx_02=0x00
 integer SPL_i_pm_mx_03=0x00

 integer array SPL_i_pm_p_00
 integer array SPL_i_pm_p_01
 integer array SPL_i_pm_p_02
 integer array SPL_i_pm_p_03

endglobals

function SPL_pMoverMain takes nothing returns nothing
 local integer i=0x00
 local integer p

 // all another locals
 // wich used in "moved" function

 loop
  exitwhen i>=SPL_i_pm_mx_00
  set i=i+0x01
  set p=SPL_i_pm_p_00[i]
  // action with projectile 00
  //
  //
  //
  if (remove) then
   call DTM_pRemove(p)
   set SPL_i_pm_p_00[i]=SPL_i_pm_p_00[SPL_i_pm_mx_00]
   set SPL_i_pm_mx_00=SPL_i_pm_mx_00+0xffffffff
   set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff
  endif
 endloop

 set i=0x00

 loop
  exitwhen i>=SPL_i_pm_mx_01
  set i=i+0x01
  set p=SPL_i_pm_p_01[i]
  // action with projectile 01
  //
  //
  //
  if (remove) then
   call DTM_pRemove(p)
   set SPL_i_pm_p_01[i]=SPL_i_pm_p_01[SPL_i_pm_mx_01]
   set SPL_i_pm_mx_01=SPL_i_pm_mx_01+0xffffffff
   set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff
  endif
 endloop

 set i=0x00

 loop
  exitwhen i>=SPL_i_pm_mx_02
  set i=i+0x01
  set p=SPL_i_pm_p_02[i]
  // action with projectile 02
  //
  //
  //
  if (remove) then
   call DTM_pRemove(p)
   set SPL_i_pm_p_02[i]=SPL_i_pm_p_02[SPL_i_pm_mx_02]
   set SPL_i_pm_mx_02=SPL_i_pm_mx_02+0xffffffff
   set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff
  endif
 endloop

 set i=0x00

 loop
  exitwhen i>=SPL_i_pm_mx_03
  set i=i+0x01
  set p=SPL_i_pm_p_03[i]
  // action with projectile 03
  //
  //
  //
  if (remove) then
   call DTM_pRemove(p)
   set SPL_i_pm_p_03[i]=SPL_i_pm_p_03[SPL_i_pm_mx_03]
   set SPL_i_pm_mx_03=SPL_i_pm_mx_03+0xffffffff
   set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff
  endif
 endloop

 if SPL_i_pm_mx==0x00then
  call PauseTimer(SPL_t_pm)
 endif

endfunction

function SPL_pAdd_00 takes integer projectile returns nothing
 set SPL_i_pm_mx=SPL_i_pm_mx+0x01
 set SPL_i_pm_mx_00=SPL_i_pm_mx_00+0x01
 set SPL_i_pm_p_00[SPL_i_pm_mx_00]=projectile
 if SPL_i_pm_mx==0x01then
  call TimerStart(SPL_t_pm, .025, true, function SPL_pMoverMain)
 endif
endfunction

function SPL_pAdd_01 takes integer projectile returns nothing
 set SPL_i_pm_mx=SPL_i_pm_mx+0x01
 set SPL_i_pm_mx_01=SPL_i_pm_mx_01+0x01
 set SPL_i_pm_p_01[SPL_i_pm_mx_01]=projectile
 if SPL_i_pm_mx==0x01then
  call TimerStart(SPL_t_pm, .025, true, function SPL_pMoverMain)
 endif
endfunction

function SPL_pAdd_02 takes integer projectile returns nothing
 set SPL_i_pm_mx=SPL_i_pm_mx+0x01
 set SPL_i_pm_mx_02=SPL_i_pm_mx_02+0x01
 set SPL_i_pm_p_02[SPL_i_pm_mx_02]=projectile
 if SPL_i_pm_mx==0x01then
  call TimerStart(SPL_t_pm, .025, true, function SPL_pMoverMain)
 endif
endfunction

function SPL_pAdd_03 takes integer projectile returns nothing
 set SPL_i_pm_mx=SPL_i_pm_mx+0x01
 set SPL_i_pm_mx_03=SPL_i_pm_mx_03+0x01
 set SPL_i_pm_p_03[SPL_i_pm_mx_03]=projectile
 if SPL_i_pm_mx==0x01then
  call TimerStart(SPL_t_pm, .025, true, function SPL_pMoverMain)
 endif
endfunction

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// end [projectile mover]
//
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Отредактировано ShadoW DaemoN, 06.08.2008 в 00:24.
Старый 31.07.2008, 18:48
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Цитата:
set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff

Я знаю, что тебе до мозга костей нравится юзать хекс числа, но мог хотя бы написать -0х01. И отступы хотя бы в два пробела сделал.

Теперь касательно кода.
Мне не нравится повторяющийся код.
Насчет лупов для каждого типа - хз, возможно это безопасней, но медленнее, чем 1 луп, ибо выражение в exitwhen просчитывается больше раз.

Я кстати понял, что можно улучшить мой вариант, убрав оверрайдинг методов create и destroy, т.к. они вызываются через TriggerEvaluate, а по-хорошему надо через call или сразу инлайн. Не понимаю, почему Vex сделал так, что генпак не инлайнит их прямо в методы структур классов...
Старый 02.08.2008, 13:36
Toadcop

offline
Опыт: 54,313
Активность:
...
Код:
loop
  exitwhen i>=SPL_i_pm_mx_02
я неуверен насчёт производительности здесь... т.е. это очень относительно.

незнаю... я раньше думал о таком варианте но оказалось что его негде применять... точней у меня в ТсХ вместе с обработкай юнитов идёт еще обработка камеры.

Цитата:
if SPL_i_pm_mx==0x01then
хммм а интепритатор что телепат ? точней оно возможно работает но всеравно...


а теперь самое главное сделай тру мапу где ты будеш то юзать =)

Отредактировано dk, 05.08.2008 в 03:44.
Старый 02.08.2008, 14:08
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
Цитата:


set SPL_i_pm_mx=SPL_i_pm_mx+0xffffffff



Я знаю, что тебе до мозга костей нравится юзать хекс числа, но мог хотя бы написать -0х01. И отступы хотя бы в два пробела сделал.

Сознательное применение запутывающих методов - отличительная особенность "крутых" программистов. а не хороших!

Цитата:
Мне не нравится повторяющийся код.
Насчет лупов для каждого типа - хз, возможно это безопасней, но медленнее, чем 1 луп, ибо выражение в exitwhen просчитывается больше раз.

А средства для автоматизации повторяющихся кусков (макросы. ООП) для него "не тру" ибо "можно и без них".

И вообще, если в моём примере для каждого типа объекта делать просто похожие структуры, по периодическому таймеру и обработчику на каждый тип, полиморфизм исчезает и с ним все проблемы. Даже Move функцию можно вписать в обработчик таймера.
-1 function call per object per cycle (ВАУ оптимизация).

Цитата:
Не понимаю, почему Vex сделал так, что генпак не инлайнит их прямо в методы структур классов...

Vexorian и так сделал много + ещё работает.

Цитата:
а теперь самое главное сделай тру мапу где ты будеш то юзать =)
:) Ждёмс...

Да, и про потоки статьи я так и не нашёл, кроме кусочка в описании триггеров у Векса. Нету?
Старый 02.08.2008, 15:30
Toadcop

offline
Опыт: 54,313
Активность:
Sebra потоки "сбрасывают" количество выполненых операций это грубо говоря. точней они дают новое пространсто для операций (т.к. в потоке есть предел на операции)

а вообщем смысл заключаетьса в вызова функуии "откуда угодно". т.е. есть форвардинг и т.п.
Старый 02.08.2008, 16:53
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
я неуверен насчёт производительности здесь... т.е. это очень относительно.

теперь давайте считать... если делать как предложил свдн (т.е. бинарное дерево) то на кажды снаряд exitwhen+if*2. теперь, у меня на снаряд 1 exiwhen + пара их же на "пустые циклы"

однако если начать грузить это все дальше то получиться просто несколько циклов вподрят без всяких ифов, имхо будет несколько быстрее + не так запутанно (т.е. под каждый цикл своя секция)

если увеличивать количество типов снарядов - будет расти кол во ифов, опять же цикл имхо быстрее)

ага, сама по себе конструкция цикла (loop exiwhen true endloop) БЫСТРЕЕ вызова ДуНотинг т.е. даже 10 пустых циклов нам не вредит

цикл на жасс по сути два жампинга
Код:
loop:
;;---
j** endloop ;; exitwhen
;;---
jmp loop
endloop:


т.е. принципиально она не дб медленне ифа (но на практике так)

Цитата:
макросы

я думал забить под них, но опять же по сути это ничего не меняет

Цитата:
для него "не тру" ибо "можно и без них"

не можно а нужно... (ну макросы да) а вот ооп... у нас тут речь идет как раз про "узкий" участок кода, где важно оптимизировать все до крнца...

Цитата:
ибо выражение в exitwhen

что ты имеешь ввиду?!

Цитата:
а теперь самое главное сделай тру мапу где ты будеш то юзать =)

с этим как то сложнее... ;)

Цитата:
И вообще, если в моём примере для каждого типа объекта делать просто похожие структуры, по периодическому таймеру и обработчику на каждый тип, полиморфизм исчезает и с ним все проблемы

дык чего же не сделал?)

ну вобщем я думаю задача решена)
Старый 03.08.2008, 14:33
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
ооп... у нас тут речь идет как раз про "узкий" участок кода, где важно оптимизировать все до крнца...

Насколько это реально важно, может показать лишь карта, но...
Цитата:
с этим как то сложнее... ;)

Многим известно, сколько мусора в доте, но работает.

Цитата:
дык чего же не сделал?)

Ну во 1х я не знал, как работает вызов "наследованной" функции;
во 2х я считал, что Vex выбрал оптимальный вариант, а так код читается и пишется великолепно;
в 3х последний предложенный мной вариант пришёл в голову только после обсуждения и критики;
Да и вообще там прямо напрашиваются макросы а я с ними не очень.
А в конце концов... изобразить? Или ты и так понял?

И ещё: кто-нибудь желает/может сделать карту-пример с измерением сравнительного быстродействия предложенных вариантов?
Старый 03.08.2008, 21:13
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Насколько это реально важно, может показать лишь карта, но

в теме на компах писалось что соотношения вызова функции через калл и тригерЕвалуате где то 1:15 по времени

Цитата:
Многим известно, сколько мусора в доте, но работает

а некоторые вообще языком умываются (с) сабж, в доте нету такого обьема)

Sebra, нет, ну я все понимаю) но в любом случае кодер на низком уровне может сделать алгоритм лушче чем компилятор

Цитата:
кто-нибудь желает/может сделать карту-пример с измерением сравнительного быстродействия предложенных вариантов?

сделаю на днях
Старый 04.08.2008, 13:38
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
соотношения вызова функции через калл и тригерЕвалуате где то 1:15 по времени
Да уж, а call / ExecuteFunc 1/25 :(
Цитата:
в любом случае кодер на низком уровне может сделать алгоритм лушче чем компилятор
Компилятор (и результат его работы) - тоже творение кодеров, да и не худших.
К тому же компилятор работает быстрее и часто надёжнее кодера.
Спорить тут не о чем, есть разные задачи - есть разные методы решения.
Ещё один вопрос: знаешь про C-- ?
Цитата:
сделаю на днях
Тогда срочно пишу макросы...
Старый 04.08.2008, 18:18
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
знаешь про C--

? именно "--" хз

Цитата:
К тому же компилятор работает быстрее и часто надёжнее кодера

смотря какой кодер/компилятор ;) ну впринципе да, но это все относительно, сказать "делай так а не так" согласен нельзя

Цитата:
Спорить тут не о чем

+1

Цитата:
Тогда срочно пишу макросы

смысл? я просто сравню методы реализации циклов и все, потому что все остальное имхо и так ясно)
Старый 04.08.2008, 19:25
adic3x

offline
Опыт: 108,439
Активность:
» test library
Код:
library test initializer init

 //.....................................
 
 struct prj
 
  integer xtype
 
 endstruct
 
 globals
 
  prj array glb
  
  integer i_max=0x00
  
  real fps_cnt=.0
 
 endglobals

 //.....................................

 scope TriggerEvaluglbateX

  globals

   trigger array t_eva

  endglobals
  
  function DoSomething takes nothing returns boolean
   return false
  endfunction 
  
  function eva takes nothing returns nothing
   local integer i=0x00
   
   loop
    // set TriggerPrj=glb[i]
    call TriggerEvaluate(t_eva[glb[i].xtype])
    set i=i+0x01
    exitwhen i==i_max
   endloop
   
   set fps_cnt=fps_cnt+fps
   //call BJDebugMsg(I2S(i)+" eva")
  endfunction

 endscope
 
 //.....................................

 scope BinaryTreeX
 
  function bin takes nothing returns nothing
   local integer i=0x00
   
   loop
   
    if glb[i].xtype>0x01then
     if glb[i].xtype==0x00then
      // set TriggerPrj=glb[i]
     else
      // set TriggerPrj=glb[i]
     endif
    else
     if glb[i].xtype==0x02then
      // set TriggerPrj=glb[i]
     else
      // set TriggerPrj=glb[i]
     endif
    endif    
    
    set i=i+0x01
    exitwhen i==i_max
   endloop
   
   set fps_cnt=fps_cnt+fps
   //call BJDebugMsg(I2S(i)+" bin")
  endfunction

 endscope
 
 //.....................................

 scope LoopsX
 
  globals
  
   prj array glbA
   prj array glbB
   prj array glbC
   prj array glbD
   
   integer a_max=0x00
   integer b_max=0x00
   integer c_max=0x00
   integer d_max=0x00
   
   integer xa_max=0x00
   integer xb_max=0x00
   integer xc_max=0x00
   integer xd_max=0x00
  
  endglobals
 
  function loopX takes nothing returns nothing
   local integer i=0x00
   
   loop
    // set TriggerPrj=glbA[i]
    set i=i+0x01
    exitwhen i>=a_max
   endloop
   
   //call BJDebugMsg(I2S(i)+" loop A")
   set i=0x00
   
   loop
    // set TriggerPrj=glbB[i]
    set i=i+0x01
    exitwhen i>=b_max
   endloop

   //call BJDebugMsg(I2S(i)+" loop B")
   set i=0x00
   
   loop
    // set TriggerPrj=glbC[i]
    set i=i+0x01
    exitwhen i>=c_max
   endloop

   //call BJDebugMsg(I2S(i)+" loop C")
   set i=0x00
   
   loop
    // set TriggerPrj=glbD[i]
    set i=i+0x01
    exitwhen i>=d_max
   endloop
   
   //call BJDebugMsg(I2S(i)+" loop D")
   
   set fps_cnt=fps_cnt+fps
  endfunction

  function loopEX takes nothing returns nothing
   local integer i=0x00
   
   loop
    // set TriggerPrj=glbA[i]
    set i=i+0x01
    exitwhen i>=xa_max
   endloop
   
   //call BJDebugMsg(I2S(i)+" loop A")
   set i=0x00
   
   loop
    // set TriggerPrj=glbB[i]
    set i=i+0x01
    exitwhen i>=xb_max
   endloop

   //call BJDebugMsg(I2S(i)+" loop B")
   set i=0x00
   
   loop
    // set TriggerPrj=glbC[i]
    set i=i+0x01
    exitwhen i>=xc_max
   endloop
   
   //call BJDebugMsg(I2S(i)+" loop C")
   set i=0x00
   
   loop
    // set TriggerPrj=glbD[i]
    set i=i+0x01
    exitwhen i>=xd_max
   endloop
   
   //call BJDebugMsg(I2S(i)+" loop D")
  endfunction
  
 endscope

 //.....................................
 
 globals
 
  constant real fps=.0001  //*100500.
  constant real fpsp=.0005 //*100500.
  
  timer t_test=CreateTimer()
 
 endglobals
 
 function start takes nothing returns nothing
  local string s=GetEventPlayerChatString()
  if s=="/eva"then
   set i_max=0x08
   call TimerStart(CreateTimer(), fps, true, function eva)
   call TimerStart(t_test, 65536., false, null)
   call BJDebugMsg("|cffff0000/eva|r")
  elseif s=="/eva+"then
   set i_max=0x80
   call TimerStart(CreateTimer(), fpsp, true, function eva)
   call BJDebugMsg("|cffff0000/eva+|r")
  elseif s=="/bin"then
   set i_max=0x08
   call TimerStart(CreateTimer(), fps, true, function bin)
   call TimerStart(t_test, 65536., false, null)
   call BJDebugMsg("|cffff0000/bin|r")
   elseif s=="/bin+"then
   set i_max=0x80
   call TimerStart(CreateTimer(), fpsp, true, function bin) 
   call BJDebugMsg("|cffff0000/bin+|r")
  elseif s=="/loop"then
   //set i_max=0x08
   call TimerStart(CreateTimer(), fps, true, function loopX) 
   call TimerStart(t_test, 65536., false, null)
   call BJDebugMsg("|cffff0000/loop|r")
  elseif s=="/loop+"then
   //set i_max=0x40
   call TimerStart(CreateTimer(), fpsp, true, function loopEX)
   call BJDebugMsg("|cffff0000/loop+|r")
  endif 
 endfunction
 
 function fpsf takes nothing returns nothing
  call BJDebugMsg(R2S(fps_cnt)+" "+R2S(TimerGetElapsed(t_test)))
 endfunction

 function init takes nothing returns nothing
  local integer i=0x00
  local trigger t=CreateTrigger()
  
  loop
   set glb[i]=prj.create()
   set glb[i].xtype=GetRandomInt(0x00, 0x03)
   
   //
   if integer(glb[i])<0x09then
    if glb[i].xtype==0x00then
     set a_max=a_max+0x01
    elseif glb[i].xtype==0x01then
     set b_max=b_max+0x01
    elseif glb[i].xtype==0x02then
     set c_max=c_max+0x01  
    elseif glb[i].xtype==0x03then
     set d_max=d_max+0x01 
    endif
   endif
   
  
   if glb[i].xtype==0x00then
    set xa_max=xa_max+0x01
   elseif glb[i].xtype==0x01then
    set xb_max=xb_max+0x01
   elseif glb[i].xtype==0x02then
    set xc_max=xc_max+0x01  
   elseif glb[i].xtype==0x03then
    set xd_max=xd_max+0x01 
   endif
   //
  
   set i=i+0x01
   exitwhen i==0x80
  endloop
  
  call BJDebugMsg("|c7f0000ff"+I2S(a_max+b_max+c_max+d_max)+"    "+I2S(xa_max+xb_max+xc_max+xd_max)+"|r\n\n\n\n")
 
  set t_eva[0x00]=CreateTrigger()
  set t_eva[0x01]=CreateTrigger()
  set t_eva[0x02]=CreateTrigger()
  set t_eva[0x03]=CreateTrigger()
  
  call TriggerAddCondition(t_eva[0x00], Condition(function DoSomething))
  call TriggerAddCondition(t_eva[0x01], Condition(function DoSomething))
  call TriggerAddCondition(t_eva[0x02], Condition(function DoSomething))
  call TriggerAddCondition(t_eva[0x03], Condition(function DoSomething))
  
  call TriggerRegisterPlayerChatEvent(t, Player(0x00), "", false)
  call TriggerAddAction(t, function start)

  set t=CreateTrigger()
  call TriggerRegisterPlayerEvent(t, Player(0x00), EVENT_PLAYER_END_CINEMATIC)
  call TriggerAddAction(t, function fpsf)
  
  set t=null
  
  call BJDebugMsg("|cffff0000ESC|r - check fps counter\n\n\n/eva & /eva+      |cff7f7f7fTriggerEvaluate method|r\n\n/bin & /bin+      |cff7f7f7fBinary tree method|r\n\n/loop & /loop+      |cff7f7f7fMultiLoop (hm...) method|r\n\n\n\n")
 endfunction
 
 //.....................................

endlibrary


сабж, т.к. СтомпВач у мну упорно непашет тестил методом абуза

сразу просмотрите код, мб там есть ашипки (кста там в третем варианте полюбому ехитВен дб в начале цикла но впринципе картины это не меняет)

там еск если вы пишет один раз без + вы можете проверить правильно ли работает таймер

без + 8 обьектов, с ним - 128

луп как я и думал самый быстрый

что бы заабузить перезапускайте мапу и пишите какой либо один метод несколько раз ("/bin" "/bin" "/bin" как пример)
Прикрепленные файлы
Тип файла: w3x loop_test.w3x (10.3 Кбайт, 33 просмотров )

Отредактировано ShadoW DaemoN, 06.08.2008 в 00:24.
Старый 05.08.2008, 12:36
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 23:12.