52

Sofdect2功能以及在Unreal4有趣的使用-腾讯游戏学院

 5 years ago
source link: http://gad.qq.com/article/detail/288740
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、引言

  CRIWARE除了拥有音频中间件ADX2外还拥有视频中间件Sofdect2,为视频的编解码,播放提供了便利。

  Unreal4强大的功能已经无需笔者赘述,各位应用者定当比我熟知,当Sofdect2在Unreal4中应用时,借助于两者各自功能,能创造出一些比较有趣,且提高工作效率和开发时间的事情。

  Sofdect2可以在官网进行申请试用(https://www.criware.com/cn/get/index.html)。

  Unreal在官网下载(https://www.unrealengine.com/zh-CN/download)。

 

二、正文

  Sofdect2是CRIWARE针对视频而开发的解决工具,主要用于视频的压缩和解码上。

  但实际上CRIWARE在Sofdect2的开发上不仅仅有视频压缩和解码,还有其他很多有用的功能。

1、Sofdect2简介

  Sofdect2的主要工作流程图如下:

5c0499844c348.png

  视频,音频,字母等在Sofdect2中合成,在经过Sofdect压缩后,进入游戏,通过游戏内的系统进行解压和播放。

  整个流程非常的简单化,而且Sofdect2的使用操作异常的简单,无需任何技术都可以很容易的根据自己的喜好进行压缩。

  Sofdect2的功能主要分为以下5项:视频的压缩和解码,多语种语音,多语种字母,Alpha通道视频播放以及Cue Point事件触发。

1)、视频的压缩和解码

  在游戏中有很多的地方会用到相关的视频,例如过场动画。一般精致的过场动画由于无损,会导致文件的体积异常的大,因此需要进行压缩以减少视频的体积。

  一般的压缩会导致视频效果的极大损坏,而Sofdect2的压缩则可以尽可能的减少效果的丢失,下面是一组对比图:

5c049aa1ab402.png5c049aaeb0721.png

  明显的看到Sofdect2压缩过后的视频效果要远远优于。

  在Sofdect2中拥有3个压缩格式可供选择:Sofdect.Prime,H.264以及VP9。

  每种格式的压缩量以及应用平台会有所不同。

  相关细节如下:

5c049bf58192d.png

For Smartphones

For game consoles 

5c049c3a0eaea.png

  上面是针对不同平台的各个压缩效果的各项指标。

  

5c049ce7a8959.png

 

  上面则是各个压缩所支持的平台。

  压缩的选择对于频台和开发者自己所想要达到的目的相互呼应,因为按照常理,压缩越大,视频效果损失越大,任何一个压缩软件都无法避免,因此合理的平衡压缩和效果,合理的平衡CPU和内存占比是较为重要的也是开发者需要自行斟酌的地方。

 

2)、多语种语音

  多语种语音用于视频中需要多种语音播放。传统压缩视频并不具备此种功能,当我们需要针对不同语言出不同的视频时,由于并不支持多种语音播放,因此同样在游戏中我们需要放置多个视频,每个视频包含相同的视频,不同的音频。当需要播放某种语音时调取对应的整个压缩视频。

  这种方式导致的结果就是包的大小线性增长,每多支持一种语言,就需要将所有的视频全部按照语言重新输出一遍,如此一来整个包的大小会急速膨胀。

  为了解决这一问题,Sofdect2引进了多语种语音功能,Sofdect2支持导入多个音频轨道(实际可支持0-31总共32个音频轨道),同时只使用1个视频源,音频的大小相比较视频将会小很多。

5c04a2b96025c.png

 

  导入的音频轨道可通过两种方式播放:

  Audio Track:该轨道建议应用于除了需要根据语种变化外的其他所有音频集合例如BGM,环境音效,以及其他表现音效。

  Voice Track:该轨道建议用于语种音频。

  当完成上述内容后,在实际播放视频时,经由程序代码控制播放对应的音频轨道就能够完成语音的切换。

  这种方式仅仅需要变化音频视频使用同一视频源,如此一来整个的大小从音频和视频的集合编程仅仅音频的占用,大小会降低非常多。

  Sofdect2在处理音频轨道时,沿用了ADX2中对音频的压缩格式ADX以及HCA,这两个压缩格式是CRIWARE独有的两个压缩方式,在cpu和内存的占比上以及多个音频轨道播放时有着非常显著的优势,因此除了节省了视频的量外,在音频的压缩上也具有一定的优势。

  Sofdect2还支持5.1声道的音频轨道,如果希望视频的声场不仅仅是双声道,那么采用Sofdect2并添加5.1声道的音轨,可以做到5.1声道效果播放,是的视频和音频的沉浸感大大加深。

