Mac中的bogon名字修改

前些天本子送到苹果天才吧修理,不知道被弄了什么法术,导致系统崩溃,回来后用时间胶囊恢复的系统数据,用着用着发现终端里的计算机名是bogon了,这是什么鬼?

于是网上搜了搜,大概是终端会向DNS服务器查询本地IP的什么解析,如果没查到就会显示计算机名,而DNS错误将保留地址反向的NS查询结果返回了bogon,而bogon本该用来标定虚假的IP地址,而非保留IP地址.所以计算机名就成了bogon了.

如果计算机名是bogon,那么只要在系统偏好设置里面打开找到”共享”,在此窗口的上方可以修改”电脑名称”.

如果是终端里显示bogon,像下面这样:

bogon:~ username$

可以直接用下面这个命令修改,将newhostname替换成想改的名字即可:

scutil --set HostName newhostname

执行后建议重启系统后再使用.

AR中的阴影镂空,蒙板处物体遮掩,蒙板处物体显示等

我们在做AR(增强现实)的时候,有几种效果需求会遇到.

1:阴影镂空
通过成功识别Marker(花朵背景),在Marker位置生成立方体模型,为了效果逼真,我们需要立方体模型产生个阴影投影,默认情况下我们只能用其它模型来接受立方体的阴影投射,Marker模型在Play时是不能用于接受立方体阴影的,我们把接受阴影的Plane模型进行处理,让它仅保留投射的阴影部分,其余部分镂空,这样再与相机画面叠加就会产生一个较逼真的阴影效果了.

把下面的shader赋予给接受阴影的模型即可完成阴影透明镂空效果,图中黑色阴影其实是原本的Plane,与Maker无关.

Shader "FX/Matte Shadow" {
 
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
 
SubShader {
 
    Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    LOD 200
    Blend Zero SrcColor
 
CGPROGRAM
 
#pragma surface surf ShadowOnly alphatest:_Cutoff
fixed4 _Color;
struct Input {
    float2 uv_MainTex;
};
inline fixed4 LightingShadowOnly (SurfaceOutput s, fixed3 lightDir, fixed atten)
{
    fixed4 c;
    c.rgb = s.Albedo*atten;
    c.a = s.Alpha;
    return c;
}
 
void surf (Input IN, inout SurfaceOutput o) 
{
    fixed4 c = _Color; 
    o.Albedo = c.rgb;
    o.Alpha = 1;
}
 
ENDCG
}
 
Fallback "Transparent/Cutout/VertexLit"
 
}

2:蒙板处物体遮掩

黄色模型为蒙板,其它模型凡是被蒙挡的地方都不渲染,就像布尔减去黄色模型一样,这个效果可以用来做什么呢?比如说做了人脸识别,要给相机图像中的角色戴副眼镜,如果没有用蒙板遮挡,那么无论相机画面里是侧脸还是正脸都将看到完整的眼镜,这与现实不符,现实中侧脸的时候我们只能看到视距较近的眼镜腿,另一侧眼镜腿应该被脸部遮挡,而我们取的相机画面,它是2D平面的图像,不能自动帮我们进行正确的显隐,所以我们要做一个适当的头部模型作为裁切蒙板即替代黄色模型来把不应显示的部分遮掩掉.

只需将下面的shader作为材质球赋予给希望作为蒙板的模型即可.

Shader "DepthMask" {
   
    SubShader {
        // Render the mask after regular geometry, but before masked geometry and
        // transparent things.
       
        Tags {"Queue" = "Geometry-10" }
       
        // Turn off lighting, because it's expensive and the thing is supposed to be
        // invisible anyway.
       
        Lighting Off

        // Draw into the depth buffer in the usual way.  This is probably the default,
        // but it doesn't hurt to be explicit.

        ZTest LEqual
        ZWrite On

        // Don't draw anything into the RGBA channels. This is an undocumented
        // argument to ColorMask which lets us avoid writing to anything except
        // the depth buffer.

        ColorMask 0

        // Do nothing specific in the pass:

        Pass {}
    }
}

3:蒙板处物体显示

