With instances and proxies you can also have multiple shaders, but they’re on a per-face level. The object has to be combined; it keeps its shader assignments but to alter them isn’t easy. The dependency graph takes a crap anytime you try to do something like this, coupled with your GPU trying to sort the display. It’s slightly faster in bounding-box mode, but the real hangup is the single-threaded dependency graph.
That is to say, if you want to replace a shader on leaves after your instancing/placement painting, you go into Hypershade, right-click-drag on your material then pick “select objects with this material” or whatever, and then wait. For awhile. Maybe 2 minutes, maybe 200, depending on the amount of objects and faces you’re dealing with. In bounding box this is much faster, but again only part of the process speeds up by removing the GPU from the mix; the dependency graph still sucks. Totally CPU-bound, and totally single-threaded. I have isolated this difference between my Athlon X2 @2.5GHz, a Phenom X4@2.5GHz, and the new Phenom X6 @ 3.3GHz. The Phenom and Athlon had roughly the same perfomance here, and the new X6 has shown itself to be proportionally faster, but nowhere near twice as fast.
Then you assign the new texture in Hypershade the same way, and again wait a long time for it to update. Often you will think Maya had crashed entirely. One core, pounding away with no visible feedback or result until it’s finally finished. I’ve had this process take five hours before; I really hope there’s a better way.
All this said, with a city you won’t be dealing with quite the geometry polycounts you would be with trees and flora. So it might be much faster indeed. And like I said, I’d love to know I’m reassigning materials the wrong or slowest way. Any input would be appreciated.