注:当视频的播放方式是Loop时,需要注意音频和视频的framerate一定要相同,并且具有相同的时间,否则在循环播放上会让声音和视频逐渐错开。

 

3)、多语种字母

  多语种字母类似于多语种语音,是针对不同语种不同字幕制作。类似于多语种语音,Sofdect2中将字母和视频分开有效的让程序控制字母的选择,可以使得多字母对应一个视频。极大的降低了包的大小。

5c04ca3ee3b00.png

 

  如上图所示,可以进行字母的导入。

  在Sofdect2中导入的字母可以使用“Subtitle Workshop”等字母软件制作,同样也可以使用TXT直接导入。

5c04cabc86be2.png

 

  如图所示,第一行“;”开头的表示注释。

  第二行1000表示1秒的长度。

  第三行0,16560表示从0秒开始到16.56秒显示字幕“First Message”。

  使用这种格式可以直接在txt中抒写,非常方便的导入到Sofdect2中。

  注:这里要提前说明一下Sofdect2在字幕的显示上,并不会和专业的字母软件一样,显示在视频的中下部,在Sofdect2中当我们压缩完毕进行预览的时候,字幕会专门显示在如图的位置:

5c04cbc67b8cd.png

  这是因为Sofdect2的主要功能并非字幕的制作,而是字幕多语种的调用,对于字幕的定制都需要自己进行定制,如字幕的颜色,字体大小,字体格式等等。

 

4)、Alpha通道视频

  Alpha表示透明通道,Alpha通道视频则是指具有透明通道的视频,Sofdect2可知支持压缩具有透明通道的视频。

  要注意的是只有视频格式中的Color bit是32时,才能正常的进行Alpha视频的压缩。

  这里笔者为各位看官简单的制作一个具有Alpha的视频,并将其压缩,对比。

  首先需要准备一个视频,AE软件。

  第一步:打开AE软件,并且点击从素材新建合成,选择需要增加Alpha的视频。

5c04cdea940c7.png

 

  此时正常导入视频。

  然后再在最下方视频编辑栏中点击三角下拉,找到不透明度,在合适的位置勾选,然后再根据各位自己的需要,移动右侧游标并更改不透明度,这样整个视频的透明度就会根据我们的设定而发生变化。

5c04cef27fcd2.png

5c04ceffc9546.png

上述完成后,点击文件-导出-添加到渲染队列

5c04cf786ca4d.png

  再在最下方的输出模块中点击“无损”打开设置界面

5c04cfc687b8e.png

  在打开的设置中改变视频输出到RGB+Alpha点击确定。

5c04d0274452e.png

  然后回到主界面,确保下方的视频渲染部分拥有正常的导出位置,并勾选需要渲染的视频,点击渲染,渲染完成后一个具有alpha的视频即可完成。

5c04d0c065860.png

  这里插入一个对比,当我们使用AE渲染视频后,该视频的大小将会非常大,因此我们采用Sofdect2进行压缩,压缩前后的体积大小如图所示:

5c04d1f7b04bd.png

  进行压缩前大小为1.2G压缩后仅仅16M,主要因为我们导出的格式时RGB+Alpha并且无任何损耗,所以体积太大。

  将压缩完的视频使用Sofdect2进行压缩,在步骤2中就能看到Alpha的通道已经可以进行勾选了,然后也可以看到相关的color bit为32。

5c04d2b665a03.png

 

  当勾选了了Alpha Movie时,将会正常的压缩Alpha视频并附带有Alpha通道。

 