这个蒙板默认情况下会将它所覆盖的所有对象都裁切掉,可谓杀的毫无痕迹,如果我们用Unity内置的相机纹理贴到模型上作为图像背景的时候,它同样也会被蒙板扼杀掉,而我们不喜欢它被挖空,所以要针对它进行处理,让这部分不受蒙板影响.

把下面的脚本挂接到任何不想被蒙板影响的对象上,如我们挂到蓝色模型上,脚本有个暴露的变量,我们将RenderQueue设置比蒙板shader的RenderQueue数值小的值,在Play时,蓝色模型就可以无视蒙板.

using UnityEngine;

[AddComponentMenu("Rendering/SetRenderQueue")]

public class SetRenderQueue : MonoBehaviour {

	[SerializeField]
	protected int[] m_queues = new int[]{3000};

	protected void Awake() {
		Material[] materials=this.GetComponent().materials;
		for (int i = 0; i < materials.Length && i < m_queues.Length; ++i) {
			materials[i].renderQueue = m_queues[i];
		}
	}
}

资料参考:
http://mec0825.net/blog/?p=126
http://wiki.unity3d.com/index.php?title=DepthMask

Mac下通过命令行设置Finder显示隐藏文件

前几天一直因为有机器人发垃圾评论而忧伤,雨松momo说用了网易云跟贴插件挺好,我便搜了搜,发现评论的数据都保存在了网易的服务器上,觉得不靠谱,就没有再深入查下去,但是有看到网易推出了类似于垃圾评论云识别服务,费用不低.没几天就收到网易的邮件,说云跟贴服务将于8月1日停止服务,对带来的不便表示歉意,我就呵呵了.

昨天开哈雷去了趟密云,往返200公里,来回都被雨浇了个透心凉,在电视剧”彼岸花”里客串了一把外国地痞小流氓,有点意思,拍戏确实很累.

言归正传,在Mac终端中输入下面命令是显示隐藏文件:

defaults write com.apple.finder AppleShowAllFiles -bool true 

输入下列命令是不显示隐藏文件:

defaults write com.apple.finder AppleShowAllFiles -bool false

执行完命令后,重启Finder才有效,确定当前Finder窗口为焦点时,直接点击右上角苹果菜单,按下Shift键就会看到强行退出Finder命令了,别担心,退出了它自己会自启.

午夜该睡觉了,安了各位.

NGUI解决鼠标穿透问题即判断当前是否在控制UI

在开发中,时常会遇到界面和叠加界面上其它对象操作冲突的问题,举个简单例子做一个地球仪,用鼠标控制地球仪旋转,同时在屏幕上又用了ScrollView视图当用鼠标去拖拽ScrollView视图中的内容时,地球仪也随着旋转了,我们需要解决这个问题.

一般来讲,如果界面固定(在屏幕下部等),省事的做法就是把菜单区和地球仪控制区进行划分,使用 Rect.Contains(Input.mousePosition) 进行鼠标位置的判断,在地球仪控制区就控制地球旋转,在菜单区就响应菜单暂时禁用地球旋转控制.

而界面相对复杂或者位置动态变化等,上面的方法用清楚就比较麻烦了,好在现在的NGUI版本提供了一个方法,可以非常渐变的判断鼠标或手指是否在界面上,如果是即返回true.

UICamera.isOverUI

直接用在要进行判断的代码处就好,比如在地球旋转控制条件中加上”&& !UICamera.isOverUI”,如果鼠标或手指在UI之上时,就不执行控制地球旋转的代码,要注意的是UI组件上要含有碰撞器才会被检测到.不建议放在Update中不停的监测状态,这会相对增加资源消耗,在满足一定条件下再去判断是否介于UI之上比较好,如Input.GetMouseButton(0)时再”UICamera.isOverUI”后进行执行与否的代码.

CentOS下用crontab设置自动重启MySQL计划(2)

之前写了一篇在每天凌晨2:30重启一次MySQL的文章:http://1vr.cn/?p=1818,用了一段时间感觉没什么异常,但今天又出现了数据库非正常关闭,真是头疼,看了下日志(终端输入:tail -f /var/log/mysqld.log),时间还在在2:30之前,不知道什么异常导致,看来有时间还是要彻底查查原因.

