```ts
export function tileRenders(requests: [number, string][], freshFor: number, size: number): [number, string][] {
    if (freshFor <= 0 || !Number.isInteger(freshFor)) throw new Error('Invalid freshFor');
    if (size <= 0 || !Number.isInteger(size)) throw new Error('Invalid size');

    const cache: { [tile: string]: number } = {};
    const renders: [number, string][] = [];

    for (const [tick, tile] of requests) {
        if (cache[tile] !== undefined && tick >= cache[tile]) {
            renders.push([tick, tile]);
        } else {
            while (Object.keys(cache).length >= size) {
                const oldestTile = Object.entries(cache).reduce((a, b) => a[1] < b[1] ? a : b)[0];
                delete cache[oldestTile];
            }
            cache[tile] = tick + freshFor;
            renders.push([tick, tile]);
        }
    }

    return renders;
}
```