5)、Cue Point

  Cue Point为Sofdect2在压缩视频时,给予视频的一些特殊的事件触发点,也成为Event Point。

  我们可以在视频压缩前定义一系列按照时间进行触发的Cue Point并且在视频压缩时将其附带在其中,当视频在播放时,每到达一个Cue Point都会发送一个事件,使用调用事件名称相符时就能触发你所定义的行为。

  那么这个功能使用在什么地方呢?

  我们假设一个游戏中拥有一个液晶显示电视,该电视在3D场景中,对于沉浸式游戏体验和生活常识,该电视无论视觉方位还是声音方位都应该式3D世界中的具体位置。

  假设该电视播放的视频我们仅仅使用视频功能进行播放,那么结果会是什么样呢?

  结果自然是视觉式3D的正常位置播放,但是声音永远是2D效果,那么他会与我们的BGM,环境音效等一系列音效产生不好的影响。因为视频的播放永远是一个面,无法采用3D的形式。

  此时我们引入Cue Point,让Cue Point触发事件,事件用于播放3D位置的音效,如此一来,完全可以使得声音也正式成为3D效果,与我们希望的表现符合。

  Cue Point的应用也极其的简单,无需任何的技术基础。

5c04d51bc151b.png

如图所示,第一行为注释

  第二行为1秒的长度

  第三行表示在0秒触发一个名为Music且值为1的事件

  同理,第四行表示10秒触发一个名为Foosteps且值为1的事件。

  Cue Point的导入也极其简单,如图所示,只需要在step2中选择需要导入的Cue Point即可。

5c04d5e6ae8bb.png

Cue Point的主要作用用于触发事件,并不仅仅是利用于音频触发,只要需要在视频播放到某个事件触发任何事件Cue Point都可以应用,其用法宽度很宽,主要看用户该怎么使用。

  Cue Point音频触发可以进一步降低视频本身的大小,因为完全可以不包含音频,当视频中的音频可以使用游戏内音频进行复用时,完全可以使用Cue Point进行触发。

  以上便是Sofdect2的简介,它不仅仅是一个进行压缩的工具软件,还可以使用多语种字幕,多语种音频,Alpha以及Cue Point等功能,大大的方便游戏开发。

 

2、Sofdect2的使用步骤

  Sofdect2的使用极其简单,在其压缩软件中仅仅使用8个步骤就可以完成压缩。

1)第一步:平台选择

  选择需要的平台,平台的选择主要涉及到部分压缩格式的适用性。

5c04d944c70e7.png

2)、第二步:文件设定

  文件设定中需要选择需要压缩的文件,压缩的格式(Prime,H.264,VP9),需要的Cue Point以及是否是Alpha视频。

5c04d9e04a0b3.png

3)、第三步:选择语音

  选择语音中可以使用制作的视频本身附带的语音,只需要选择一个track,并且勾选上“use audio included in the video file"。

  或者点击右上角的增加符号选择新的语音。

  音频的压缩格式可以进行选择,有ADX和HCA两种,ADX相对压缩较小,但是Cpu负载比较小,HCA压缩较大,Cpu的负责也较大。

5c04dad25f483.png

4)、第四步:选择字幕

  选择字幕可以使用已经完成的字幕TXT,进行导入,只需要点击右上角的增加符号选择字幕即可。

5c04dbe51cb06.png

5)、第五步:设定压缩质量

  在第二步中选择了压缩格式,此步骤可以根据压缩格式选择相应的压缩比等,系统给定了5个不同级别的压缩质量可以使用。或者也可以自行设定。

5c04dc5f87c0c.png

6)、第六步:选择输出位置

  完成了上述设定后基本设置已经完成,可以在本步骤中选择输出的位置。

5c04dc9910e03.png

7)、第七步:确定相关设定

  可以在本步骤中根据系统提供的信息确定是否符合你的压缩标准。

5c04dcd872905.png

8)、第八步:完成压缩并预览

  确认好各项信息后可以在本步骤中进行压缩,点击Start即可进行。当成功压缩后,系统会提示Complete。

  并且支持直接预览功能,点击“PREVIEW”即可预览。

5c04dd5dbb33b.png

注:预览中的相关说明

  预览中有Audio Track,其表示正常的音频轨道,如果播放任何音频,该轨道需要开启。若该轨道关闭则不会有任何声音。

  “Voice Trace”,其表示语音音频轨道,适用于不同语种的语音播放,在预览时可以进行切换以便于测试各个track的语音是否正常播放。

  “Subtitle Ch”其为字幕的通道,字幕由于多语种,因此我们可以进行字幕的切换,切换字母后,显示会显示在view的下方“Subtitle”中。

