nearest_po2
2026/4/15大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — nearest_po2
nearest_po2
定义
nearest_po2() 找到最接近给定整数的 2 的幂次。2 的幂次就是那些"翻倍再翻倍"的数字:1, 2, 4, 8, 16, 32, 64, 128 ...
就像超市里只卖 1 个装、2 个装、4 个装、8 个装的鸡蛋盒。你说想要 5 个鸡蛋,店员会告诉你:最接近的是 4 个装或者 8 个装。nearest_po2() 就是帮你做这件事——给定任意一个数字,找到离它最近的"翻倍数"。
函数签名
C#
public static int Mathf.NearestPo2(int value)GDScript
func nearest_po2(value: int) -> int参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
value | int | 是 | 要查找最近 2 的幂次的正整数 |
返回值
int —— 最接近 value 的 2 的幂次。如果 value 恰好在两个 2 的幂次的正中间(比如 6,恰好在 4 和 8 之间),则返回较大的那个(8)。如果 value 小于等于 0,返回 0。
常见对应关系:
| 输入 | 输出 | 说明 |
|---|---|---|
| 1 | 1 | 1 本身就是 2 的 0 次方 |
| 3 | 4 | 离 2 和 4 都近,返回较大的 4 |
| 5 | 4 | 离 4 更近(距离 1),离 8 远(距离 3) |
| 6 | 8 | 离 4 和 8 一样远(距离都是 2),返回较大的 8 |
| 10 | 8 | 离 8 更近(距离 2),离 16 远(距离 6) |
| 100 | 128 | 离 64 远(距离 36),离 128 近(距离 28) |
代码示例
C#
using Godot;
public partial class Po2Example : Node
{
public override void _Ready()
{
// 基本用法:找到最近的 2 的幂次
GD.Print(Mathf.NearestPo2(1)); // 1
GD.Print(Mathf.NearestPo2(3)); // 4
GD.Print(Mathf.NearestPo2(5)); // 4
GD.Print(Mathf.NearestPo2(6)); // 8
GD.Print(Mathf.NearestPo2(10)); // 8
GD.Print(Mathf.NearestPo2(100)); // 128
// 实际场景:为纹理选择合适的尺寸
// GPU 通常要求纹理尺寸是 2 的幂次
int textureWidth = 300;
int po2Width = Mathf.NearestPo2(textureWidth);
GD.Print($"纹理宽度 {textureWidth} -> 最近的 2 的幂次: {po2Width}");
// 输出: 纹理宽度 300 -> 最近的 2 的幂次: 256
}
}GDScript
extends Node
func _ready():
# 基本用法:找到最近的 2 的幂次
print(nearest_po2(1)) # 1
print(nearest_po2(3)) # 4
print(nearest_po2(5)) # 4
print(nearest_po2(6)) # 8
print(nearest_po2(10)) # 8
print(nearest_po2(100)) # 128
# 实际场景:为纹理选择合适的尺寸
# GPU 通常要求纹理尺寸是 2 的幂次
var texture_width = 300
var po2_width = nearest_po2(texture_width)
print("纹理宽度 %d -> 最近的 2 的幂次: %d" % [texture_width, po2_width])
# 输出: 纹理宽度 300 -> 最近的 2 的幂次: 256注意事项
- 如果
value小于等于 0,返回 0。 - 如果
value恰好在两个 2 的幂次的正中间(比如 6 在 4 和 8 之间),返回较大的那个。 - 此函数在游戏开发中常用于设置纹理尺寸、缓冲区大小等场景,因为 GPU 和许多图形 API 对 2 的幂次尺寸有更好的性能优化。
nearest_po2()返回的是"最接近的"2 的幂次。如果你需要"大于等于"给定值的最小 2 的幂次(向上取整),可以使用1 << (value - 1).ToString("X").Length * 4等位运算方式手动计算,或者先判断返回值是否小于输入值再翻倍。
