You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为线程数匹配最接近整数因子以划分2D渲染网格?

解决方案:光线追踪器的2D瓦片线程划分

核心步骤

  • 找到最接近目标线程数的可分解整数(能表示为两个正整数乘积)
  • 为该可分解数匹配最接近正方形的因子对(保证负载均匀)
  • 根据屏幕分辨率和因子对生成所有瓦片的边界坐标

代码实现

import math

def find_closest_composite(n):
    if n <= 1:
        return 1
    
    def is_composite(x):
        if x <= 1:
            return False
        for i in range(2, int(math.isqrt(x)) + 1):
            if x % i == 0:
                return True
        return False
    
    # 先检查当前数是否可分解
    if is_composite(n):
        return n
    
    # 寻找上下最近的可分解数
    lower, upper = n - 1, n + 1
    while True:
        if lower >= 2 and is_composite(lower):
            return lower
        if is_composite(upper):
            return upper
        lower -= 1
        upper += 1

def find_best_factor_pair(composite_n):
    best_w, best_h = 1, composite_n
    min_ratio = float('inf')
    
    # 遍历所有可能的宽因子,找比例最接近1的因子对
    for w in range(1, int(math.isqrt(composite_n)) + 1):
        if composite_n % w == 0:
            h = composite_n // w
            current_ratio = h / w
            if current_ratio < min_ratio:
                min_ratio = current_ratio
                best_w, best_h = w, h
    return best_w, best_h

def generate_tiles(screen_width, screen_height, thread_count):
    # 获取最优可分解数和对应的行列数
    target_threads = find_closest_composite(thread_count)
    cols, rows = find_best_factor_pair(target_threads)
    
    # 计算基础瓦片尺寸
    tile_w = screen_width // cols
    tile_h = screen_height // rows
    
    tiles = []
    for y_idx in range(rows):
        for x_idx in range(cols):
            x_start = x_idx * tile_w
            y_start = y_idx * tile_h
            # 最后一个瓦片直接对齐屏幕边界,避免整除误差
            x_end = (x_idx + 1) * tile_w if x_idx != cols - 1 else screen_width
            y_end = (y_idx + 1) * tile_h if y_idx != rows - 1 else screen_height
            tiles.append((x_start, y_start, x_end, y_end))
    return tiles

测试示例

# 测试线程数4,分辨率640x320
print(generate_tiles(640, 320, 4))
# 输出: [(0, 0, 320, 160), (320, 0, 640, 160), (0, 160, 320, 320), (320, 160, 640, 320)]

# 测试线程数7(自动使用6)
print(generate_tiles(640, 320, 7))
# 输出6个均匀划分的瓦片

# 测试线程数32(对应4x8的网格)
print(generate_tiles(640, 320, 32))
# 输出32个160x40的瓦片

说明

  • 若目标线程数为质数(如7),会自动切换到最近的可分解数(代码优先取更小的6,若想优先更大的8,可交换lower和upper的检查顺序)
  • 因子对选择逻辑优先保证网格接近正方形,避免出现极端的1xN划分,让各线程负载更均衡
  • 瓦片坐标计算自动处理整除误差,最后一行/列的瓦片会对齐屏幕边缘,避免黑边

内容的提问来源于stack exchange,提问作者MirceaKitsune

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:32:05