Significant scrolling lag when using .focused modifier in large LazyVStack/LazyHStack on tvOS

Summary:

When using the new .focused modifier to track focus within a large LazyVStack or LazyHStack, we observe a major frame-rate drop and stuttering on Apple TV (1st and 2nd generation).

Steps to Reproduce:

  1. Create a LazyVStack (or LazyHStack) displaying a substantial list of data models (e.g., 100+ GroupData items).
  2. Attach the .focused(::) modifier to each row, binding to an @FocusState variable of the same model type.
  3. Build and run on an Apple TV device or simulator.
  4. Scroll through the list using the remote.
    static func == (lhs: GroupData, rhs: GroupData) -> Bool {
        lhs.id == rhs.id
    }
    
    var id: String
    var name: String
    var subName: String
    var subGroup: [GroupData] = []
    
    var logo: URL?
    
}

struct TestView: View {
    
    @FocusState var focusedGroup: GroupData?
    
    let groupsArr: [GroupData]
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(groupsArr, id: \.id) { group in
                    Button {
                        
                    } label: {
                        GroupTestView(group: group)
                    }
                    .id(group.id)
                    .focused($focusedGroup, equals: group)
                }
            }
        }
    }
    
}


struct GroupTestView: View {

    let group: GroupData
    
    var body: some View {
        HStack {
            KFImage.url(group.logo)
              .placeholder {
                Image(systemName: "photo")
                  .opacity(0.2)
                  .imageScale(.large)
              }
              .resizable()
              .scaledToFit()
              .frame(width: 70)
            
            VStack {
                Text(group.name)
                
                Text(group.subName)
            }
        }
    }
}

Expected Behavior

  • Scrolling remains smooth (60 fps) regardless of list size.
  • Focus updates without introducing visible lag.

Observed Behavior

  • Frame rate drops significantly when .focused is applied.
  • Scrolling becomes visibly laggy, especially on older Apple TV hardware.
  • Even when binding an @FocusState<String?> (storing only the id), performance improves slightly but remains suboptimal.

Workarounds Tried

  • Switched to @FocusState of type String to track only the ID of each group, this has helped but there is still a big performance decrease.
  • Minimised view-body complexity and removed other modifiers.
  • Verified that excluding .focused entirely restores smooth scrolling.

Any guidance or suggestions would be greatly appreciated.

Brainstorming: Try the workaround of factoring the body of the ForEach into its own view, with a boolean isFocused property, and .focused($isFocused)

Would love to get some feedback from any of the Apple engineers about it, the behavior is the same in tvOS26 Developer Beta 1 as well, having a LazyVStack with 700+ rows with each row using the .focused modifier will lag the ScrollView to almost 1 FPS when getting to position 500+-

It seems as SwiftUI keeps rendering all the previous scrolled rows which causes major lag.

Removing the .focused modifier completely fixes it, as this modifier is a key modifier for creating a complex apps in tvOS I would assume it would be a top priority to fix.

Significant scrolling lag when using .focused modifier in large LazyVStack/LazyHStack on tvOS
 
 
Q