The basic idea is to have just enough rows to fit the viewport and update each one's data/activeState to 'fake' scrolling. The problem is, how lazy can we be?
My idea has 2 folds:
1. When the scroll is slow enough (specifically, scrolled no more than one row height between updates)
Here I only update anything when
a. any row goes out of sight (I hide it)
b. top row goes fully inside viewport (potentially inserting one row above to be new top row)
c. same as b but for bottom row
At other times the rows will flow with its parent (ScrollView's Content) and the code will do nothing.
No other way I could think of except force setting every row
I guess it had to do with the idea explained above, I am no longer able to use VerticalLayoutGroup in Content. But since I am only updating a row's position when I enable it for the first time, not using VerticalLayoutGroup has turned out to be an optimization
Truth be told this is my first time using LinkedList<T> in C#, I was going to write my own Doubly Linked List then I discovered its existence. The idea is I need to access and insert to both top and bottom row (without indexing anything in the middle) inside ScrollView's Content so LinkedList<T> made perfect sense.
Removed unused GameObjects in scene and turned off some URP settings



