« March 2008 | Main | May 2008 »

April 30, 2008

Free Comic Book Day

This Saturday is Free Comic Book Day, where you can walk into a comic book store and - wait for it - pick up free comic books.

My friend Shawn runs a comic book store here in Phoenix at 35th Ave and Deer Valley Rd, just a few miles from me - Spazdog Comics. I'll be helping him out in the store on Saturday and trying to cause a scene. I volunteered there last year and a few years back and I've had a pretty good time each time. Shawn, his wife Monica and his kids are fun to be around. Also, Shawn used to work at the Biltmore Apple Store and their point-of-sale system is an iMac. What's not to like?

If you show up, be sure and ask Shawn how he got the nickname "Quickdraw" - he'd *love* to tell you. :-)

April 28, 2008

Brad's Game Reviews: Xbox LIVE Arcade Edition

I got cozy with Xbox Live Arcade (XBLA) this weekend and pulled the trigger on a number of board-game adaptions, then proceeded to play the crap out of them. I'm hoping for more board/card game adaptions for XBLA in the future. Ticket to Ride, I'm looking at you.

Carcassonne

I've played the board game several times with Beth. It is, in general, highly thought of as a "gateway" game that you can play with wives or family - easy to learn, quick to play with strategy if you're willing to think. Beth doesn't care much for it, however, so I figured the XBLA version would scratch the itch for me. So far that has proven to be true. In fact, I think I prefer the Xbox version to the real thing. It's easier to get going, easier to play and easier to score. The visuals are very nice for what it is, although the renaissance soundtrack grates after a dozen or so games.

On easy, I can thump the computer badly. The AI never bothers to play farmers, so it's easy to rack up huge scores. On medium, the AI will occasionally play a farmer, but it is still fairly easy to beat. I haven't bumped it up to the next setting yet so I don't know how hard it will get. I also don't have a gold account so I haven't played it online.

Bonus downloadable content includes 2 expansion packs: "The River II" and "King and Baron" (aka King and Scout). I'm not a huge fan of The River II - it doesn't do much for me over the original River expansion which is included with the base game. King and Baron is a nice twist but I wouldn't want to play with it every time.

Catan

The first German-style boardgame I played was Settlers of Catan back in the 90's. I haven't played the real thing in a while as it really requires more than 2 people and the folks we played with are now 45+ minutes away from us since we moved to Glendale. I've always enjoyed Catan, so I was looking forward to dusting off the cobwebs and playing it again.

The AI on easy is fairly easy and I had no trouble beating it. I won my first game on moderate, but I've lost a few here and there as well. On hard, I get trounced pretty consistently, enough to where I wonder if the AI is "cheating" by having perfect memory of my cards. One debate online is that because the cards you draw are trackable information, a player with an excellent memory can attempt to remember what you have in-hand. This leads to discussions on if players in Catan should always keep their cards face-up or not to eliminate that advantage.

The graphics and UI are average at best. The game is not going to win awards for presentation. There's an option to enable a 3D animated terrain, but IMHO it just makes the board more busy and distracting, and I have trouble seeing the pieces. I'm also not a fan of the character artwork style or the use of historical characters. I get that Big Huge Games has a history of Civ-type games to their credit and they're big, huge history buffs, but the notion of playing Catan against Caesar or Lincoln makes the experience slightly less exciting to me.

One thing that really annoys me is a flat-out bug: when you finish a game, you can pull up a screen with victory stats. On one of those screens, the text and UI are just completely busted, drawing on other characters and in the wrong spots. It's pretty sloppy and shoddy. It's remarkable that it hasn't been patched by now as XBLA has an excellent patching mechanism in place.

Those minor complaints aside, I really like Catan on XBLA and I'll be playing a lot more of it in the future.

Lost Cities

The impetus for this recent spree of Xbox boardgaming was the release of Lost Cities on XBLA last week. Beth and I have played dozens, if not hundreds, of games of the original. It's an agonizing but addictive game that's great for 2. One bummer is that we can't play each other on XBLA unless we get 2 Xboxes and go through LIVE, but since we have the real thing here, that's hardly a major concern.

The graphics are adequate if somewhat tiny - they could have made better use of the screen space I think. Sounds are pretty good. I've unlocked various bits of artwork, but I'm not yet sure if that's anything to get excited about. The AI seems pretty good. I win most of the time on "normal" and soon I suppose I'll try hard or expert or whatever the next step is. Again, I have not tried online play but I suspect that'll work out well.

For $10, like the others, this seems like money well-spent. It's cheaper than the real game which makes it a good introduction or an easy way to practice.

April 25, 2008

A True Gamestop Story

Overheard at a Gamestop store last night:

