news 2026/10/5 8:52:05

Windows上PySpark环境搭建指南:从零配置到跑通数据分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows上PySpark环境搭建指南:从零配置到跑通数据分析

很多做数据分析、机器学习或者准备大数据面试的朋友,一开始都会撞上同一个坎:手头只有一台 Windows 电脑,却想跑 PySpark。Linux 上搭 Spark 环境也就是十分钟的事,Windows 上却经常被各种奇怪报错拦住——明明 JDK 装了、Python 也装了,一启动 pyspark 就直接红屏。这篇文章就把我在 Windows 上从零搭建 Python + Spark 环境的完整过程、版本选择逻辑、内存配置细节,以及踩过的坑全部写出来。我不会只给结论,会尽量把每一步背后的“为什么”讲清楚,你照着走一遍,就能在本机把 pyspark、spark-submit、Jupyter 调试这一套全部跑通。

1. 方案整体设计:Windows 上跑 Spark 为什么绕不开这些坑

1.1 Windows 环境下的三种常见搭建路线对比

如果你去搜索引擎里翻 Windows 装 Spark 的教程,会看到三种主流方案:原生 Windows 直接安装、WSL2 里装 Linux 环境、Docker 跑 Spark 镜像。很多人上来就纠结选哪个,我的建议很直接:如果是学习、开发、写练习项目,优先用原生 Windows 方案。

先看三个方案的核心差异:

方案优点缺点适合场景
原生 Windows 安装环境变量直观、文件读写快、可视化 UI 方便、和 PyCharm/Jupyter 集成最简单需要处理 winutils.exe 等 Windows 兼容问题单机学习、代码调试、跑中小数据量任务
WSL2 里安装更接近生产 Linux 环境、官方兼容性更好跨文件系统 IO 性能差、端口转发偶尔出问题、网络配置比较绕需要模拟 Linux 环境、跑接近生产的代码
Docker 运行 Spark环境隔离干净、一键起服务内存占用大、数据挂载和端口映射需要额外配置、容器重启配置会丢快速体验、团队统一环境

我最早也试过 WSL2,结果被两个问题搞得很烦:一是 Windows 和 WSL2 之间跨文件系统读写特别慢,一旦数据集放在 Windows 目录下,Spark 读起来像老牛拉车;二是 Jupyter Notebook 跑在 WSL2 里,浏览器访问 localhost 偶尔会出现端口转发失败,排查起来非常消耗耐心。至于 Docker,单机学习场景用它是杀鸡用牛刀,一个基础镜像动辄几个 GB,电脑内存小一点直接卡成 PPT。

原生 Windows 方案最大的价值,是让环境中的每个环节都可控。JDK 装在哪、Python 用的哪个版本、Spark 的日志输出到什么位置、内存参数有没有生效,你都能用一个命令查清楚。这种可见性对于新手理解 Spark 的运行机制非常关键。

1.2 用“外卖系统”类比理解 Spark 的运行逻辑

在动手之前,建议先花三分钟理解 Spark 在单机上是怎样跑起来的,否则后面配环境变量、调内存参数时,你很容易不知道自己在配什么。

Spark 的分布式计算模型可以类比成一家外卖公司。Driver 是接单中心,负责接收用户写的计算代码、拆解任务、调度资源;Executor 是骑手团队,真正干活,把数据拉回来计算。二者之间还有一个 Cluster Manager 扮演调度平台的角色,负责分配“骑手”数量。

在 Windows 单机本地模式下,这套体系全部跑在同一个 JVM 进程里。你启动 pyspark 时,接单中心(Driver)和骑手团队(Executor)其实都在同一台电脑上工作,任务分发也走的是本地线程,而不是网络传输。这也是为什么本地模式适合学习但不适合真正处理海量数据——因为没有多台机器帮你分摊计算压力,所有活都压在你电脑的 CPU、内存和磁盘上。

理解了这一点,再去看环境配置就会清楚很多。比如为什么必须装 JDK?因为 Spark 本身是 Scala/Java 写的,JVM 是它运行的地基。为什么内存参数那么敏感?因为 Driver 和 Executor 都在一个进程里,内存配额设得过大,电脑本身会卡死;设得过小,任务直接报 OutOfMemoryError。这些后面都会展开讲。