5c04deef2e87f.png

以上便是Sofdect2的基本使用步骤和相关说明,下面我们将Sofdect2集成在Unreal4做一些比较有趣的事情。

 

2、Sofdect2在Unreal4中的集成和有趣实例

  第一部分:集成

  ADX2在Unreal4的集成极为简便,在ADX2官方下载ADX2和Unreal4相关SDK后找到如下的路径:

5c04e05ccf3cc.png

Unreal4中新建一个工程,并找到该工程的路径如下:

5c04e07a6442a.png

找到上述两个路径后,将ADX2中的UE4/Engine下所有文件夹复制到工程文件目录下,如下图:

5c04e0900a3a0.png

 

注意:一定要复制到工程目录下,不要复制到Unreal4的安装目录下。

复制完成后从新启动Unreal4工程就会进行自动编译,编译完成后集成部分就完成,可以进行下一步的设定。

注意:如果Unreal4的工程创建为蓝图版本,且中间没有添加过自定义的C++Class,那么此时编译会出现问题,导致工程无法打开。

解决方法是:集成前在Unreal4的工程文件下创建C++Class,创建完毕后重新开始集成步骤,重新打开工程后就会顺利的自动进行编译。

  完成上述操作后,需要在Unreal4中设定mana的初始化,在Unreal4中找到项目设定:

5c04e15e3d91e.png

找到“插件”下的“CriWare”,点击后进入初始化设定。

5c04e17131ac4.png

找到mana相关,勾选“initialize mana”选线即可,如果需要更改相关限制数量等可以在如下的图中进行设置。

5c04e2886e0d7.png

  设置完成后重启编辑器即可完成正常的集成。

 

第二部分:应用和实例

  我们完成了Sofdect2在Unreal4的集成,下面就可以进行实际的应用了,笔者主要以3D场景视频播放,Alpha通道动态应用,Cue Point动态触发以及UI界面视频应用4个方面进行说明和展示实例。

1)、3D场景视频播放

本场景和上篇ADX2的说明使用统一场景,笔者在本场景中放置了一个餐馆,为了让餐馆看不起来比较诱人,笔者从网上下载了相关的美食节目,并使用Sofdect2进行相关压缩和设定。

5c04e9f960916.png

  如图所示,在餐馆正门的正上方有一个电视,电视中可以进行播放美食节目用以吸引顾客。

  为了二达到这一目的,电视我们分成了2个部分,一个为外框,一个是正式的屏幕。

5c04eae08ee19.png

  对于外框部分,是常规的3D场景盒体,切去了中间的部分。

  屏幕的制作方式如下:

  我们首先在shape中选择一个,并且将其转化为蓝图如图:

  

5c04ebbc2237c.png

  将蓝图拖动到场景中,调整其大小至适配与外边框。

  我们再将使用Sofdect2压缩完成usm文件拖动到unreal4的内容浏览器中。

5c04ecdbe0a83.png

  右键导入的usm文件选择转化为texture

5c04eed28e118.png

  再右键点击转化的texture选择Create Material,将其转化为材质如图:

5c04ef5f66ec4.png

  转化完成后,我们的视频基本转变就完成了,让我们回到蓝图界面。

  在蓝图界面我们点击创建的staticmesh,在细节中选择其material为刚才我们创建的material如图:

5c04f03488e82.png

  完成后,在蓝图的组建部分我们增加一个mana commponent,用以播放相关视频,如图所示:

5c04f082655d4.png

  条件完成mana commponent后,我们选择mana组建,在细节中设置其texture如图:

5c04f10ea5e04.png

  完成上述步骤后,基本创建已经完成,下面我们需要对其进行播放触发,回到蓝图,我们打开其事件部分,作如下的蓝图逻辑:

5c04f16a3eadc.png

  此时播放逻辑已经完成,让我们进行编译,编译完成后运行,就可以看到们的视频正常播放了。

5c04f21ba3659.png

  此时视频就会依照我们之前录制或者制作的方式进行播放了,我们还可以创建Loop播放,顺序播放等,这就要各位看官自行制作了。

 