Guy: I'm looking for a game.
Clerk: Do you remember the name?
Guy: No, but it was for the Xbox.
Clerk: Can you tell me more about it?
Guy: It was a first-person shooter. There was this one part where I ran through water.
Clerk: What else can you remember?
Guy: I wasn't very good at it. I couldn't get past the first level.
Clerk: I need a lot more to go on.
Guy: I rented it. It was awesome.
Clerk: OK, do you think you'd recognize a screen shot if you saw it?
Guy: Maybe.

Surprisingly, this did not end in violence, just the two wandering over to look at box covers. I assume at some point it was narrowed down between the Xbox 360 and the original Xbox, but I won't swear to it.

April 22, 2008

CatWatch 2008

I promised I wouldn't post more about Ian until there was news, but enough people have asked me what's up that I figure a quick update is in order.

Aside from the cancer reoccurring, my main concern now is his weight. Other than that, his attitude and personality are great. He's doing fine - his activity level is normal to high. I sometimes joke that he's doing "too well" because he hasn't been this active in years, frankly and he can be a nuisance when I'm trying to work in my office. He's eating baby food (and some moist cat food) regularly and he's taught himself how to drink out of a bowl. I don't know if he also drinks out of the special fountain water bowl we got him, but I've caught him drinking out of the regular bowl many times. I can't gauge how effective it is or how much he drinks, but he's not lacking for effort.

I've seen him extend his tongue and at full extension it just barely comes out of his mouth. It's enough that he can actually groom himself to a limited extent. He has a habit of sometimes licking his moist cat food. The latter is possibly also why he hasn't regained all his weight. I'd guess he's still around 13 lbs and he's still pretty bony. Sometimes I'm a little surprised by his boniness, but because he has so much energy it's hard to imagine that it's a huge problem for him at the moment. We'll probably take him into the vet in a week or so to have him weighed and see if anything else has come up.

April 21, 2008

ALOT

One fake word I see on the internet a lot is "alot."

Why is it that people write "alot" and never "alittle" or "abunch" or "adozen" or "ametricton"? It doesn't make any sense to me.

These things keep me up at night.

April 09, 2008

Multithreaded OpenGL

Starting in the middle of the 10.4 development cycle, a new option was added to OpenGL to allow it to run multi-threaded. This has two main effects: it increases the overhead on the CPU for submitting OpenGL commands, but it also relieves the performance burden on your app for processing those commands. The multithreaded engine ends up being a net win if you spend less time submitting commands than the GPU does executing them, so it should not be enabled unless you know this is the case for your app.

One side-effect of this a performance oddity if your OpenGL application is heavily GPU (or fillrate) bound. In this case, you spend a very small amount of time submitting commands to the GPU, while the GPU spends a very large amount of time processing the commands. In essence, you can end up sending 30+ frames to the GPU before the engine stalls and processes the frames. The most common public case of this is World of Warcraft: if you visit certain areas and spin around (looking at a wall, for example), the engine can very quickly send 32 "look at the wall" frames and a long time waiting for the GPU to draw them (if those simple frames do a lot of alpha-blending, for example). What you experience in the game is what's known as "UI lag" - WoW stutters a bit as you spin around and your keystrokes and mouse movements start to lag behind what you see on the screen because the main CPU thread is already 32 frames ahead of what you are looking at.

One of the first things I was tasked with when I started at Apple last year was solving this issue for Leopard. From a practical standpoint, there's not any benefit to letting the GL get ahead more than a frame of the command submission. Before, we had a cut-off of roughly 32 frames in the command buffer and when the 32nd frame was submitted, the main thread waited for the GPU to finish before it started accepting more commands. Starting with Leopard, this number was reduced down to 1. By default, the main thread can now queue up one frame for the GPU to work on and start building a second. When the second frame is ready, if the first frame is not completed, the GL waits. This avoids entirely the issue of UI lag in WoW and has zero impact on the maximum framerate that the apps can achieve - you can't run faster than the GPU can draw!

To that end, we added a new parameter that can be used with CGLSetParameter/CGLGetParameter : kCGLCPMPSwapsInFlight. You can set this parameter to indicate how many frames the CPU should queue up for the GPU to process. If you want the old behavior under 10.4, set it to 32. The default value for Leopard is 1. Setting it to zero means that the GL will stop at the end of each frame and wait for the GPU to finish before proceeding. You might think this makes it the same as disabling the multithreaded engine, but no. Because there's an increased overhead in the multithreaded engine with the producer (CPU) and consumer (GPU) threads, it's effectively slower than disabling the multithreaded engine entirely. The general thinking is that you'll never need to alter this parameter. If you do, I'd be interested in knowing why and how it helps so we can better understand your needs.

