Jump to content

You Guys Never Fail To Disappoint....


28 replies to this topic

#21 Barnaby Jones

    Member

  • PipPipPipPipPipPip
  • Survivor
  • Survivor
  • 434 posts
  • LocationTexas

Posted 23 May 2013 - 04:30 PM

View Postblinkin, on 23 May 2013 - 04:25 PM, said:

if you want a perfect bug free game go play pong. even donkey kong and pacman have issues once you reach a certain level.

or we could TEST things like BETA TESTERS.




I think you missed the point. Go back and read the thread. Ill wait patiently for you as long as you promise let me know when you are finished.

#22 blinkin

    Member

  • PipPipPipPipPipPipPipPipPip
  • 3,195 posts
  • LocationEquestria

Posted 23 May 2013 - 04:52 PM

View PostBarnaby Jones, on 23 May 2013 - 04:30 PM, said:

I think you missed the point. Go back and read the thread. Ill wait patiently for you as long as you promise let me know when you are finished.

yup in the OP you complain about bugs and not doing enough testing. i think i am good.

yes they changed stuff and you don't like it. there are also plenty out there who complain endlessly that these patches don't do enough. i find this new flavor of d-baggery to be somewhat amusing.

how much are they allowed to do per patch? one line of code? a single variable?

there is a simple trade to be made, do we want more content and corrections or do we want fewer bugs? unless you want to pay them enough to hire more employees, you don't get both.

Edited by blinkin, 23 May 2013 - 05:28 PM.


#23 SPencil

    Member

  • PipPipPipPipPipPipPip
  • Giant Helper
  • Giant Helper
  • 763 posts
  • LocationCanada

Posted 23 May 2013 - 08:03 PM

View PostBarnaby Jones, on 23 May 2013 - 04:07 PM, said:


I would counter that its naive to believe they have their priorities straight after seeing them release (moreso in this case, rerelease) bugs and be surprized when the **** doesn't work in "the Wild".

The entire point of a test system is to verify their changes work (on the live server) as intended, and your reaction to this system breaking down is to claim its ok, because I don't understand the complexities inherent in programing.

Your ad hominem retort isn't even really worth a response from a discussion standpoint, but I did so primarilly to thank the fine gentlemen who, though they may not have defended my argument, defended my personage.

In a related query.... SPencil, does the inside of PGIs *** still smell like ****, or have the other apologists and fanboi's cleaned up a bit since I last visited?



The Ad-Hominem was just because of where this thread now lies. A K-Town thread just doesn't feel like a K-Town thread without a little napalm and matches, but I digress.

Now, does PGI have it's priorities straight? That's anybody's guess. Thing is, you can't judge that based on semantic errors that slip through testing. PGI has some very talented programmers, and you seem to fail in appreciating how deliciously complicated programming can be. For one, you make programming sound easy. It's not. I'm more willing to forgive bugs because I know how complicated these bugs can be, even though (for now) they're above my understanding, and certainly above yours.