2)、Cue Point触发

  上文中我们讲解过Cue Point的触发,也知道如果视频中包含音频的结果会使得整个音频处于2D,我们无法在游戏中由于听者和发声体的位置和朝向感受到音频变化。

  其次看过上篇文章的读者应该会记得,在餐馆中我们使用了ADX2的快照功能(Snapshot),用于在餐馆中听到空间回响效果。

  而如果我们在视频中使用加入音频则会使的音频不会在进入整个空间产生混响效果,因此我们也会采用Cue Point进行触发,触发后播放3D音效效果。

  因此我们在Sofdect2的压缩过程中去掉“use audio included in the video file",将其音频取出导入到ADX2中。

5c04f408bbd6a.png

我们完成的Cue Point如下,因为是整个音频完全替换,因此我这里只需要在开始的播放一个音频即可

5c04fe79e8fa7.png

  回到我们的Unreal4中,之前我们设定的蓝图已经完成了基本的视频播放,此时我们需要根据Cue Point的事件来触发音频播放,我们在Unreal4的蓝图中做了如下的逻辑:

5c04ff2d52e06.png

  如上图所示,我们添加了自定义事件,并且将其绑定到mana的event Point上,将事件的信息进行拆分,当事件的名称和Audio完全一致时,将会在staticmesh的世界坐标上播放一个名称为Alpha_Food的3D音频。

  如上逻辑完成后,再运行我们的游戏,发现声音能够正常成为3D效果了的,并且进入到参观内,音频也会产生混响效果了。

  注:想产生混响效果需要再ADX2中启用相关总线效果,实际做法参考上一文章

  http://gad.qq.com/article/detail/288415

  再例如有一个视频是一个球从左向右弹过,我们希望球落地的效果需要根据实际游戏方位和听者产生声场变化,因此也使用Cue Point触发方式播放3D音频。

  如图所示为笔者自己制作的一个简单动画,一个小球会从左向右弹跳过去。整个视频的3D大小相对玩家角色来说较大,因此为了突出表现球的弹跳效果和玩家之间的位置关系,特地使用了3DSound。

5c05f99c0e738.png

  而我们的Cue Point写法则如下图:

5c05f9f739e03.png

  分别再8帧,16帧和24帧给定一个触发的Cue Point,之后一旦到达触发点,我们就将3D声音放置再小球落地点以表现小球落地效果。

  由于声音为ADX2做成的3D Position效果,因此无论我们怎么改变玩家角色位置,每个小球的落地点声音和玩家之间都会有正确的声相摆位效果。一个由2D视频产生3D声音效果的实例即可完成。

  具体蓝图如下:

5c05fb20675db.png

  相交于前一个,蓝图变得稍微复杂了,这是因为我们需要对不同的Cue Point进行验证,只有符合名称的才能在正常地点播放,其次我们还需要将正确的声音播放地点明确给各个声音,因此再staticMesh的基础地点上,进行了部分增减坐标。
  Cue Point的作用是再视频播放的时候进行事件触发,因此拥有非常大量的用法并非一定局限于3D音效播放,例如场景变化等都可以跟随视频播放而发生变化。所有的用法都可以和事件触发相结合,具体能达到的效果要看各自的发挥了。

 

3)、UI界面应用

  经过Sofdect2压缩的视频可以用于界面中。

  例如界面上我们希望其背景是一个动态效果,那么此时我们可以利用视频做出一个动态效果,让其作为界面的底图循环播放,这样只用单纯的播放视频,不用额外添加任何动作,特效等使得逻辑复杂而且难于表现。

  界面上添加视频的方式能大大降低开发难度,很多不易实现的界面特效,界面动画等完全都能够使用视频的方式播放。

  如图所示,笔者使用Sofdect2压缩了一个具有alpha的视频并将视频相关于界面之上,当按下按键后界面将会出现,由于视频的左右,界面的底图为动态游动的鱼,效果可以做到alpha的透明效果。整个只需要一个视频加一些脚本蓝图逻辑即可实现。

 

