几个月前在Miao地方买到个昂贵的洋垃圾:JetsonTK1,故障件280入手,确实称不上便宜。虽然淘宝上售价近两千,然而这是个故障件,而且我已有pcDuino充当NAS+爬虫机器人,确实并不需要一个更强大的ARM单板机……但是,人类对于性能的追求是无止境的,所以……

既然是故障件,肯定得先维修一番,而且鬼知道能不能修好……我想着要维修最后坑掉的东西可不占少数……不过啦,JetsonTK1作为一款开发板,资料算是一大优势,在官网上不难下载到它的原理图(602-7r375-0000-d00.schematics.rev.4.04.pdf)。其实这块板的检修确实并不困难,因为并没有出现元件本身的故障,都是因为洋垃圾运输造成的元件残损、掉落之类的。因为通常这种事情会顺带损坏焊盘,所以并不能直接简单地补上元件。不过既然原理图在,找点飞线就行了啦。

飞完线反正顺利点亮,也就是个ARM单板机,装上samba、python就差不多可以让pcDuino下岗了。不过有一点,这玩意风扇挺吵的,得想办法改一下。其实就在eLinux的Wiki上面就有关于mod散热的说明。因为我懒得翻译,所以我就直接引用eLinux页面上的原文来解释下原来的散热设计。

The Jetson TK1 board comes with a large fan+heatsink combo attached to the SOC, to ensure the board is always safe to touch by humans even when running both the CPU & GPU at max performance for long durations. The fan is rated at 12V 1.4W, and runs at 12V. It is usually fine to remove the fan and replace it with a metal heat-spreader plate or heat-sink, such as to reduce power or increase dust-resistance or lifetime or simply to get rid of the fan noise. The fan+heatsink is clearly much larger than it needs to be, so it can be replaced by a small fan or large heatsink without a reduction in performance or safety.

The Tegra K1 SOC is designed for tablets that use a small heatsink or heat-spreader plate, thus clearly it doesn't require a large fan. But tablets aren't expected to run at full performance for long periods, and you also can't touch the SOC of a tablet with your bare fingers, so NVIDIA decided to use a large surplus fan for Jetson TK1. If you wish to replace the fan with a heatsink, take into account that if you will be pushing the SOC to its limits for long durations, the SOC might be using upto 10W - 15W of power that you must dissipate with a large heatsink and/or external fan and/or attaching a heatspreader to the metal case of your overall device, otherwise the internal Tegra thermal management may reduce the performance to ensure it won't overheat.

反正呢,就是NVIDIA为了保证这个单板机能够长时间满负荷运作就加了个风扇,对于一般应用加个小散热片就行了,或者也可以换一个别的小风扇或者一个大的散热器来避免性能降低以及保证安全什么的。另外,拆下风扇将会导致你的板卡失去质保,所以,三思而后行。我的反正本来就没有,果断拆!

不难发现这个散热器其实用的就是标准的显卡散热器的螺丝位设计,好像和部分的北桥或南桥的散热器也是一样的,我这里选择用显卡的散热器来改造。用的是一个拆掉风扇的GeForce 9500GT散热器,用来对付TK1肯定够了。换好以后效果如下:

顺便把拆下来的风扇安到显卡上了,不过相信我,这小风扇,不进系统就过热花屏。

接下来是标题里的最后一个任务,Minecraft挂机。最近在玩@ntzyz开的MC服务器,然而工业2竟然把风电给ban了,以至于只能建造昂贵还低产的太阳能电站……本来以为在服务器上太阳能电站可以24hrs不间断运行(就是只要有光就能工作不用玩家一直在线),结果发现不在线的时候区块就停止刷新了,太阳能电站就停机了……所以,就顺便让NAS来挂挂机吧!(是挂PC版的MC哦,不是什么MC PE这种给移动设备玩的)

