Thanks for the reply.
I played with MarkAsChanged() before posting but wasn't able to get it to produce accurate results. I've just tried again now, and the code flow appears correct (mChanged is toggled, which later causes UpdateGeometry() to return true, causing the material to be marked as dirty, etc). But when I run this code I get inconsistent results. The last material in the list changes correctly, but the remainder stick to the first texture I assign. As I scroll around in my list (causing images to load and unload), some UITextures update and others do not. This *looks* like a race condition in which mChanged somehow gets dropped when lots of things are changed in quick succession.
In contrast, if I allocate two materials, assign textures to them once, and then just swap materials when I want the texture to change, the results are 100% correct and predictable.
My use case isn't complicated. I'm setting the texture (or material), loading some bits via www, allocating a new texture, and assigning it. If I call MarkAsChanged() after every texture assignment, the results are inconsistent and mostly wrong (some assignments don't take). If I omit MarkAsChanged but alter the material pointer instead, it's all correct.
Cheers,
Chris