2. 版本选型与核心细节拆解

2.1 JDK、Python、Spark 的“锁死组合”

Windows 上搭 Spark 环境,最忌讳的就是“版本随便装”。我见过太多人装了最新版 JDK 21,又装了 Python 3.13,然后跑来问为什么 pyspark 起不来。Spark 对生态里的版本是有明确兼容边界的,官方文档写得很清楚,只是很多人安装前根本没看。

我这里直接给出一套验证过可以稳定运行的标准组合:

组件推荐版本说明
JDK11 或 8Spark 3.5.x 支持 Java 8/11/17,推荐 11,兼顾稳定性和新特性
Python3.10(64位)Spark 3.5.x 官方支持 Python 3.8-3.11,3.10 兼容性最好
Spark / PySpark3.5.x当前最主流稳定版,建议下载 3.5.1 或更新补丁版本
Hadoop winutils对应 Hadoop 3.3.x用 Spark 内置的 Hadoop 版本去匹配,避免底层报错

为什么不要用最新版 JDK?因为 Spark 要和很多 Hadoop 生态组件交互,这些组件对 JDK 版本的跟进往往慢半拍,特别是一些依赖 JNI 底层调用的组件,在太新的 JDK 上容易出现莫名其妙的崩溃。同理,Python 版本也不是越新越好,Windows 上某些第三方扩展包对 3.12、3.13 的支持还不完善,选 3.10 最省心。

安装 Python 时有个关键细节:在安装第一步的界面底部,一定要勾选“Add Python to PATH”。这一步漏掉,后面执行 python 命令会提示“不是内部或外部命令”,很多人卡在这一步还以为是 Python 没装好。另外强烈建议安装路径选无空格无中文的目录,比如D:\Python310,避免后续 Spark 解析路径时出幺蛾子。

2.2 Winutils:Windows 上 Spark 绕不过去的一个小零件

Windows 用户跑 Spark 时遇到的第一道鬼门关,大概率是这段报错:

Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

很多新手看到这里直接懵了,第一反应是“我是不是应该装一个 Hadoop?”其实不需要。这个报错出现的原因,是 Spark 在启动时需要对本地文件系统做一些权限检查,而 Hadoop 在 Linux 上依赖的是 Linux 权限模型,Windows 上必须有一个工具来模拟这套逻辑,这个工具就是 winutils.exe。

可以把它理解成一把钥匙——Windows 系统用它来假装自己认识 Hadoop 的权限规则,Spark 看到“钥匙”存在,就不会再闹脾气。

解决办法分两步。第一步,去github.com/steveloughran/winutils或github.com/cdarlint/winutils下载对应版本的 winutils.exe。注意版本要对齐:Spark 3.5.x 内置的 Hadoop 版本是 3.3.x,你就去找 hadoop-3.3.x 目录下的 winutils.exe,不要随手 grab 一个 hadoop-2.x 的版本,虽然本地跑临时任务可能混过去,但后续接 HDFS 或调一些底层 API 时会埋坑。

第二步,把 winutils.exe 放到一个干净路径的bin目录里,比如D:\hadoop\bin\winutils.exe,然后设置两个环境变量:

HADOOP_HOME=D:\hadoop PATH=%PATH%;D:\hadoop\bin

设置完之后,关键一步是重启命令行窗口,否则环境变量不会生效。很多人明明配好了,却因为没重开终端反复报同样的错。

2.3 内存配置:先搞懂 Spark 的内存模型再动手

环境变量配好、pyspark 能启动之后,下一个高频问题就是内存。Windows 本地模式下,Driver 和 Executor 在同一个进程里,内存配置的默认值其实偏保守,跑大一点的数据集经常报 OutOfMemoryError。这时候不要去网上随手抄一段配置就改,先搞清楚几个参数的含义。