5c061e8a77a18.png

  如上图,整个界面有3个对话,再对话的底层是一张动态视频的UI图,鱼会在底层不断的游动。底图由于是视频附带有alpha通道,因此产生了透明效果,可以看到部分真实3D场景。

  注:视频用在界面上拥有众多的用法,例如一般游戏的技能展示,完全可以使用Sofdect2压缩后的视频进行直接展示,不需要动态的调取。

    再例如一些图片的四周需要有动态效果边框,此时也可以利用Sofdect2使用视频和alpha通道再图片周围添加视频特效,以此来达到最终的目的。

  说明完毕实例后我们来说明如何再Unreal4中制作上图的动态视频UI。

  首先按照之前讲述的方式将Sofdect2压缩完成的usm文件导入到Unreal4中,并将usm文件转变为texture文件,以备用。

  之后让我们再Unreal中创建一个界面的控件蓝图,如下图:

5c062042dc532.png

  创建完成控件蓝图后将其打开,在控件蓝图中创建一个image用于视频texture。如下图所示,需要在创建的image上选择我们刚才导入并转换完成的视频texture。

5c06216136626.png

    如此一来我们的界面制作已经完成,下面需要设定其UI界面的打开以及视频的播放。

  让我们打开关卡蓝图如图:

5c0621c143626.png

  在关卡蓝图中作如下的蓝图逻辑:

5c062367bc200.png

  这里我们添加的manan Component需要对其进行设置为循环,以保证我们界面打开的时候正常循环播放。

5c062374a4faf.png

  需要注意的是我们使用usm文件转化而来的texture的“Render to texture”需要被勾选,否则可能会无法正常播放视频。如图:

5c0623ebbfc5b.png

  上述蓝图表示的是,当我们按下回车键时将会创建一个UI,并在其上播放mana视频,当松开回车键后,UI界面将会不再显示并且视频将会被清除。

  如此一来我们完成了一个以视频为底图的动态界面的制作。

 

4)、Alpha动态应用

  Alpha动态应用是利用Sofdect2可以压缩播放alpha视频而衍生的在游戏内通过控制alpha的大小来动态的更改视频的透明度,以此来和游戏玩法相结合,动态的变化视频表现。

  笔者在Demo场景中设计了一个隐藏的球,玩家需要寻找到该球的位置并进行触发,才能将其获得。为了给玩家一定提示,笔者设置了一个视频展示放在3D场景中,而该视频的显示会有着随着时间变化透明度的效果,玩家必须要等到规定的时间方能看到清晰的视频,以此来获得提示。

  为了能让视频的透明度得到动态的控制,我们需要做一系列的蓝图准备。

  首先需要打开我们以usm构建成的Texture,打开会我们会看到其贴图的基本构成逻辑,在贴图中我们做如下的逻辑,添加Multiply,以及Vectorparameter,让基础的Alpha和我们新增的参数相乘,以此动态的改变我们的Vectorparameter来改变最终的Alpha值,控制透明度变化。

5c06293b061d5.png

 

  完成上述蓝图构建后,基本材质已经准备完毕,下面需要对视频蓝图做动态材质调取。

  首先需要在蓝图的脚本上创建动态材质的调取,主要时脚本上创建,而非事件上创建。此外需要将动态材质输出函数用于事件调取,如图:

5c062d13bbd1c.png

  完成脚本设置后,回到蓝图的事件图标,开始制作随时间变化Alpha的动态透明度效果,蓝图如下:

5c062d7bd9ac9.png

 

  如图所示,Dynamic Meterial为动态材质的随意命名,与前一个图中的设置对应,即前一个脚本中设置动态材质参数,后一个图中在事件中调取并加以改变。

  对于时间轴的应用是笔者将动态改变Alpha用于随时间变化上,因此做了如下的变换函数曲线,并加以循环:

5c062e714787b.png


  如此一来视频的Alpha值就会随着时间变化,不断的更改视频的透明度,达到动态变化的目的。

  除了时间变化外,看官可以根据自己项目所需要自定义任何变化方式以及变化曲线来变更Alpha的值,以此和玩法相结合,使得流程更加简单,效果更加出众。


三、结语

  Sofdect2不仅仅是一个压缩视频软件,它所提供的多语种字幕,语音,5.1声场支持,Alpha视频支持以及Cue Point能够为我们的游戏开发提高效率并达到更好的效果。

  在视频的应用上,我们也不仅仅可以将其运用于过场动画,包含特效,界面底图,各种高清效果展示等都完全可以利用Sofdect2应用在各个平台上。

  视频效果的额展示必定会有更优异的效果,以此来提升整个游戏的表现。

  在与Unreal4的集成和应用中,也有着完备的蓝图

 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK