I'm Rick Brewster, author of Paint.NET! I'll be tweeting about .NET, C#, Paint.NET, graphics, Windows things. https://t.co/QwWccIMCcF
Jan 1, 2022 • 28 tweets • 5 min read
Every software developer makes mistakes, no developer can write 100% bug-free code.
I'm going to share potentially the most embarrassing bug I've ever caused, which I just discovered in Paint.NET yesterday.
I find it worthwhile to be transparent about bugs and not hide them or be ashamed of them. Personal humility about these things is a helpful thing for me, and also lets more junior developers see that even very experienced developers sometimes make BIG mistakes. I'm human too!
Oct 19, 2021 • 8 tweets • 3 min read
@migueldeicaza It’s not worth it for any amount. The physical and mental health tolls of working there are sky high. I was completely fried by the time I left after only 3.3 years.
@migueldeicaza The internal propaganda is poisonous as well. “Voted Best Place to Work, N years in a row! We’re helping to connect the world! What you do has impact!”
Aug 19, 2020 • 31 tweets • 5 min read
If you drop the Count property from .NET's ICollection, ISet, IDictionary, then you can build up a really interesting LINQ-style query system. Where(), Intersect(), Except(), Union(), etc. ... all without any copying.
Select() isn't really doable though, since you'd need a mapping function in both directions, T -> TResult and TResult ->T, so that the outer query can ask the inner query if it has the T that maps to the TResult (and you only know which T to ask for if you have Func<TResult, T>)
Apr 13, 2020 • 6 tweets • 1 min read
I just upgraded to an AMD Ryzen 9 3950X. It's faaaast.
The funny thing about perf in Paint.NET is that a faster CPU can actually result in a lower framerate.
Hear me out ...
A faster CPU can render more 128x128 px tiles per frame (~16ms usually).
More tiles per frame means more CPU time spent on Direct2D, copying bitmaps to the GPU, etc.
Jan 11, 2020 • 18 tweets • 4 min read
1/ So about 5 years ago I came up with something called the SingleUseCriticalSection. It's been happily guarding access to lazily initialized data (basically Lazy<T>) in Paint.NET for about 5 years now, so I thought I'd share it: pastebin.com/1kx47Yw72/ Using Monitor (aka lock(object)) in .NET is pretty bad when there's lots of contention because you burn A LOT of CPU time on spin locks.
It's just terrible. A kernel-space sync primitive that actually sleeps the threads during contention is necessary
Dec 26, 2019 • 27 tweets • 10 min read
Here's the story of a game I made in 1994, when I was 12, that somehow -- like some kind of lost, drunken cat -- finally found its way home on Christmas Eve after 25 years.