There are other articles on developer.apple.com that enumerate best practices when dealing with the multithreaded engine. Be sure and read them to make best use of it. Here's a hint: if you just turn on the MT engine, don't be surprised to see your framerate go down. This technote is a good place to start.

April 08, 2008

Brad's Game Reviews: Halo Edition

I did a very small amount of work on the Mac port of Halo, back in the day. One of the consequences of that is that I bought an Xbox and Halo to play the game and see what it was like. At the time, I got to the "Library" level and stopped because, well, it got real repetitive.

Recently we got an Xbox 360 and one of the games I wanted to play was Halo 3, but first I figured I'd go back and finish 1 and 2 to bring me up to speed. Since my saved games were on my old Xbox, I dug it out and finished up Halo 1.

As time has gone on, I've discovered that I'm not really a big fan of shooters any more, and in particular I'm not a fan of Halo's "checkpoint save" system, which meant playing and re-playing certain parts of a level over and over until I finally either figured out the catch or muscled my way through. In particular, I didn't care for the very last level of Halo 1 where you have to drive to a certain point in a certain length of time (and then discover - spoiler! - that oops, you have to go farther still). That said, I enjoyed Halo for what it was. Playing Halo 2 immediately afterwards, I was reminded that this was basically the same game done slightly different. Perhaps a few years gap in between would have helped me appreciate it more, but it felt more like work knowing that the goal was to get to Halo 3.

And so it was that I did get to Halo 3 and finish it (on normal, IIRC). It was enjoyable, but again it felt at times like the same game only much more attractive. Maybe that's the point though, I don't know. For all my gripes with checkpoints and replaying the same things over and over (because I suck), one thing I did like most about the series was the way it presented some challenges in a high-stress way, like the race at the end of Halo 3 to get to your ship before the the surface you are driving on vanishes. It was exciting and stressful the first 3 or 4 times I tried it. Because I suck, it took me 10 or so tries. I respect and admire the person that can complete Halo on the hardest settings.

One thing that didn't click with me was the Cortana character, a supposedly-sexy female Ai or computer construct or whatever with a sassy attitude. I'm not sure a) why someone in the "Halo" universe would design such a construct in the first place or b) what the appeal of it would be, given that it's just a holograph of an AI. I have this vision of fetishists that are into having female computers talk sexy to them, but maybe I'm just missing the point again.

So to sum up: Halo == neat but they lose something if you play all 3 back-to-back-to-back. ;-)

April 04, 2008

Stay of Execution

This'll be the last Ian post for a while, I swear.

We took him into the vet yesterday afternoon for what would have been his "final" visit, but turned into a regular check-up once he started eating and drinking. From roughly 10pm on Wednesday night until the vet visit yesterday, he'd been eating baby food like a pig, and that hasn't really stopped.

The vet was surprised, bordering on shocked, at his condition. His mouth and tongue had healed to what he termed was a healthy pink. His tongue nubbin looked good and his weight was 13 lbs, which matched his weight on Monday when we brought him in. I checked his records, and his piggiest weight was 15.5 lbs, although he was down to 14.1 before we brought him in for surgery. So for the moment his weight loss has been arrested and I suspect he'll plump back up to 14+ before too long, given that he really hadn't eaten anything between last Thursday and Wednesday night.

I asked our vet, Dr. Toben, about our next steps. I had thoughts of perhaps getting an x-ray to see where the cancer is at, but he made a good point: the x-ray won't really change anything for us. The cancer is terminal and we aren't planning on radiation therapy or invasive surgery due to its fast-spreading nature, so just knowing that he's got tumors here or there will only add to the worry, it won't tell us how long he's got because it's impossible to tell for sure. Our best course of action is simply to wait for his health to decline and not waste any time getting him back in - or more likely euthanizing him - when we see his attitude deteriorate. At this point, as our vet said, it's about quality of life rather than quantity.

April 02, 2008

This was a triumph.

I'm making a note here: HUGE SUCCESS.

We've had two critical victories today for Ian, and frankly we had run out of hope. We had scheduled an appointment with the vet for tomorrow at 2:30 to euthanize him, and honestly we chose that time only because it was the earliest we could get him in. He's been whining non-stop for the past few days, undoubtedly from hunger and thirst. His coat looks like complete hell from dehydration and he's fairly bony now. His average weight is 15 lbs, he was 14 before surgery last Thursday and he was down to 13 on Monday. We didn't attempt to weight him since then but it wouldn't shock me if he's down to 12 now. He was slightly overweight before ("big boned!") but now his big bones are poking through.

So with that background, this morning he took a 5 minute drink out of running water from a faucet, and continued to do so throughout the day. Because he can put his mouth under it sideways, he's able to counteract his missing lapping tongue action and "chomp" his way to a drink. I can't overstate how happy I was to see him do that, but we also knew that as good a sign as it was, he still had to eat for it to mean much.