170703  0:41:54  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 0 22991466
170703  0:41:54  InnoDB: Started; log sequence number 0 22991466
170703  0:41:54 [Note] Event Scheduler: Loaded 0 events
170703  0:41:54 [Note] /usr/libexec/mysqld: ready for connections.

在彻底查到原因之前先打个速效针吧,找了一段bash shell脚本,判断mysql服务的状态,如果没有运行,则重启mysql.

脚本放哪无所谓,能找到就行,用”vim /etc/checkmysql.sh”创建个新文件,名为checkmysql.sh,放在了etc目录下.

#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo "Time: `date` :MySQL is over .">> /var/log/mysql_messages
service mysqld start
else
echo "MySQL server is running."
fi

输入”:wq”保存并退出文件,测试一下文件效果,使用”./checkmysql.sh”或绝对路径”/etc/checkmysql.sh”,可以当前Mysql状态,如已停止,那么尝试启动它.如果脚本文件权限不对,改它权限为655,命令是”chmod -R 655 checkmysql.sh”.

接下来我们需要定时的执行这个脚本,让它帮助我们监测mysql状态.还是用到了crontab,之前的文章里有比较详细的用法,这里简单说明,我要做的是让脚本3分钟执行一次,那么打开crontab编辑(命令:vim /etc/crontab):

井号注释掉之前的每天2:30重启任务,添加下面这样

*/3 * * * * root /etc/checkmysql.sh

“*/3″代表每间隔三分钟执行一次,如果你要五分钟执行一次,那就是”*/5″喽.

保存后重启crontab即可(命令:service crond restart),如果你要测试效果,可以service mysqld stop,几分钟后看mysql是否自启.

原创文章,转账请注明来自 http://1vr.cn,By XK.

NGUI的Scrollview自动布局及手动布局Reposition

在处理NGUI的Scrollview滚动视图动态添加及自动布局的事情,遇到了一些问题以及弄清了一些问题,写在这,方便他人.

有关Scrollview动态添加,拖拽到Scrollview尽头时动态的添加一批新的item项,网上查了一下,就和在百度上查”如何去除衣服上的水晶泥”一样,都是一水的模板式回答,毫无用处.别鄙视我用百度,没办法,不翻墙的情况下,搜中文关键字,百度比bing强点,英文的,那拜拜百度吧.

回到正题.先说动态添加,其实一般就是初始化prefab到场景,然后置其父对象为Scrollview就可以了,而NGUI提供了更直接的命令,就是:

NGUITools.AddChild(父对象,预设体);

它直接就把预设初始化并放在父对象下级了,省去了若干麻烦(初始化,位置,尺寸等等等).

拖拽到Scrollview尽头时动态添加新项,那我们要知道什么时候到了尽头,得到”已到尽头”的这个状态就可以用上面的AddChild添加新的item项了.可以把UIScrollView.onDragFinished事件委托过来,当Scrollview发生拖拽时它会执行一次AddChild,如果不加其它条件判断每完成一次拖拽,就会添加一次新项.

	void OnEnable(){
		UIScrollView.onDragFinished += OnDragFinished;
	}

	void OnDisable()
	{
		UIScrollView.onDragFinished -= OnDragFinished;
	}

	void OnDragFinished()
	{
		NGUITools.AddChild(父对象,预设体);
	}

当然这并不是我们要的,拽一次就添一次太可怕了,我们只是想拖拽到Scrollview尽头时添加,那有个简单的办法,在Scrollview组件上有ScrollBars设置,如果你需要滚动条就按自己设计添加个滚动条,如果不需要滚动条,那么你就随便添加个Sprite再给它添加个UIScrollBar脚本就行了,看心情把它”隐藏”起来,我们这里主要用ScrollBars的值,在你想要判断拖拽位置的方向上对应取值就好,比如你要鼠标往左滑Scrollview到尽头添加新项,那就给Scrollview的ScrollBars中的Horizontal赋个ScrollBar控件就好.

