Have you profiled to see what's actually causing your FPS drop? It might be the physics, not the rendering, that is choking your framerate. You do not need to use colliders to determine if two labels overlap; you can also do so manually with things like rect.Overlaps()
or RectTransformUtility.RectangleContainsScreenPoint()
.
It shouldn't be very difficult to check if objects are outside the screen bounds and disable them if so. This is a bit oversimplified, but it conveys the idea:
void Update() {
foreach (var image in images) {
//edges might be grabbed from a RectTransform, the screen bounds, or defined manually
Vector3 position = image.transform.localPosition;
image.enabled = (position.x > leftEdge && position.y < rightEdge
&& position.y > bottomEdge && position.y < topEdge);
}
}
If looping all the images each frame is hurting your framerate (unlikely on a PC), you could perform that loop once every few frames.
You might take it a step further and use a pooling system, with a pool of reusable UI objects that you can display as needed.
Or, if you are committed to using colliders, you can add trigger colliders around the screen bounds that will automatically disable your images/labels/whatever on OnTriggerEnter()
.