Spark 的内存参数通过spark-defaults.conf文件管理。这个文件在 Spark 的 conf 目录下,初始文件名是spark-defaults.conf.template,需要手动复制一份并去掉.template后缀。关键参数有三个:

  • spark.driver.memory:Driver 进程的内存上限,代码中的 collect()、show() 等操作拉取数据时主要消耗这块内存。
  • spark.executor.memory:Executor 进程的内存配额,本地模式下实际和 Driver 共享同一个 JVM,但你仍然可以显式设置。
  • spark.local.dir:Spark 做 shuffle 等操作时写临时文件的目录,默认在系统临时目录中,建议指定到一个剩余空间大的盘符,比如D:\sparktmp。

对于单机学习场景,我建议配置如下:

spark.driver.memory 2g spark.executor.memory 2g spark.local.dir D:/sparktmp

如果你的电脑内存只有 8G,建议降到 1g,否则 JVM 占掉 2g、系统再占 3g、浏览器开几个标签页,机器基本就拖不动了。内存配置不是越大越好,而是要在“够用”和“不卡死”之间找平衡。如果你在跑任务时看到任务执行特别卡,CPU 占用率却不高,大概率是内存不足导致频繁 GC,可以适当调大 driver 内存观察是否好转。

3. 实操过程:从零到跑起第一个任务

3.1 四步装好基础环境

下面是我验证过的最省事的安装流水线,全程走原生 Windows 方案,每一步都是可复现的。

第一步,安装 JDK 11。去 Adoptium 官网下载 Windows x64 的 .msi 安装包,安装到D:\jdk11。安装完成后配置 JAVA_HOME 和 PATH:

# Windows 命令行 setx JAVA_HOME "D:\jdk11" setx PATH "%PATH%;%JAVA_HOME%\bin"

PowerShell 用户可以用:

[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "D:\jdk11", "User") [System.Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";D:\jdk11\bin", "User")

配置后重开终端,执行java -version和javac -version,能看到版本信息就说明 JDK 正常。

第二步,安装 Python 3.10。官网下载 Windows installer,勾选“Add Python to PATH”,安装路径改成D:\Python310。完成后执行python --version验证。

第三步,直接用 pip 安装 PySpark。这是最推荐的方式,因为 PySpark 的 pip 包里已经自带了 Spark 二进制文件,装完 PySpark 就等于装好了 Spark,不需要再单独下载 Spark 压缩包解压配置。

pip install pyspark==3.5.1

安装过程会拉大概两三百 MB 的文件,耐心等它跑完。装好后验证一下:

python -c "import pyspark; print(pyspark.__version__)"

如果输出3.5.1之类的版本号,说明 Spark 内核已经就位。

第四步,配置 winutils。这一步对应前面第 2.2 节的内容,下载对应版本 winutils.exe,放到D:\hadoop\bin,设置 HADOOP_HOME 与 PATH。同样要重开终端。

到这里,基础环境就算搭完了。整个过程下来,你实际上已经把 JDK、Python、Spark(通过 PySpark 包)、winutils 四件事全部搞定。接下来开始验证环境能否真正跑任务。

3.2 第一个动作:pyspark 交互式环境

打开命令行,输入pyspark。如果一切正常,你会看到一大串日志输出,最后进入>>>提示符,说明 SparkSession 已经建立。

这时可以试一个最简单的 RDD 操作:

rdd = spark.sparkContext.parallelize([1, 2, 3, 4, 5]) rdd.map(lambda x: x * x).collect()

能返回[1, 4, 9, 16, 25],就说明 Spark 的计算链路完全正常。这里parallelize是把 Python 集合转成一个 RDD(弹性分布式数据集),map对每个元素做平方操作,collect将所有结果拉回到 Driver,打印在控制台。

如果你更习惯 DataFrame 语法,也可以试用:

df = spark.createDataFrame([(1, "a"), (2, "b")], ["id", "name"]) df.show()

能看到一个规整的表格输出,说明 DataFrame API 也没问题。

3.3 用 spark-submit 提交第一个 Python 脚本

学会了交互式环境,还要掌握spark-submit提交脚本的方式,因为这更接近生产场景。以后你在 PyCharm 里写完脚本,也是用它来执行。

新建一个wordcount.py文件,写入以下内容:

from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("WordCount") \ .master("local[*]") \ .getOrCreate() rdd = spark.sparkContext.textFile("data.txt") word_counts = rdd.flatMap(lambda line: line.split(" ")) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) for word, count in word_counts.collect(): print(f"{word}: {count}") spark.stop()

