To add to what Richard said:
If you’re working with RDP sessions, sometimes it can happen that the view doesn’t refresh properly or has artifacts (similar to a streamed video, since it is functionally similar to one). In that case there’s no fault of a robot, since the image simply isn’t displayed correctly.
It is also worth noting that things displayed on local machine and through RDP do not look the same. You can test it by opening something in same resolution locally and in RDP, take screenshots of both and zoom in heavily. It’s especially visible with text. Locally letter borders will be sharp, while from RDP version if you go pixel by pixel you’ll see that they are smoothed and most of the pixels aren’t even black, just different shades of gray.
One last thing that comes to mind is to remember that scope cascades. If you’re working inside AttachWindow/Browser or ElementScope and the image is outside of it, it will not be found. Some activities (SetClippingRegion f.e.) also change the “viewport” that the robot is looking through and if used incorrectly may lead to unexpected results.
I can also attest that ImageExists (and FindImage etc.) does work - we’re using it on a daily basis where required. It had some issues in the past with Timeout not registering, but that didn’t impact it’s accuracy.