So my reaction to their system not working as intended (not "breaking down". Software isn't a car you twit) is to be patient, knowing that they'll get it fixed.

As well, it's funny you call me the fan-boy, when you're the one who bought a Founder's package. And neither am I an apologist, I just have a wider perspective and appreciation for the hard work they're doing.

So yea, if you think you can do better, by all means send your resume in.




Also, I invite you to read through this code and spot the semantic error. This code is part of what was causing the HUD bug. Maybe then you'll gain an appreciation for how fun programming can be. As well, I recommend reading this thread, as it will be quite an education for you. Might even help you better your posts.

Because yea, your posts so far are pretty bad. You obviously need help posting. I'm willing to tutor for $19 an hour. I suspect it'll take a while, so I'm going to have to ask for my salary up front ($23,750)

Edited by SPencil, 23 May 2013 - 08:23 PM.


#24 IceCase88

    Member

  • PipPipPipPipPipPipPip
  • The 1 Percent
  • 689 posts
  • LocationDenzien of K-Town

Posted 23 May 2013 - 10:39 PM

Posted Image

#25 Hammerfinn

    Member

  • PipPipPipPipPipPipPip
  • Bad Company
  • Bad Company
  • 745 posts

Posted 24 May 2013 - 01:05 AM

[color=#959595]Hey everyone,[/color]

[color=#959595]With the HUD bug hotfix coming out soon, I’ve been asked to provide a write up about what we found, and explain a bit about why it took so long to resolve these issues. I was brought on to help resolve these issues relatively late in the process, once we suspected that the problem did not reside within Piranha’s internal code, but was in-fact a pre-existing issue either in the game engine we were using, or in some other external system used by the game engine in turn.[/color]

[color=#959595]As you all are probably aware, MWO is built on CryEngine. CryEngine uses the very popular Scaleform flash library for all of its UI, and additionally has replaced the default windows implementation of the standard template library with a third-party implementation called STLPort.[/color]

[color=#959595]Our first challenge in solving this issue was simply finding a reliable process for reproducing and detecting HUD corruption issues to begin with. The issue appeared to be affecting random bits of the HUD UI with extremely random behaviour. The CSR’s, QA, and community testers spent a lot of time scraping through community posts trying to collect common themes and patterns, and testing what they found to see if there was any discernible correlation that might help us out. By the time this process was completed, the QA team had run hundreds, if not thousands, of games in the testlab under varying circumstances, visually inspecting each screen for any signs of HUD corruption and collecting any common factors, such as Windows versions, common hardware configurations, GPU driver versions, etc. Several leads were investigated during this process, including 64-bit issues, alt-tabbing, and low memory conditions, but unfortunately none of these were capable of providing us with a 100% reproduction rate.[/color]

[color=#959595]When I was brought on, Jin, our senior graphics engineer, and Sean, our UI engineer, had determined that there was a major issue somewhere in the CryEngine to Scaleform layer that was basically causing C++ calls made by the game to invoke incorrect flash functions in Scaleform. This was after significant effort was spent tracking down and investigating other suspected causes, such as random heap memory corruption, or threaded race conditions.[/color]

[color=#959595]We first spent a considerable amount of time attempting to reproduce the issue with a debug build and breakpoint a failure case, in the hopes that the error was obvious, but also to get an idea where the issue truly resided so we knew where to focus our efforts. Eventually we did manage to reproduce one of these issues with a debug build, and what this effectively confirmed for me was that there was almost certainly an issue somewhere in CryEngine itself. Starting from here, it became important to understand as much about the interactions between CryEngine and Scaleform as possible.[/color]

[color=#959595]What followed was about two days of line by line debugging and auditing code in order to figure out what the intended behaviour of these systems were. I’ve got several pages of notes from this process, outlining general flows and several class structures. Once I had a good idea of how this system was intended to work, I spent some time building up a set of validation and verification routines to detect when these subsystems entered an invalid state. I was specifically interested in a convoluted set of lookup structures which mapped string handles to Scaleform object instances. The end result was an extremely slow build, but which would crash and generate stack call data whenever it detected that the CryEngine scaleform layer had entered an invalid state.[/color]

[color=#959595]This immediately produced results for us. CryEngine has built a global string table subsystem, which is used to accelerate specific string operations as well as save memory, similar to the string tables kept by some other languages. Additionally, users can create handles to this global string table in the form of CryName instances.[/color]

[color=#959595]Internally, we found that this global string table is built upon a case-insensitive string hashing mechanism, which it used to determine whether or not an entry exists within the global table or not. This case insensitive compare is most likely a result of the case insensitivity of the windows filesystem, and the probable roots of this CryName system in resource handling. In the case of Scaleform it was actually an error. This meant, if the UI team had ever added two flash elements to a single player which differed only in case, one of those elements would have been essentially inaccessible to us.[/color]

[color=#959595]Unfortunately, it turned out that the case-insensitivity issue was not related to the current HUD corruption issues on production, so for now I revised the verification routines to similarly ignore case, and we continued with our debugging.[/color]

[color=#959595]Again, we reproduced a real instance of the HUD issue with the revised verification code, and this time we managed to isolate a single function call as having put the system into a bad state. This was enormous progress, as we could now focus on this single specific function. We audited the function line by line, and unfortunately determined that while messy and initially confusing, it was actually safe, and should not have resulted in the behaviour we were observing. It’s important enough to note that internally this issue had an extremely low reproduction rate, and that this function was invoked hundreds of times every time a client loaded into a game. For this reason it was impossible to know ahead of time whether or not a given single call would produce the behaviour resulting in corruption. Instead, I went back and added extremely heavy logging to this specific function in order to determine the flow sequence that was resulting in the HUD corruption.[/color]

[color=#959595]Once again we reproduced the issue, and we were left with baffling results. The logs indicated that the STL library itself was in error; but this was nearly inconceivable. The data structure from in question was an std::map, which was implemented as a red-black tree in STLPort. This is an extremely efficient self-balancing tree structure with excellent performance characteristics. STL data structures for user defined types take a user defined sorting criteria. This sorting criteria must guarantee a property known as strict-weak ordering. I had already examined this sort operator for correctness, which was one of the CryName structures in question, and determined that the comparison operator definitely obeyed strict-weak ordering. In fact, since the global name table guaranteed one instance for any given string in memory at the time, CryName used absolute memory addresses as their sorting criteria. Now, this sounds terribly unsafe, and I spent a good while verifying that a CryName would never be deleted from the global table and re-added at a different memory location while being stored as a key value in one of these mapping structures. CryEngine guarantees this by keeping reference counts for every CryName. However, what we DID find was extremely surprising.[/color]

[color=#959595]STLPort has a whole category of data structure assessors which take member function template parameters, rather than template parameters defined by the data structure types themselves. This appears to actually violate the STL spec, as the function signature for a map access is definitely defined in terms of the key type for the data structure itself. The problem however manifested as follows:[/color]

[color=#959595]CryScaleform layer attempted to lookup a structure which [/color]did not yet exist[color=#959595] in their cache layer, this triggers a load and bind operation. This lookup operation involved passing a string key value as a const char * to the map operator[] function; however the operator[] function was templated in such a way that the key value provided actually expanded to a const char * at compile time rather than a CryName instance.[/color]

[color=#959595]What followed was a terrible failure case, where a CryName instance would be constructed, inserted into the global name table, and compared against a given node within the map, and then destroyed and completely removed from the global name table; only to happen all over again at the next level down in the red-black tree.[/color]

[color=#959595]This [/color]definitely[color=#959595] threw away all concept of strict-weak ordering. Now, if the global name table happened to allocate the comparison CryName object at differing memory locations, what would result was essentially a random walk through the tree structure, and the final map node returned to us was completely unpredictable. The only reason any of this system tended to ever work was because of the tendency of the memory allocation subsystem to reuse the same memory address when reallocating one of these global name table entries. As soon as the memory subsystem deviated from this behaviour, the function in question would fall apart and generate completely unpredictable results. This was the root cause of our HUD woes, and once found was relatively easy for us to address.[/color]

[color=#959595]Unfortunately this leads us to very serious bug number two. Once the mapping structures were repaired and this subsystem was put back into a good state, QA located another bug; this time relating to a race condition between precached texture loads. This manifested only as missing minimap textures. Jin, our senior graphics guy, very quickly located this issue and identified it as an incorrectly scoped lock during the precache phase in CryEngine. With these two issues finally resolved, the QA reproduction rates finally dropped to 0%.[/color]

[color=#959595]Hopefully this gives you some sense of how deep these issues ended up taking us, and why it ended up taking so much time.[/color]

[color=#959595]tl;dr: The HUD bugs were a result of undefined behaviour in CryEngines scaleform wrapper library, which took considerable effort for us to track down and fix.[/color]


[color=#959595]BAM Now you should feel bad.[/color]

#26 Soy

    Member

  • PipPipPipPipPipPipPipPipPip
  • 3,689 posts
  • Locationtrue Lord system

Posted 24 May 2013 - 01:06 AM

View PostSPencil, on 23 May 2013 - 08:03 PM, said:

I'm willing to tutor for $19 an hour. I suspect it'll take a while, so I'm going to have to ask for my salary up front ($23,750)


What a joke. 19 dollars an hour? ****, my posts are worth 100 per character.

#27 blinkin

    Member

  • PipPipPipPipPipPipPipPipPip
  • 3,195 posts
  • LocationEquestria

Posted 24 May 2013 - 01:18 AM

View PostSoy, on 24 May 2013 - 01:06 AM, said:

What a joke. 19 dollars an hour? ****, my posts are worth 100 per character.

that is like new paint job level pricing!

@Hammerfinn: you have used up your allowance of words for the night.

#28 Hammerfinn

    Member

  • PipPipPipPipPipPipPip
  • Bad Company
  • Bad Company
  • 745 posts

Posted 25 May 2013 - 12:37 AM

it is a new night

and I think that post

is always worth

repeating



#29 SPencil

    Member

  • PipPipPipPipPipPipPip
  • Giant Helper
  • Giant Helper
  • 763 posts
  • LocationCanada

Posted 25 May 2013 - 09:16 AM

View PostHammerfinn, on 25 May 2013 - 12:37 AM, said:

...that post is always worth repeating



Yes, yes it is :huh:

+1 for you, good sir knight.



1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users