为什么在Mobile上RenderTexture显卡性能低低

工具修订记录最近更改媒体管理器网站地图登录注册&
UnityEngine
UnityEngine.SceneManagement
场景管理类
script:unityengine:classes:rendertexture:rendertexture.markrestoreexpected
RenderTexture.MarkRestoreExpected 预期的标记还原
JavaScript => public function MarkRestoreExpected():
C# => public void MarkRestoreExpected();
Description 描述
Indicate that there's a RenderTexture restore operation expected.
表明渲染纹理恢复预期操作。
When in mobile graphics emulation mode, Unity issues warnings when a RenderTexture “restore” operation is performed. Restore happens when rendering into a texture, without clearing or discarding (DiscardContents) it first. This is a costly operation on many mobile GPUs and multi-GPU systems and best should be avoided.
当在移动图形仿真模式,当Unity执行渲染还原操作时发出警告。当渲染纹理没有清除或者首先丢弃它(DiscardContents)时还原发生。在很多移动 Gpu 和多 GPU 系统上,这是一个高负荷的操作,最好避免。
However, if your rendering effect absolutely needs a RenderTexture restore, you can call this function to indicate that yes, a restore is expected, and Unity will not issue a warning here.
但是,如果你的渲染效果必须要渲染纹理还原,你可以调用该函数表明那是必须的,还原时预期的,并且在这里Unity将不会发出警告。[Unity3D]图形渲染优化、渲染管线优化、图形性能优化 - 简书
[Unity3D]图形渲染优化、渲染管线优化、图形性能优化
主要内容也可以参考:http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html最简单的优化建议:1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU。2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更高效。3.尽可能共用材质。4.将不需要移动的物体设为Static,让引擎可以进行其批处理。5.尽可能不用灯光。6.动态灯光更加不要了。7.尝试用压缩贴图格式,或用16位代替32位。8.如果不需要别用雾效(fog)9.尝试用OcclusionCulling,在房间过道多遮挡物体多的场景非常有用。若不当反而会增加负担。10.用天空盒去“褪去”远处的物体。11.shader中用贴图混合的方式去代替多重通道计算。12.shader中注意float/half/fixed的使用。13.shader中不要用复杂的计算pow,sin,cos,tan,log等。14.shader中越少Fragment越好。15.注意是否有多余的动画脚本,模型自动导入到U3D会有动画脚本,大量的话会严重影响消耗CPU计算。16.注意碰撞体的碰撞层,不必要的碰撞检测请舍去。1.为什么需要针对CPU(中央处理器)与GPU(图形处理器)优化?CPU和GPU都有各自的计算和传输瓶颈,不同的CPU或GPU他们的性能都不一样,所以你的游戏需要为你目标用户的CPU与GPU能力进行针对开发。2.CPU与GPU的限制GPU一般具有填充率(Fillrate)和内存带宽(Memory Bandwidth)的限制,如果你的游戏在低质量表现的情况下会快很多,那么,你很可能需要限制你在GPU的填充率。CPU一般被所需要渲染物体的个数限制,CPU给GPU发送渲染物体命令叫做DrawCalls。一般来说DrawCalls数量是需要控制的,在能表现效果的前提下越少越好。通常来说,电脑平台上DrawCalls几千个之内,移动平台上DrawCalls几百个之内。这样就差不多了。当然以上并不是绝对的,仅作一个参考。往往渲染(Rendering)并不是一个问题,无论是在GPU和CPU上。很可能是你的脚本代码效率的问题,用Profiler查看下。关于Profiler介绍:http://docs.unity3d.com/Documentation/Manual/Profiler.html需要注意的是:在GPU中显示的RenderTexture.SetActive()占用率很高,是因为你同时打开了编辑窗口的原因,而不是U3D的BUG。3.关于顶点数量和顶点计算CPU和GPU对顶点的计算处理都很多。GPU中渲染的顶点数取决于GPU性能和SHADER的复杂程度,一般来说,每帧之内,在PC上几百万顶点内,在移动平台上不超过10万顶点。CPU中的计算主要是在蒙皮骨骼计算,布料模拟,顶点动画,粒子模拟等。GPU则在各种顶点变换、光照、贴图混合等。【个人认为,具体还是看各位的项目需求,假设你项目的是3D游戏。你游戏需要兼容低配置的硬件、流畅运行、控制硬件发热的话,还要达到一定效果(LIGHTMAP+雾效),那么顶点数必定不能高。此时同屏2W顶点我认为是个比较合适的数目,DRAWCALL最好低于70。另,控制发热请控制最高上限的帧率,流畅的话,帧率其实不需要太高的。】4.针对CPU的优化——减少DRAW CALL 的数量为了渲染物体到显示器上,CPU需要做一些工作,如区分哪个东西需要渲染、区分开物体是否受光照影响、使用哪个SHADER并且为SHADER传参、发送绘图命令告诉显示驱动,然后发送命令告诉显卡删除等这些。假设你有一个上千三角面的模型却用上千个三角型模型来代替,在GPU上花费是差不多的,但是在CPU上则是极其不一样,消耗会大很多很多。为了让CPU更少的工作,需要减少可见物的数目:a.合并相近的模型,手动在模型编辑器中合并或者使用UNITY的Draw call批处理达到相同效果(Draw call batching)。具体方法和注意事项查看以下链接:Draw call batching : http://docs.unity3d.com/Documentation/Manual/DrawCallBatching.htmlb.在项目中使用更少的材质(material),将几个分开的贴图合成一个较大的图集等方式处理。如果你需要通过脚本来控制单个材质属性,需要注意改变Renderer.material将会造成一份材质的拷贝。因此,你应该使用Renderer.sharedMaterial来保证材质的共享状态。有一个合并模型材质不错的插件叫Mesh Baker,大家可以考虑试下。c.尽量少用一些渲染步骤,例如reflections,shadows,per-pixel light 等。d.Draw call batching的合并物体,会使每个物体(合并后的物体)至少有几百个三角面。假设合并的两个物体(手动合并)但不共享材质,不会有性能表现上的提升。多材质的物体相当于两个物体不用一个贴图。所以,为了提升CPU的性能,你应该确保这些物体使用同样的贴图。另外,用灯光将会取消(break)引擎的DRAW CALL BATCH,至于为什么,查看以下:Forward Rendering Path Details:http://docs.unity3d.com/Documentation/Components/RenderTech-ForwardRendering.htmle.使用相关剔除数量直接减少Draw Call数量,下文有相关提及。5.优化几何模型最基本的两个优化准则:a.不要有不必要的三角面。b.UV贴图中的接缝和硬边越少越好。需要注意的是,图形硬件需要处理顶点数并跟硬件报告说的并不一样。不是硬件说能渲染几个点就是几个点。模型处理应用通展示的是几何顶点数量。例如,一个由一些不同顶点构成的模型。在显卡中,一些集合顶点将会被分离(split)成两个或者更多逻辑顶点用作渲染。如果有法线、UV坐标、顶点色的话,这个顶点必须会被分离。所以在游戏中处理的实际数量显然要多很多。6.关于光照若不用光肯定是最快的。移动端优化可以采用用光照贴图(Lightmapping)去烘培一个静态的贴图,以代替每次的光照计算,在U3D中只需要非常短的时间则能生成。这个方法能大大提高效率,而且有着更好的表现效果(平滑过渡处理,还有附加阴影等)。在移动设备上和低端电脑上尽量不要在场景中用真光,用光照贴图。这个方法大大节省了CPU和GPU的计算,CPU得到了更少的DRAWCALL,GPU则需要更少顶点处理和像素栅格化。Lightmapping : http://docs.unity3d.com/Documentation/Manual/Lightmapping.html7.对GPU的优化——图片压缩和多重纹理格式Compressed Textures(图片压缩):http://docs.unity3d.com/Documentation/Components/class-Texture2D.html图片压缩将降低你的图片大小(更快地加载更小的内存跨度(footprint)),而且大大提高渲染表现。压缩贴图比起未压缩的32位RGBA贴图占用内存带宽少得多。之前U3D会议还听说过一个优化,贴图尽量都用一个大小的格式(512 * 512 , 1024 * 1024),这样在内存之中能得到更好的排序,而不会有内存之间空隙。这个是否真假没得到过测试。MIPMAPS(多重纹理格式):http://docs.unity3d.com/Documentation/Components/class-Texture2D.html跟网页上的略缩图原理一样,在3D游戏中我们为游戏的贴图生成多重纹理贴图,远处显示较小的物体用小的贴图,显示比较大的物体用精细的贴图。这样能更加有效的减少传输给GPU中的数据。8.LOD 、 Per-Layer Cull Distances 、 Occlusion CullingLOD (Level Of Detail) 是很常用的3D游戏技术了,其功能理解起来则是相当于多重纹理贴图。在以在屏幕中显示模型大小的比例来判断使用高或低层次的模型来减少对GPU的传输数据,和减少GPU所需要的顶点计算。摄像机分层距离剔除(Per-Layer Cull Distances):为小物体标识层次,然后根据其距离主摄像机的距离判断是否需要显示。遮挡剔除(Occlusion Culling)其实就是当某个物体在摄像机前被另外一个物体完全挡住的情况,挡住就不发送给GPU渲染,从而直接降低DRAW CALL。不过有些时候在CPU中计算其是否被挡住则会很耗计算,反而得不偿失。以下是这几个优化技术的相关使用和介绍:Level Of Detail :http://docs.unity3d.com/Documentation/Manual/LevelOfDetail.htmlPer-Layer Cull Distances :http://docs.unity3d.com/Documentation/ScriptReference/Camera-layerCullDistances.htmlOcclusion Culling :http://docs.unity3d.com/Documentation/Manual/OcclusionCulling.html9.关于Realtime Shadows(实时阴影)实时阴影技术非常棒,但消耗大量计算。为GPU和CPU都带来了昂贵的负担,细节的话参考下面:http://docs.unity3d.com/Documentation/Manual/Shadows.html10.对GPU优化:采用高效的shadera.需要注意的是有些(built-in)Shader是有mobile版本的,这些大大提高了顶点处理的性能。当然也会有一些限制。b.自己写的shader请注意复杂操作符计算,类似pow,exp,log,cos,sin,tan等都是很耗时的计算,最多只用一次在每个像素点的计算。不推荐你自己写normalize,dot,inversesqart操作符,内置的肯定比你写的好。c.需要警醒的是alpha test,这个非常耗时。d.浮点类型运算:精度越低的浮点计算越快。在CG/HLSL中--float :32位浮点格式,适合顶点变换运算,但比较慢。half:16位浮点格式,适合贴图和UV坐标计算,是highp类型计算的两倍。fixed: 10位浮点格式,适合颜色,光照,和其他。是highp格式计算的四倍。写Shader优化的小提示:http://docs.unity3d.com/Documentation/Components/SL-ShaderPerformance.html11.另外的相关优化:a.对Draw Call Batching的优化http://docs.unity3d.com/Documentation/Manual/DrawCallBatching.htmlb.对Rendering Statistics Window的说明和提示:http://docs.unity3d.com/Documentation/Manual/RenderingStatistics.htmlc.角色模型的优化建议用单个蒙皮渲染、尽量少用材质、少用骨骼节点、移动设备上角色多边形保持在300~1500内(当然还要看具体的需求)、PC平台上内(当然还要看具体的需求)。http://docs.unity3d.com/Documentation/Manual/ModelingOptimizedCharacters.html
Don't reinvent the wheel.
http://www.fx114.net/qa-75-172454.aspx 使用Profiler工具分析内存占用情况 System.ExecutableAndDlls:系统可执行程序和DLL,是只读的内存,用来执行所有的脚本和DLL引用。不同平台和不同硬件得到...
最简单的优化建议: 1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU。 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更高效。 3.尽可能共用材质。 4.将...
转载http://wetest.qq.com/lab/view/315.html 移动平台硬件架构 移动平台无论是Android 还是 IOS 用的都是统一内存架构,GPU和CPU共享一个物理内存,通常我们有“显存”和“内存”两种叫法,可以认为是这块物理内存的所有者不同,当...
关于《Thinking in Unity3D》 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙。不得不说,笔者最近几年的引擎研发工作中,早已习惯性的从Unity3D中寻找解决方案。 Unity3D虽比不上UE那...
0x00 前言 刚开始写这篇文章的时候选了一个很土的题目。。。《Unity3D优化全解析》。因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而 给自己“文(dou)学(bi)”加工留下的余地就少了很多。但又觉得这块是不得不提的一个地方,平时见到很多人对此处也给予...
插播一句,全程图片手机拍摄,多数为匆忙中抓拍,主要用于叙事。前一期已被某位摄影大神批评,特此说明。 6月21日 Day5 马拉喀什-瓦尔扎扎特 早餐后出发,一路上的景色极象国内西南地区。 行程本来没有购物,但中国游客,大家都懂的,根本是自觉自愿主动要求买东西。于是强烈要求买...
一分钟说多不多,说少也不少。但人生确是这一分钟、一分钟积聚起来的。有效使用人生的每分钟,时光不会辜负你的付出! 今天给大家介绍一本书《一分钟经理人》。书中介绍的一分钟管理法简洁易懂,能立竿见影地提升效率。每个人都可以用书中的方法实现自我管理,利用最短的...
走走又停停 我站在一望无际的草原 寻找那颗早已麻木的心 不知何时来到了这里 也不知该往哪儿去 我就像一叶孤舟 飘到了这里 渐渐的 我忘记了最初开始的模样 也忘记了那个曾经爱笑的少年 飘着飘着我就迷路了 忘记了身处何处 忘记了寻找自己
渴望有一份同样的爱情,希望嫁给爱情。
VR/AR这几年一直都挺火,他们是改变人们交互方式一代产品。沉浸感是VR最大的特点,而AR的特点是将虚拟和现实相结合。去年Pokemon Go让AR火了一把,老外简直是玩疯了。 在买车的同时,面临着4S店车的种类不全,颜色不同,无法深入了解汽车结构,越泰AR看车这种方式改变...32 条评论分享收藏感谢收起程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
UGUI研究院之在UI上使用RenderTexture显示模型+AlphaBlend特效(二十五)
UGUI研究院之在UI上使用RenderTexture显示模型+AlphaBlend特效(二十五)
围观21495次
编辑日期: 字体:
在UI上显示模型无非就是2种。
1.在两个UI摄像机中夹一层3d摄像机,利用摄像机的Viewport Rect属性对模型进行裁切。
2.使用RenderTexture渲染在RawImage后显示在UI上。
我上一个项目就是采取第一种方法,用起来很不舒服。因为有很多效果都做不了,比如就是UI上盖模型,在盖UI,再盖模型这种,还有就是在滑动列表中显示模型,滑动裁切的话都很麻烦。
今天我想说的就是第二种,使用RenderTexture的方式来渲染模型。
先说缺点:
1.为了保证显示上的效果RenderTexture的文件区域必须大于RawImage的区域,我们目前用的是乘2倍。比如RawImage的区域是512X512,那么就得创建一个大小的RenderTexture才能保证渲染效果。
2.如果人物身上有一些特殊的效果,比如outline描边这样的,放在RenderTexture上就是达不到效果。
3.如果模型身上带有AlphaBlend这样的特效,因为AlphaBlend要和背景做混合,而RenderTexture不像Camera那样有背景,显示上就会有问题。(下面我会说我目前是怎么解决的)
优点的话,就很爽了。完全和UI一样,层级顺序,列表中显示模型、裁切、等等都很方便了。
RenderTexture显示AlphaBlend特效的方法
因为AlphaBlend特效需要和背景做混合,所以我们可以给它后面垫一个底图。这样就能解决在RenderTexture上显示带AlphaBlend的特效的模型。
创建一个Sprite 可以直接把UI的Sprite放上去。如果模型带特效就用Sprite2d,如果模型不带特效,完全可以用之前UI的制作方式,很方便灵活的切换它。
如下图所示,Game视图中显示的效果,这个翅膀的火焰特效就是alphablend
如下图所示,因为底图不止一张,大家看到下面还有好几张花纹了吗?都可以用Sprite2d叠在下面。
渲染RenderTexture的摄像机,这里已经能看出来渲染的是正确的,下面被水印挡住了 图片尺寸是 ARGB32 4.3M。为什么尺寸这么大呢?上面我也提过,因为RenderTexture尺寸和RawImage一样的话,效果会比较差,所以这里乘了2倍。
这样问题来了,摄像机的大小或者fov变了,那岂不是每次都要手动去把sprite的size对齐,手动设置localScale。这样就太麻烦了。
下面我再给大家分享一个脚本,正交或者非正交摄像机都支持的。自动根据摄像机的区域来自动自适应计算sprite的size 。(这个脚本挂在Sprite上即可)
1234567891011121314151617181920212223242526272829303132333435363738
using System.Collections;using System.Collections.Generic;using UnityEngine;&public class SpriteFull : MonoBehaviour {& //设置SpriteRender和摄像机的距离 public float distance = 1.0f; && private SpriteRenderer spriteRenderer = null; void Start() {
spriteRenderer = GetComponent&SpriteRenderer& ();
spriteRenderer.material.renderQueue =2980; //这段代码非常重要!!!大家务必要加上,不然透明的渲染层级会出错 }& void Update() {
Camera camera = Camera.main;
camera.transform.rotation = Quaternion.Euler (Vector3.zero);&
float width = spriteRenderer.sprite.bounds.size.x;
float height = spriteRenderer.sprite.bounds.size.y;&
float worldScreenHeight,worldScreenWidth;
//这里分别处理正交和非正交摄像机
if (camera.orthographic) {
worldScreenHeight = Camera.main.orthographicSize * 2.0f;
worldScreenWidth = worldScreenHeight / Screen.height * Screen.width;
worldScreenHeight = 2.0f * distance * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
worldScreenWidth = worldScreenHeight * camera.aspect;
transform.localPosition = new Vector3 (camera.transform.position.x, camera.transform.position.y, distance);
transform.localScale = new Vector3 (worldScreenWidth / width, worldScreenHeight / height, 0f); }}
上面有段代码非常重要,切记一定要设置sprite的renderQueue ,因为ui是3000这里和UI不一样就行,不然透明会显示错误。
最后,垫在模型下面可能一张图是不够的,可能还有一些花纹,可能还有花纹需要镜像等,这样的图片就得需要手动设置一下缩放和位置了。
OK 大家如果有疑问欢迎再下面给我留言,继续干活了~
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!To be an elegant coding girl...
RenderTexture实现实时阴影绘制
这篇学习总结主要是在今天学习了姜雪伟实现的实时阴影的方式做一个整理。
原课程地址:
一般实时阴影主要还在出现在角色、怪物的脚底为了然场景表现的更加逼真,实现起来通常有三种方式:脚底放个阴影图片跟着主角动,通过摄像机的RenderRexture绘制显示,直接使用Unity的Projector组件。
很不幸的是在我们的游戏中直截了当的放了一坨灰背景,实现的效果虽然少了几分逼真性,但如果是2D场景的话也足够用了。
但是如果想要在3D场景绘制脚底阴影,直接放图有点粗暴。本文里的RenderTexture方式实现较为简单效果也会很逼真。
基本思路其实就是多用了一个摄像机,将照相机把你需要照到的主角的内容呈现到一张单独的面片上,这个面片就摆在人较低作为它的阴影。看起来像简单版的一个小地图:只有主角的小地图。
场景中所需要的对象如图,对于map节点显示RenderTexteure的地方只要空的材质球就行了,要呈现摄像机照射的内容。直接用Plane对象或Quad对象都可以的。
此外,为了让阴影真实点,显示阴影的面片一般是灰色透明的,我们还要单独设置下,不然默认摄像机照出来的角色就是我们真实看到的世界:
紧接着还需要一个脚本告诉摄像机把内容写到我们的map面片上。
在场景中的display节点身上绑定脚本ShadowScript:
public class ShadowScript : MonoBehaviour {
public GameO
private GameObject ShadowC
private GameO
private RenderTexture mTex = null;
public int AntiAliasing = 4;
void Start () {
child = this.transform.FindChild("qiangu1");
map = child.FindChild("child/map").gameO
ShadowCamera = child.FindChild("child/camera").gameO
if (!display)
display = this.transform.parent.gameO
mTex = new RenderTexture(2000, 2000, 0);
mTex.name = "Shadow" + GetInstanceID();
Camera mCamera = ShadowCamera.GetComponent&Camera&();
mCamera.cullingMask = GetLayerMask(display.gameObject.layer);
mCamera.targetTexture = mT
public LayerMask GetLayerMask(int layer)
LayerMask mask = 0;
mask |= 1 &&
void Update ()
if(display!=null)
mTex.anisoLevel = AntiA
map.renderer.maternTexture = mT
很简单吧?跑起来直接就可以看到实时的阴影效果了!!
自己给小骨模型做了一个御剑的动画!!然而一时找不到好看的剑模型,我只好找了张jpg的剑扣一个出来,也是大费周折,不过可以看出来阴影效果比较好,因为阴影作为一个独立的GameObject直接少了很多调层级的麻烦,现在是只显示主角阴影的效果。
但是当我把剑贴图所在的面片layer调整的也和主角模型一样的时候,发现居然还是看不到剑的阴影。
这个时候还对专门针对map(显示阴影的面片)材质写一个Shader,就不能用默认的Transparent/Diffuse了,并且最终剑这种透明贴图的还需要使用Unlit/Transparent,新添加的Shader详细代码如下:
///作为带Alpha通道的模型贴图的shader
Shader "MyShader/AlphaSkinShader"
Properties
_Color("Main Color",Color)=(1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cutoff("Base Alpha cutoff",Range(0,0.9))=0.2
Tags { "Queue"="Transparent" }
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t
float4 vertex:POSITION
float4 color:COLOR
float2 texcoord:TEXCOORD
struct v2f
float4 vertex:SV_POSITION
float4 color:COLOR
float2 texcoord:TEXCOORD
sampler2D _MainTex
float4 _MainTex_ST
float _Cutoff
v2f vert(appdata_t v)
o.vertex = mul(UNITY_MATRIX_MVP,v.vertex)
o.color=v.color
o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex)
float4 _Color
half4 frag(v2f i):SV_Target
half4 col = tex2D(_MainTex,i.texcoord)
if(col.a&_Cutoff)
clip(col.a-_Cutoff)
col.rgb=col.rgb*float3(0,0,0)
col.rgb=col.rgb+_Color
col.a=_Color.a
return col
FallBack "Diffuse"
修改之后靓丽的运行效果:
具体资源地址可以到我的github下载哦,package可以直接导入一个空工程使用。
扫码向博主提问
Unity,C#都来
擅长领域:
没有更多推荐了,

我要回帖

更多关于 cpu性能低 的文章

 

随机推荐