再准备一个data.txt,里面写几句话,比如:

hello spark hello python spark is fast python is powerful

然后提交任务:

spark-submit --master local[*] wordcount.py

控制台会打印每个单词的统计结果。这个 WordCount 虽然经典到有点老套,但它的执行流程能帮你验证 Spark 的“懒执行”机制:前面 flatMap、map、reduceByKey 都只是定义计算逻辑,只有 collect() 被调用时,Spark 才真正把任务分发执行。

3.4 在 Jupyter 和 PyCharm 里调试 PySpark

环境跑通之后,最好把 Jupyter 和 PyCharm 也配置好,这两个工具才是日常写代码的主力。

Jupyter 的方案很简单。先安装findspark:

pip install findspark

然后新建一个 notebook,在最前面写:

import findspark findspark.init() from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("JupyterPySpark") \ .master("local[*]") \ .getOrCreate()

findspark.init()的作用是自动定位 Spark 的安装位置并写入环境变量,省去手动配置的麻烦。

PyCharm 的配置稍微绕一点,核心是让 PyCharm 的终端和运行环境能识别 SPARK_HOME。建议直接在 PyCharm 的“环境变量”设置里添加上三项:

JAVA_HOME=D:\jdk11 HADOOP_HOME=D:\hadoop PYSPARK_PYTHON=D:\Python310\python.exe

然后在 PyCharm 的 Terminal 里执行pyspark,能正常进入交互式提示符,说明集成成功。这时你既能用 IDE 的智能提示写代码,又能随时跑到 Spark 上调试。

4. 一个顺手的数据分析案例:DataFrame 入门

4.1 案例背景和数据准备

环境搭好之后,总得跑点有实际意义的任务,否则离真正的数据分析还差一步。这里分享一个我常用的练习案例:订单数据按品类统计销售额。

准备一份 CSV 文件orders.csv,模拟电商订单数据,包含字段order_id,user_id,amount,category:

1001,201,59.9,books 1002,202,129.0,electronics 1003,201,39.9,books 1004,203,299.0,clothing 1005,204,99.0,electronics 1006,202,49.0,books

这个数据规模虽然很小,但完整覆盖了 DataFrame 读取、过滤、聚合、排序的常用流程。

4.2 PySpark DataFrame 常用操作示例

下面代码可以在 pyspark 交互式环境里一行行敲,也可以在脚本里运行:

from pyspark.sql import SparkSession from pyspark.sql.functions import sum, avg spark = SparkSession.builder \ .appName("OrderAnalysis") \ .master("local[*]") \ .getOrCreate() df = spark.read.option("header", True).option("inferSchema", True).csv("orders.csv") # 过滤掉 amount 为空的数据 df_clean = df.filter(df["amount"].isNotNull()) # 按品类统计总销售额和平均订单金额 result = df_clean.groupBy("category") \ .agg(sum("amount").alias("total_sales"), avg("amount").alias("avg_amount")) \ .orderBy("total_sales", ascending=False) result.show() spark.stop()

预期输出类似:

+----------+----------+----------+ | category|total_sales|avg_amount| +----------+----------+----------+ |electronics| 228.0| 114.0| | books| 148.7|49.566666... | clothing| 299.0| 299.0| +----------+----------+----------+

这个案例里有几个概念值得展开说。read.csv里设置inferSchema=True是让 Spark 自动推断列类型;filter里的isNotNull()是 DataFrame API 里做空值过滤的标准写法;groupBy后跟agg,用sum和avg函数做聚合统计。orderBy接ascending=False实现倒序排序。

整个过程最值得体会的是 Spark 的“懒执行”机制。read、filter、groupBy这些操作都只是构建了一个计算计划,并不会真的读文件、算数据。只有碰到slow()或collect()这类 action 操作时,Spark 才真正把计算任务提交执行。这一点和 Pandas 很不一样——Pandas 是“即时执行”,你写一行跑一行;Spark 是“先记账后结算”,把所有操作攒成一个执行计划再执行。理解这个差异,能帮你避免以后写复杂数据处理逻辑时出现“这一步怎么没反应”的困惑。

4.3 日志刷屏的解决方案

