```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]) {
            continue;
        }

        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;
}
```