Minecraft游戏本身是使用Java编写的,也就是必须在Java虚拟机内运行,这就使得MC具有了较为良好的跨平台性能,比如可以完美在PC的Ubuntu上运行(mod也没问题哦)。但是一般的ARM单板机(比如树莓派、pcDuino)由于没有集成可以支持OpenGL加速的GPU(大多是OpenGL ES),所以也没法运行。TK1作为显卡厂出的CPU,自然在显卡上不能差,TK1集成了192核心的开普勒架构GPU,可以完整支持OpenGL和DX11(然而装不了Windows),也就是硬件上有了运行完整Minecraft的能力。直接按照PC上Ubuntu的方法玩会怎么样呢?(启动器使用通用版的HMCL即可)

结果是失败,运行一段时间后悔自动退出。稍微研究了下发现,MC中使用了一些编译好的运行库,也就是Windows下的DLL。编译好也就意味着这是X86或者X86_64的代码,不能在ARM下运行。不过好在这些库都开源,我们可以自己编译ARM的版本。

在编译前多嘴一句,网上大部分在Ubuntu下玩MC的教程都是安装OpenJDK的jre,但是实测在TK1上OpenJDK效率真心渣渣,帧率只有Oracle的JRE的1/10。这里先讲下如何安装Java。首先如果安装了OpenJDK,先将其卸载。(卸载方式:sudo apt-get remove openjdk-7-jre sudo apt-get autoremove)

接下来安装oracle的JRE:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

提一句,现在已经有java9可供下载,但是还是早期测试,不建议使用。java7和8应该都可以(笔者用了8),installer会安装这个版本下最新的update版本,而且可以自动识别arm/x86/x86_64。

好了,开始对付那些静态库。首先是重编译lwjgl库。这里参考了rogerallen的博客以及toolbox.com上关于树莓派开发的说明。运行以下命令安装编译需要的依赖:

sudo apt-get install git ant libxcursor-dev libxxf86vm-dev libxrandr-dev libxt-dev

接下来下载lwjgl的源码:

git clone https://github.com/LWJGL/lwjgl.git

不过下载下来也是x86的,要对代码做点小修改。打开platform_build/linux_ant/build.xml,把libs32这一行里面的i386改成arm,如果你使用的是Tegra X1之类的64bit处理器,我猜可能需要把下面那个amd64改成arm64。 接下来编译即可:

cd lwjgl
ant

在之前的某一个版本中存在一个小bug会导致编译不通过(calculateImage2DSize的调用参数不匹配,自己修改下就好),实测今天下载的版本没有问题。如果出现问题可以尝试自己修改代码或者获取老版本的源代码。

另外,lwjgl虽然确实会编译一个openal的库,但是实际上这个库只是他自带的一个x86共享库打了个包而已。所以,继续自己编译…(如果只是为了挂机其实可以跳过这一步,这一步是为了编译声音库)先装cmake:

sudo apt-get install cmake

下载以及编译:

wget http://kcat.strangesoft.net/openal-releases/openal-soft-1.15.1.tar.bz2
tar -xvjf openal-soft-1.15.1.tar.bz2
cd openal-soft-1.15.1/build/
cmake ..
make

编译好后应该会生成一个libopenal.so.1.15.1

接下来把编译好的东西扔到mc里面替换掉原来的,在lwjgl/libs/linux下面有liblwjgl.so和libjinput-linux.so,复制到你mc下面有这个文件的目录(.minecraft/versions/1.8/1.8-natives),以及openal-soft-1.15.1/build下面的libopenal.so.1.15.1,重命名为libopenal.so,复制到之前的地方覆盖掉。覆盖完成后,请把这些文件的权限全部设置为read-only,并且把natives文件夹的权限设置为Access only,否则会被自动覆盖

结果是,如果是1.8无Forge,可以非常流畅的运行游戏。如果是1.7.10带Forge和一些mod,需要把内存分配调到至少1024,并且安装并使用lxde桌面环境而不是Unity+Gnome(sudo apt-get install lubuntu-desktop),这样可以稳定在50fps左右,也可以顺利游戏。

上图是开启了光影的效果。

总之先这样吧,有什么问题再更。