Our attempts to feed him have failed pretty badly. He's attempted continuously to eat from his food bowl and also eat wet food we've placed down, but he never has gotten past smacking his lips and drooling on it, as his tongue was too integral a part of picking up and chewing his food. We tried feeding him his favorite soft treats; we were able to hold those above his head and drop them into his mouth. They'd go in, he'd happily chew and then they'd fall out on the floor and he couldn't finish. It was tragic - we went through that cycle 8 or 9 times in a row and each time the treat fell out after a few chews, then he gave up. I had tried feeding him some baby food on my finger. He got so far as to take a nibble, but then walked away and wouldn't try again. The torture of it for us was that he was trying to eat and drink and he wasn't giving up, but he couldn't figure out a way to make it work.

Fast forward to tonight. In desperation, I broke open a new bottle of stage 1 baby food - chicken in chicken broth, put a huge dollop on my finger to my shock he nibbled it all. He kept on going until my finger was entirely in his mouth and he could use his nubbin of a tongue to clean it, then he bit down on it as hard as he could, drawing blood. It was a positive, if extremely painful, sign. I gave him a few more finger-fulls then piled it up in a Close Encounters-style Devil's Tower in the baby food dish as my finger was starting to bleed. At that point, the flood gates were open: so long as I could keep it piled up, he would continue to eat. He polished off the entire baby food jar and a portion of another (turkey in turkey broth).

Now clearly this is not an ideal diet and we can't leave our faucet running all the time. But we've made significant forward progress and I feel better knowing that at least we won't have to put him down because he's starving to death. It's likely of course that the cancer will kick in again soon and he'll deteriorate, but when that time comes we'll know and we're prepared for it. Our plan now is to have the vet do some x-rays and give us a better prognosis along with diet tips so we can manage him from here on out.

Edit: in the time since I published this and now, Ian "asked" for more food and we fed him another little jar of the stage 1 chicken baby food. He ate 75% of it. That's the tubby Ian I know.

April 01, 2008

Waiting is the hardest part

Here's another personal update on Ian's "progress". Some details may not be for the squeamish, so the story is after the break. If you want an executive summary, he's still with us but a final blog entry is inevitable and is likely to be only a few days away, tops.

After we got Ian back from surgery last Thursday, he had about a day of normal behavior, aside from an inability to use his mouth. Beyond that, things declined fairly steadily. We were unable to feed him via eyedroppers - we tried but more got on us and him than down his throat. By Sunday, he was hiding under the bed, completely listless and it was clearly too stressful for him to try. Alongside this, the surgery to remove the tumor under his tongue caused the bulk to die off and it fell out on Monday morning. Up until that point, I had hopes that once his tongue/mouth recovered, he'd be able to feed and drink by himself and he would recover his strength. It was devastating when that happened.

We had made an appointment to take him back in on Monday afternoon to see about getting him to eat and drink again, but this was before he lost his tongue. As the vet told us, Ian's biopsy came back and he had an advanced and aggressive form of cancer: feline squamous cell carcinoma. The vet gave him days to weeks to live given the aggressive growth and spread of the cancer. The mortality rate for this particular kind is unfortunately very high. He warned us that the the most likely outcome is that Ian will either slowly starve to death or the cancer will start to cause him great pain in fairly short order. He encouraged us to put him under at that moment if we were ready.

I can't say I was caught off guard; when his tongue fell out I pretty much knew his time was limited. Still, we had the vet inject subcutaneous fluids to keep him nourished at least temporarily. The shot-in-the-dark goal was that it might be enough to get him back up and about, and maybe he'd find a way to feed/drink on his own and we'd buy a few more weeks. Last night we was indeed back to his old self, but completely unable to drink or feed. He'd just sit staring at the water dish and food bowls, nosing both and smacking his mouth. His mouth is filling almost non-stop with mucus and that, combined with the lack of tongue, has him completely confused. We tried a few different tacks - cleaning his mouth, having him drink from a running faucet, but only met with frustration. The best he could do was stick his mouth under the faucet for a split-second - not enough to take a meaningful drink, but enough to cause us moments of hope and anticipation.

The current thinking is that we'll wait until he's lost the energy from the subcutaneous shot yesterday and we'll take him in when he starts to deteriorate again. It doesn't look like that'll be today, but the vet said we've only bought him 1-3 days tops. In retrospect, I think that's why the vet suggested we think about euthanizing him yesterday when we were in. Waiting for him to start to deteriorate again is hard, painful work and even if we can get him fed, we're just keeping him alive to die of cancer in short order.

Regardless, I'm glad we had a "good" night last night, and not only was Ian able to be his old self, but we were able to give him all the attention and care he wanted - which was a lot. :)