然后我们脚本里取ScrollBar的value值,到某个值的时候,进行添加新项,如下:

void OnDragFinished()
	{
		if(UIScrollBar.value>0.9f){
			NGUITools.AddChild(父对象,预设体);
	}

搞定了动态添加,我们来说说布局的问题,NGUI提供了两个布局脚本(Grid,Table),像画田字格,设定好参数后,布局脚本下面的item项都会按格子依次排列好,不用再苦x的码位置了.这两个布局脚本都支持在行和列的方向上有规律的布局,差别在于Grid是固定宽高的单元格,无论格子里内容是什么,Table有点像HTML里面的Table,你可以设置单元格间距,但是它受格子里内容影响,如果一列中有个单元格里的内容特别宽,那整列都将是这个特别宽的宽度.看文字比较难理解,自己动手比划一下就清楚了,因为我也是动手比划弄清楚的.

我想要横着的ScrollView,三行Item,鼠标左滑到尽头自动添加新项,所以我选用了Grid,在Arrangement中选用Vertical对齐方式,RowLimit设置为3,以及根据需要设置单元格(Cell)宽高,可以随意扔一些Sprite到Grid子集,Play一下,就可以看到自动布局的结果了.

当我们用NGUITools.AddChild(父对象,预设体)时,Grid并不会自动布局,它在等我们发送指令,手动布局的命令发出后,Grid将进行一次布局,帮我们将现有的item项排列的整整齐齐.这个指令是什么呢?有两种,如下:

UIGrid.Reposition();
UIGrid.repositionNow=true;

AddChild后,上面的指令任选一条执行一次就完成了布局,那么你也一定像我一样好奇它们两个的区别,其实他们也没什么太大区别,两条指令执行后,最终都是执行Reposition(),而repositionNow这个变量赋值后,Update中会判断它是否为真,为真则执行一次Reposition(),也就是说UIGrid.Reposition();是马上进行排序布局,而UIGrid.repositionNow=true;是在执行后,Update进行下一帧时进行排序布局,接着NGUi会将repositionNow重置回false.具体用哪一个,看你自己了.

另外有些教程用到了”NGUITools.SetDirty()”,字面理解是标记当前对象已经更新让Unity理解刷新状态什么的,但是在这个环节用它和不用它我没看出区别,有了解详情的可以评论里指教一下.

今天就到这里,晚安!

原创内容,转载请注明来自 http://1vr.cn , By XK.

UNITY开发VR眼镜中文入门教程(8)

VR开发阅读列表

 

下面是VR开发的资源阅读列表,我们将定期更新,因为这是一个新的媒介,我们会让你及时的获取到最新的信息.

UNITY 中心

Unite VR 会议

Unity在全世界每年都会举行一次Unite会议(unity3d.com/unite),并且对许多主题进行很深度的讨论,包括虚拟现实.

这里是最近Unite会议有关虚拟现实的议题:

Unite 欧洲 2015

Unite 波士顿 2015

OCULUS

Oculus Connect

Oculus(https://www.oculus.com/en-us/connect/)每年举行一次会议,他们让来自世界各地的创意人员,设计师,工程师了解Oculus平台并推动虚拟现实发展.这是在Youtube上的开发者会议播放链接:

维基百科

其它

 

原文:http://unity3d.com/learn/tutorials/topics/virtual-reality

由 四角钱 (XK) 翻译,转载请注明来自 http://blog.1vr.cn

UNITY开发VR眼镜中文入门教程(7)

优化Unity中的VR

 

简介

 

为确保用户有极棒,无恶心的虚拟现实体验,而达到推荐帧率,优化是很关键的一个部分.因为现在VR硬件刚刚起步,所以要尽可能多的在硬件设备上进行测试.

VR相对于非VR项目的主要不同点就是它要为每只眼睛渲染一次图像,当你了解这一点,创建项目时围绕它进行相关优化将节省大量的开发时间.

手机上的配置远比不上桌面级电脑硬件,所以在移动设备上的VR做优化是至关重要的.

当然不要忘记要尽可能的优化程序代码,查看有关代码优化更详细的指导:”docs.unity3d.com/Manual/MobileOptimizationPracticalScriptingOptimizations.html”.

OCULUS 资源

 

在Oculus网站上有大量的资源文档,非常值得你去看:

https://developer.oculus.com/documentation/

http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/

UNITY 编辑器优化工具

 

在Unity中有一些很有用的工具和技术,有助于您优化VR游戏内容.

Profiler

 

Profiler可以帮你了解每一帧渲染的时间,并且将其拆分为CPU,渲染,内存,音频,物理和网格.通过使用Profiler检查性能消耗从而针对性的优化.更多关于Profiler的使用请参阅这些链接:

http://docs.unity3d.com/Manual/Profiler.html

https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/profiler-overview

https://unity3d.com/learn/tutorials/modules/intermediate/editor/intro-to-profiler

Frame 调试器

 

Frame调试器步进式的查看每帧Draw Call,看每帧是如何构造出眼前的场景的,确定哪些可以优化,哪些是不需要的东西,这将大大有助于减少Draw Call.

更多Frame 调试器的信息请参阅下列链接:

http://docs.unity3d.com/Manual/FrameDebugger.html

https://unity3d.com/learn/tutorials/modules/intermediate/graphics/frame-debugger

VR优化原理

 

虽然优化是个巨大的门类,每个平台,每个需求都会有不同的优化方法.

现有的优化技术可以很好的用于VR项目开发优化

Geometry

移除VR中任何看不到的三角形,比如如果用户看不到后背,纳闷我们完全可以把角色模型后背的三角面和贴图删除优化掉.另外根据目标平台,试着添加一些细节纹理,比如视差贴图等,虽然这会影响到性能,但是也许它非常适合在特定的目标平台.

Overdraw

Overdraw视图让你可以了解什么对象被绘制在了另一个对象上面,这种无谓的渲染会浪费GPU渲染时间,通过场景视图中(docs.unity3d.com/Manual/ViewModes.html)开启Overdraw模式查看场景中的覆盖情况.

1_overdraw-menu

普通视图模式:

2_normal-shaded

Overdraw 模式:

3_overdraw

Level of Detail

Level Of Detail (LOD) 可以让你根据模型物体与相机的距离动态的切换物体三角形面数,只要你的模型距离相机有一定距离,LOD会显示一个低面数的模型来减少对硬件的负载,提升渲染性能.

4_lod0

 

Simplygon(https://www.assetstore.unity3d.com/en/#!/content/10144) 插件可以自动化处理模型的LOD.

Draw Call batching

尽可能的将Batch Draw Call,使用

Static Batching 和 Dynamic Batching会大大提高性能.详见Unity手册

Draw Call Batching(docs.unity3d.com/Manual/DrawCallBatching.html).

Lightmapping

减少动态光照使用,增加烘焙照明,避免实时光影,详见

avoid realtime shadows(https://twitter.com/ID_AA_Carmack/status/592385473894461441)和  Lighting and Rendering(unity3d.com/es/learn/tutorials/modules/beginner/graphics/lighting-and-rendering) .

Light Probes

Light probes (docs.unity3d.com/Manual/LightProbes.html) 可以让烘焙光照的场景中动态对象的动态光照实现出来,这个运算很快,但是经常会有很大视觉效果提升.

Reflection Probes

Reflection probes (docs.unity3d.com/Manual/class-ReflectionProbe.html) 会根据场景位置将环境贴图存储于Cubemaps中,来增加环境反射贴图的真实性,但是实时反射在VR中会很慢.

Occlusion Culling

Occlusion Culling (docs.unity3d.com/Manual/OcclusionCulling.html)能禁止对看不到的场景渲染,例如一扇门关闭时,我们不想让门那边的另外房间渲染,就可以使用它.使用它可以显著提升性能.

没有进行遮挡裁切的示例:

6_occlusionfrustumculling

使用了遮挡裁切的示例:

7_occlusionfullculling

Anti-Aliasing

Anti-Aliasing 抗锯齿在VR中是很有用的,因为它有助于平滑图像,减少锯齿状边缘.如果你是用了 Forward Rendering, 你可以在画质设置中起启用MSAA(docs.unity3d.com/Manual/class-QualitySettings.html),你也应该在Gear VR中启用它来提升效果.

在Deferred Rendering时,你可以用图像脚本(docs.unity3d.com/420/Documentation/Components/script-AntialiasingAsPostEffect.html)或看论坛上启用SMAA的例子:”https://github.com/Chman/SMAA-Unity”.

Textures

一般情况下,可以用  Texture Atlasing (https://en.wikipedia.org/wiki/Texture_atlas)把场景中的贴图整合起来以尽可能的减少材质球数量.

我们也可以用MeshBaker (https://www.assetstore.unity3d.com/en/#!/content/5017)简化加快这一优化过程.Meshbaker可以用来烘焙纹理,网格,材质来优化游戏性能.

详见下面链接:

用MeshBaker的视频教程(https://www.youtube.com/watch?v=9vZ8SfXOlpI)

Oculus渲染文档:(https://developer.oculus.com/documentation/intro-vr/latest/concepts/bp_app_rendering/)

Shaders

尽量使用Basic着色器,在Gear VR中,推荐使用”Mobile > Unlit (Supports Lightmap) shader”.

Fullscreen Effects

Fullscreen effects(docs.unity3d.com/Manual/comp-ImageEffects.html)是非常消耗资源的,在GearVR上要尽可能避免使用.

Quality Settings

Quality Settings(docs.unity3d.com/Manual/class-QualitySettings.html)决定项目中画质的各个方面,改变这些属性可以提高游戏性能,但是会牺牲视觉效果.

RenderScale

VRSettings.renderScale(docs.unity3d.com/ScriptReference/VR.VRSettings-renderScale.html)渲染比将改变图像锐度,可以用来提高画质或者降低画质提升帧率.

Asynchronous Loading

如果把游戏拆分成若干个单独的场景,在加载时,为了避免画面冻结导致恶心不适感,建议使用异步加载来载入下一个场景数据:SceneManager.LoadSceneAsync(docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html)

VR示例中的优化技术

 

我们在示例项目中做了一些列优化确保示例项目在GearVR和DK2上都能有很好的性能.我们选用了一种低面艺术风格,并只使用了几个基本颜色,使得项目能很流畅有很美丽.

我们使用了Forward Rendering,并在Edit > Project Settings > Quality Settings 启用了4x MSAA.

8_msaa-qualitysettings

让我们快速的看一下场景中用到的优化技术:

Menu 场景优化

场景中我们使用低模资源,没有用实时光照,给菜单面板用了名为SeparableAlpha的自定义着色器,它允许单独设置透明通道,避免每一帧都用这个菜单自己的透明通道,减少了贴图文件大小.

Flyer场景优化

我们使用了雾效确保小行星等物体很融合的进入到场景,并缩短了视距,减少了渲染物体数量.小行星用了很少的面,所以它可以用 Dynamic Batching,同样也创建了一个对象池(unity3d.com/es/learn/tutorials/modules/beginner/live-training-archive/object-pooling)处理激光,小行星物体和圆环,减少较耗费资源的实例化(docs.unity3d.com/ScriptReference/Object.Instantiate.html)的使用.

在飞船上用了一个很小的颜色纹理用第二UV通道给Detail Map.这会节省贴图尺寸.

Maze 场景优化

迷宫场景使用了烘焙光照贴图,特别是在移动设备上运行它会有很流畅的效果,否则它将是一个很简单的没有实时光照没有什么效果的场景.

Shooter180和Shooter360场景优化

和其它游戏一样,我们用了低模风格以及对象池(unity3d.com/es/learn/tutorials/modules/beginner/live-training-archive/object-pooling),同时对低顶点数的模型使用Dynamic Batching(docs.unity3d.com/Manual/DrawCallBatching.html).

更多优化细节可以到Oculus网站查看:

https://developer.oculus.com/documentation/

http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/


原文:http://unity3d.com/learn/tutorials/topics/virtual-reality

由 四角钱 (XK) 翻译,转载请注明来自 http://blog.1vr.cn