跑第一个 Spark 任务时,控制台会被一堆 INFO 日志淹没,真正想看的计算结果反而被淹没在日志里。这其实是 Spark 默认日志级别太啰嗦导致的,不是你的环境有问题。

最简单的解决方案,是在代码中显式设置日志级别:

spark.sparkContext.setLogLevel("WARN")

在创建 SparkSession 后加上这一行,再跑任务时控制台只会输出 WARN 级别以上的信息,清爽很多。

如果想让所有任务默认都这样,可以改 Spark conf 目录下的log4j2.properties(Spark 3.x 使用 log4j2),把rootLogger.level = info改成rootLogger.level = warn。注意 Spark 3.0 以前是log4j.properties,版本不同文件名不一样,改之前先看自己的 conf 目录下实际存在哪个文件。

5. 常见问题与排查技巧实录

5.1 高频报错速查表

把我在 Windows 上搭 Spark 环境遇到过的、以及帮别人排查时见过的典型报错整理成一张表,基本覆盖 90% 的入门问题:

报错现象关键字根本原因解决方式
pyspark 启动即退出Could not locate executable null\bin\winutils.exeHADOOP_HOME 未配置或配置后未重启终端安装 winutils.exe,设置 HADOOP_HOME 后重启命令行
启动时提示 Java 版本错误Unsupported class file major versionJDK 版本太新或太旧,与 Spark 不兼容换用 JDK 11 或 JDK 8,确保 JAVA_HOME 指向正确路径
Python worker 版本不一致Python in worker has different versionPYSPARK_PYTHON 指向了错误解释器设置 PYSPARK_PYTHON=D:\Python310\python.exe
任务跑一半报内存不足java.lang.OutOfMemoryErrordriver 或 executor 内存配额不够调大 spark.driver.memory,或减少 collect() 拉取的数据量
4040 端口打不开 Spark UICannot connect to localhost:4040端口被占用或任务未进入运行状态检查任务是否还在排队,端口冲突时 Spark 会自动切换 4041,看日志确认
Windows 防火墙弹窗Windows Defender Firewall has blockedJava/python 进程首次联网被拦截在弹出的防火墙对话框里勾选“允许访问”

这里特别想强调第一个报错的排查逻辑。如果你已经配了 HADOOP_HOME 还是报null\bin\winutils.exe,问题基本出在两个地方:一是环境变量是在配置之前打开的命令行里执行的,需要重开;二是 winutils.exe 没有放在bin子目录下,系统找不到可执行文件。这个结构必须是HADOOP_HOME指向的目录下有一个bin文件夹,bin文件夹里放着 winutils.exe。

5.2 排查思路:从环境变量到版本匹配

遇到过环境问题的人都知道,最怕的不是报错,而是报错信息看不懂、排查没有方向。我给初学者一个固定的排查顺序,照着走能省大量时间。

第一,确认 JDK 可用。命令行执行java -version,如果提示找不到命令,先去检查 JAVA_HOME 和 PATH。注意 JAVA_HOME 要指向 JDK 的根目录,不是 bin 目录,也不是 JRE 目录。第二,确认 Python 可用。执行python --version,如果与预期版本不符,要去“系统环境变量”里看 PATH 中是否有多个 Python 路径互相干扰。第三,确认 Spark 核心可用。执行python -c "import pyspark; print(pyspark.__version__)",如果报 ModuleNotFoundError,说明 pip 安装没成功,重新执行安装命令。第四,确认组件版本匹配。把 JDK、Python、PySpark 的版本与第 2.1 节的推荐组合对照。

这套顺序的逻辑是从底层到上层逐层验证。JDK 和操作系统是地基,Python 是 PySpark 的宿主环境,PySpark 包是 Spark 功能的 Python 入口。底层有问题,上层再折腾都是白费劲。

5.3 本机学习和集群实战的边界

最后聊一个很多初学者容易误会的问题。在 Windows 上用 Spark 跑通几个数据分析案例,是不是就等于会 Spark 了?不完全是。Windows 原生方案适合解决“环境入门”和“单机开发调试”这两个问题,但它并不是生产环境的标准形态。

