|
|
|
Confirmed and replicated the following script compiled to LSL on 1.24....
say(string prefix, integer number) { default touch_start(integer number) { say("Touched", 1); state next; } state_exit() ...produces the following results.... In [Combat: Samurai Island] products, this is causing upwards of a five second delay during combat, making all weapons effectively useless.
It's good to know that Linden Lab now knows the cause, but the workaround of removing critical code from state_exit() is prohibitively expensive in terms of testing and deployment to over nineteen thousand customers. Please, please, please, please look into this issue as soon as possible. If I were guessing, I'd venture that this would likely be related to excessive usage of TypeOf and GetType; generating Type objects on the fly is costly.
Strife, it happens for a simple loop, like this:
integer ix; for (ix = 0; ix < count; ++ix) { Code runs about one hundred times slower in state_exit handler. This did NOT happen prior to 1.24 servers. This problem needs immediate attention. The problem happens for LSL or Mono-compiled code. Linked to [SVC-1276 Mono beta issues] per comment by Babbage Linden on my blog
Linked to [SVC-2750 State changes are several times slower on MONO servers]
Possibly related? In any case, both issues deal with state changes and performance. Given the seriousness of the issue and the high cost of creating a workaround, I'd very much like to get an acknowledgment of this issue from an LL developer, so that we can tell our customers that Linden Lab has the issue on their radar.
Thank you very much. It seems that Babbage Linden, on 11/Aug/08 10:52 AM, said, about
"I think what's happening here is that state changes are being clamped to 1 per frame." Clearly this is not the issue shown here. Anything done while in state_exit takes longer. Below is a test script and results. If you do not want to read that, the short story is: A state transition takes 0.02 seconds (?!) I wonder if a moth catcher has fallen into state_exit()? float entryEntry; integer for (i = 0; i < N; ++i) default llOwnerSay("\nN is " + (string)N + touch_start(integer total_number) { insaneStart = llGetTime(); state insane; }} state insane { state_exit() { exitEntry = llGetTime(); test(); exitExit = llGetTime(); }} The results were: N is 2 N is 3 N is 4 N is 5 N is 6 N is 7 Babbage has checked in a fix for this. Vektor is testing the new version now. We intend to complete a rolling restart this week with this fix and fixes for several other serious issues.
1.24.4 server, which contains the fix for this issue, is now deployed to the preview grid (aditi).
You're welcome to go and test there. Assuming that 1.24.4 checks out on aditi, it will be fully deployed to the main grid during this week. ATTEN: PERIAPSE:
1.24.4 'does not' fix this issue as confirmed as writing. please revisit this issue Renee – we need details.
Vektor Linden is coordinating the testing of all the 1.24.4 fixes. If you can create a simple repro and paste it here then Vek can quickly confirm and Babbage can go back to the lab again... My test shows that the problem I saw is fixed in the Aditi grid, on 1.24.4 server.
==================================== check(string where) { default { state two { Without the fix, state_exit handler takes about 100 times longer, for either type of object code. ok ,gdi, I go back and try again...
I rezzed 100 times even and it not happen ! gdi I swear ! first first time I try it was on the 3rd rez ! would trying to recreate the first time with my alt have a diff? SL just baffles me at times....I not a coder I just a builder trying to get along. Renee EDIT to add: If I were a scripter I wouldn't be building houses, lol. Kick myself in head - note to self: Self- Kick your head Renee's referring to rezzing Rez-Faux packages, because rez-faux was hit by this bug. I tested it in 1.24.4, and I couldn't reproduce the problem, so I think the fix is good.
Renee, don't feel bad... I saw that some sims were still running 1.24.3. I bet you just got a 1.24.3 sim during your first test. Renee, didn't matter if you made a mistake, you are still a hero. If everyone using SL would actually take the time to beta test and bug report with repro then SL would be a much better place.
As an avid Combat Samurai Island (C:SI) melee combat system user for over a year, I took the opportunity to try out v1.24.4 in the preview grid. Our weapons work nearly like normal now. I am not a scripter and i do not know how to read or report in code. But I have an excellent sense for how the combat system content should feel. And this is pretty darn close. I hope some of our C:SI community members can take the opportunity to go to the preview grid and try it out or run some real scripting test. Thanks for the quick response Linden Labs.
Thank you Periapse and Babbage. Whilst the need of running of my script in the test grid was negated by the quick work and testing of others, I have done so, as I just felt I should. I am happy to unsurprisingly report that the issue seems to have gone away. Thank you for work in ridding this awful and unsightly moth from the inner workings of SL.
Fixed in 1.24.4, deploy completed 2008-09-03
http://status.secondlifegrid.net/2008/09/03/post224/ Since the rolling restart on Second Life Server 1.24.4.95600
This ugly bug has reared it's head Renee - this passed QA, and other comments indicate that 1.24.4 solved the problem. If this is still happening in 1.24.5 (on main grid) or 1.24.6 (on preview grid) please re-open again and give us something to test with. Thanks.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tested using:
{ state other; }//////////////////////////////////////////////////////////
default
{
touch_start(integer total_number)
}
state other
{ float a = llGetTime(); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("state_entry: " + (string)(llGetTime()-a)); state default; }{
state_entry()
state_exit()
{ float a = llGetTime(); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("."); llSleep(1.0); llOwnerSay("state_exit: " + (string)(llGetTime()-a)); }}
///////////////////////////////////////////////////////
Sample results, omitting "."s (when compiled in LSL):
[23:01] Object: state_entry: 5.414494
[23:01] Object: state_exit: 7.305904
[23:02] Object: state_entry: 5.415421
[23:02] Object: state_exit: 7.320724
[23:02] Object: state_entry: 5.415062
[23:02] Object: state_exit: 7.317482
[23:03] Object: state_entry: 5.420517
[23:03] Object: state_exit: 7.304108
[23:03] Object: state_entry: 5.409958
[23:03] Object: state_exit: 7.302544
Sample results, omitting "."s (when compiled in mono):
[23:04] Object: state_entry: 5.452568
[23:05] Object: state_exit: 5.278564
[23:05] Object: state_entry: 5.430317
[23:05] Object: state_exit: 5.251865
[23:05] Object: state_entry: 5.409817
[23:05] Object: state_exit: 5.252609
[23:05] Object: state_entry: 5.408588
[23:05] Object: state_exit: 5.252937
[23:05] Object: state_entry: 5.410522
[23:05] Object: state_exit: 5.255127