• 1 Post
  • 310 Comments
Joined 11 months ago
cake
Cake day: August 9th, 2023

help-circle


  • There was a project where the next console would have been the Genesis, 32X, and CD in one box with a new name. I don’t know if that would work, or if it’d be viewed as something of an in-between generation, like the Turbografx, and people ignore it.

    It’s probably be easier to develop games for, unlike the Saturn. It’s not the only thing that held the Saturn back, but it didn’t help.


  • Not sure about GP, but that’s basically what we did under “SAFe” (Scaled Agile Framework). PI planning means taking most of a sprint to plan everything for the next quarter or so. It’s like a whole week of ticket refinement meetings. Or perhaps 3 days, but when you’ve had 3 days of ticket refinement meetings, it might as well be the whole work week for as much a stuff as you’re going to get done otherwise.

    It’s as horrible as you’re thinking, and after a lot of agitating, we stopped doing that shit.








  • Nope. There is an industry standard way of measuring latency, and it’s measured at the halfway point of drawing the image.

    Edit: you can measure this through Nvidia’s LDAT system, for example, which uses a light sensor placed in the middle of the display combined with detecting the exact moment you create an input. The light sensor picks up a change (such as the muzzle flash in an fps) and measures the difference in time. If you were to make this work on a CRT running at NTSC refresh rates, it would never show less than 8.3ms when in the middle of the screen.

    If you are measuring fairly with techniques we use against LCDs, then yes, CRTs have latency.



  • He mangles some of the pros and cons of CRTs towards the end.

    They aren’t going to be indefinitely reliable. The phosphor goes bad over time and makes for a weaker image. Doubly so for color phosphors. Some of them are aging better than others, but that’s survivorship bias. We might be looking at the last decade where those old CRTs can still be in anything close to widespread use. Will probably be a few working examples here or there in private collections, of course.

    CRTs do have latency, and this is something a lot of people get wrong. A modern flatscreen display can have better latency than CRTs when the hardware takes advantage of it.

    The standard way of measuring latency is at the halfway point of the screen. For NTSC running at 60Hz (which is interlaced down to 30fps (roughly)), that means we have 8.33ms of latency. If you were to hit the button the moment the screen starts the next draw, and the CPU miraculously processes it in time for the draw, then it takes that long for the screen to be drawn to the halfway point and we take our measurement.

    An LCD can have a response time of less than 2ms. That’s on top of the frame draw time, which can easily be 120Hz on modern systems (or more; quite a bit more in some cases). That means you’re looking at (1 / 120) + 2 = 10.3ms of latency, provided your GPU keeps up at 120 fps. Note that this is comparable to a PAL console (which runs at 50Hz) on CRT. A 200Hz LCD with fast pixel response times is superior to NTSC CRTs. >400Hz is running up against the human limit to distinguish frame changes, and we’re getting there with some high end LCDs right now.

    When talking about retro consoles, we’re limited by the hardware feeding the display, and the frame can’t start drawing until the console has transmitted everything. So then you’re looking at the 2ms LCD draw time on top of a full frame time, which for NTSC would be (1 / 60) + 2 = 18.7ms. Which is why lightguns can’t work.



  • Those (?=...) bits are positive lookahead assertions:

    Lookaround assertions are zero-width patterns which match a specific pattern without including it in $&. Positive assertions match when their subpattern matches, negative assertions match when their subpattern fails. Lookbehind matches text up to the current match position, lookahead matches text following the current match position.

    The one (?!...) is a negative lookahead assertion.

    The $& var doesn’t really matter outside of Perl. It contains the text of the pattern you just matched, but even within Perl, capture groups are preferred. Once used at all, it will slow down your program every time a new regex is hit, which is especially bad in long running web server environments. Gets used sometimes in short scripts, though.

    What really matters is that the lookaheads don’t consume any text. In other words, the pointer that shows where in the text we are doesn’t increment; once we’re outside of the lookahead, we’re still right back in the same place.

    So let’s break this down using the /x modifier to make it somewhat sane.

    /^
    (?!.*\s) # no whitespace allowed
    (?=.{8,256}$) # between 8 and 256 characters (the '$' here indicating the end of the string)
    (?=.*[a-z]) # has to be a lowercase ASCII alphabet char somewhere
    (?=.*[A-Z]) # has to be an uppercase ASCII alphabet char somewhere
    ( # need a number, or a list of special chars on a US keyboard
        (?=.*[0-9]) 
        | (?=.*[~!@#$%^&*()-=_+[\]{}|;:,./<>?])
    )
    .* # consumes the whole string
    $/x
    

    Notes:

    • Doesn’t make any allowances for non-English characters, or even non-US characters (like the “£” character in the UK)
    • There’s a whole slew of utf8 characters out there that should count towards “special characters”, but aren’t considered here
    • There’s no reason to deny whitespace; let people use passphrases if they want (but then, you also don’t want to block those people for not using symbols)
    • Putting a limit at 256 is questionable, but may not necessarily be wrong

    That last one has some nuance. We often say you shouldn’t put any upper limit, but that’s generally not true in the real world. You don’t want someone flooding an indefinite amount of data into any field, password or not. A large limit like this is defensible.

    Also, lots of devs are surprised to learn that bcrypt and scrypt have a length limit of 72 bytes. A way around this is to run your input through SHA256 before giving it to bcrypt or scrypt.




  • Every time I see a defense of IPv4 and NAT, I think back to the days of trying to get myself and my roommate to play C&C: Generals together online, with a 2v2 game, with one of us hosting. Getting just the right combination of port forwarding working was more effort than us playing C&C: Red Alert on dial up when we both lived at home.

    With IPv6, the answer is to open incoming traffic on the port(s) to the host machine (or just both since the other guy is might host next time). With IPv4, we have to have a conversation about port forwarding and possibly hairpin routes on top of that. This isn’t a gate for people “who know what they’re doing”, it’s just a bunch of extra bullshit to deal with.