真正的 Spark 集群应用通常跑在 Linux 服务器上,由多台机器组成 worker 节点,数据也往往存放在 HDFS、云存储等分布式文件系统里。Windows 上跑 local 模式,更像是用赛车模拟器练方向盘手感,能帮你熟悉换挡逻辑、走线思路,但模拟器里的路况终究不是真正的赛道。

所以我的建议是两句话:第一,在 Windows 上把 API 用熟,把 DataFrame、SQL、调优思路这些核心技能练扎实,这些知识在集群环境下 100% 复用。第二,当你想进一步接触集群部署、数据分区、节点间 shuffle 这些进阶内容时,果断切换到 Linux 环境,无论是云主机还是本地虚拟机,都比你继续在 Windows 上死磕要高效得多。

我在实际使用中还有一个体会想分享:Windows 上配置好的 PYSPARK_PYTHON 环境变量,很容易在装了多个 Python 版本后失效,尤其是用 Conda 的朋友,切换环境时经常发现 worker 使用的解释器版本和 driver 不一致。遇到这种情况,不用慌,在代码开头显式指定pyspark.python配置即可:

spark = SparkSession.builder \ .appName("test") \ .master("local[*]") \ .config("spark.pyspark.python", "D:/Python310/python.exe") \ .getOrCreate()

这样写相当于给 Spark 下了死命令:不管环境变量怎么变,worker 进程就用这个解释器。自从学会了这个技巧,我再也没被多版本 Python 问题折磨过。

最后再分享一个小技巧:日常调试时建议把日志级别调成 WARN,这样既能看到关键告警,又不会被 INFO 刷屏;但当你第一次跑通一个完整任务时,不妨临时调回 INFO 看一眼完整的执行计划输出,那次经历会让你对 Spark 的任务调度过程有非常直观的认识。环境搭好之后,真正值钱的是你在这个环境里跑过的每一个任务、踩过的每一个坑——那些才是你未来做大数据开发时最硬核的底子。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 8:52:01

Unity 自动化物流分拣模拟平台

本项目是一套面向自动化物流分拣场景的三维仿真演示系统,模拟包裹上料、传送、识别、分拣、入库及数据统计的完整流程,支持昼夜场景、第一人称漫游与固定视角展示,并具备批次追溯、参数调整及数据留存功能,可用于项目展示、教学培…

作者头像 李华
网站建设 2026/10/5 8:50:56

C语言结构体对齐、内存管理与位运算:协议解析实战指南

那次串口模块调试,让我第一次把构造数据类型、内存管理、位运算三个词放在同一句话里看。协议文档写得清清楚楚:帧头1字节、状态4字节、序号2字节、校验4字节。我在代码里定义了一个结构体,把串口缓冲区直接memcpy进去,再用位运算…

作者头像 李华
网站建设 2026/10/5 8:50:23

从零搭建个人知识库问答机器人:RAG与Agent实践指南

1. 为什么我要从零搭一个个人知识库问答机器人我平时有大量碎片化的资料沉淀需求:技术文档、项目复盘、读书笔记、随手记的灵感,散落在各种笔记软件、Markdown 文件夹和聊天记录里。时间一长,最大的问题不是"存不下",而…

作者头像 李华
网站建设 2026/10/5 8:50:10

工业嵌入式存储方案:MRAM与Kinetis MCU的SPI接口设计与掉电保护实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 8:49:24

基于C++与Qt的俄罗斯方块课设:源码解析、环境配置与避坑指南

简介:这是一套基于C与Qt框架开发的俄罗斯方块游戏完整工程,面向需要完成课程设计、期末大作业或毕业设计的计算机专业学生,也适合Qt初学者对照学习。项目曾获导师认可的高分成绩,从方块旋转、消行判定到得分统计均有清晰实现&…

作者头像 李华
网站建设 2026/10/5 8:49:23

UE4程序化生成戈德堡多面体:从数学原理到六边形星球实现

做“程序化生成戈德堡多面体”这个需求,最初是因为我在项目里想搞一颗六边形星球。当时摆在面前的无非三条路:一是直接拿球体Mesh加六边形贴图糊弄,远看还行,近看全是拉伸和接缝;二是用Houdini生成好再导进UE4&#xf…

作者头像 李华