赞
踩
选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 早就有了,抱歉才发!
https://qiita.com/sator_imaging/items/ff5811885f515a0a4998
由于我有机会在逐帧的基础上处理大量的Transform ,我想总结一下Unity中更新Transform 的方法以及比较和优化性能的方法。
这意味着值得考虑是否有数百或更多个Transform 的 .position 或 .rotation / .eulerAngles 。
始终在rotation / eulerAngles中缓存对xyzw的访问
有些数据Transform中是没有缓存的!
vector3.x = 0 和 transform.position.x = 0 看起来访问方式很像。但实际上很大差别。 即使你缓存了Transform (高版本的Unity已经在底层进行了缓存,不需要开发者进行缓存了)
..... = new Vector3(cache.eulerAngles.x, cache.eulerAngles.y, cache.eulerAngles.z);
例如上,如果您访问成员三次,将生成三个Vector3副本。
在Transform.position,Transform.rotation,Transform.eulerAngles等中,getter不是在字段中而是在属性中设置,每次访问时都有结构体拷贝。 原因是Unity的Transform 存有的是 local 相关的数据, 如果访问世界坐标下的内容 必须现算!!!!!
localRotation是最快的
四元数比欧拉角更快
本地空间比世界空间更快
.localRotation,比.rotation, .localEulerAngles比.eulerAngles快。
Transform.Rotate()要好于 localEulerAngles + =
调整偏移等很容易,因为Euler的角度更直观,.localEulerAngles += .....但Transform.Rotate()更快。
当数量很大时,会产生相当大的性能影响。
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html
如果可用,请使用HumanPoseHandler.SetHumanPose()
如果目标是Humanoid,则HumanPoseHandler的SetHumanPose可能更快。
https://github.com/Bizcast/NoitomHi5InertiaToFingerMuscle
摘要
四元数很快
如果添加偏移 = Quaternion * Quaternion是最快的
严禁访问Quaternion / Vector3的xyzw成员
https://github.com/xoofx/UnityNuGet
https://twitter.com/ffs_nonamesleft/status/1143436080580112384
“注意: 他举得例子不好都是常量计算, 现代编译器都会进行常量展开(编译时直接计算结果了)”
还可以 看看 位运算 `100 >> 1` 可能 是最快的!!!
在值不是常数的情况下,iOS上的乘法速度是除法的两倍。在Unity编辑器中,它的速度提高了约20%。
将脚本复制到“Assets / Editor”文件夹。
脚本: https://pastebin.com/Y1R7eSA0
建议您在使用drawer 之前添加对hasMultipleDifferentValues的检查,以防止它覆盖在检查器窗口中多选时所选的所有图像
在四元数可视化中找到了一个存储库,我将在本文后面使用它:
https://github.com/uvivagabond/Visualization-of-physics-in-Unity
在Scenes 文件夹中打开名为TestForQuaternions 的场景。
表示旋转的方法有很多种。借助旋转矩阵,四元数和其他表示,可以借助于欧拉角度来表示旋转。
在本系列中,我将重点介绍四元数。我主要关注他们在Unity中的实现和操作。
https://www.youtube.com/watch?v=OBTU0v0MeeQ
参数x ,y 和z 负责旋转轴的方向。
AngleAxis方法()此方法允许您基于给定(绝对)旋转轴和围绕此轴旋转的角度创建四元数。
我们将四元数的乘法视为连续的身体旋转。A * B≠B * A. 四元数从右向左相乘
欧拉角表示围绕全局坐标系的轴的旋转,即围绕全局轴z ,x 和y 的旋转。
四元数的可视化:
几乎没有困难的四元数描述
https://github.com/NickCuso/Tutorials/blob/master/Quaternions.md
来自fspace的四元数描述
https://www.f-sp.com/entry/2017/08/11/194125
Unity Answers(Bunny 83)
https://answers.unity.com/questions/1297214/quaternions-not-exact.html
https://answers.unity.com/questions/1417640/get-local-euler-angles-by-quaternion.html
https://answers.unity.com/questions/1365419/locking-rotation-world-z-axis-quaternions-are-shav.html
数学描述
https://www.vcalc.com/wiki/KurtHeckman/Quaternion+Calculator+Collection
Mateusz Kowalski
https://www.youtube.com/watch?v=ZgOmCYfw6os
其他
https://www.gamasutra.com/view/feature/3278/rotating_objects_using_quaternions.php
https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation
已经宣布 脱离预览版了 ~~~~
https://blogs.unity3d.com/2019/07/15/addressable-asset-system/
这个支持分析工具也很到位: 比如提供引用计数 功能。
原理如下 http://android-developers.blogspot.it/2013/09/using-hardware-scaler-for-performance.html
https://forum.unity.com/threads/interesting-article-from-google-on-android-hardware-scaler.202625/
这两个文章可以对 分辨率有更好的理解!!!
https://www.cinemablend.com/games/Xbox-One-Unlikely-Hit-1080p-With-DX12-Says-Witcher-3-Dev-66567.html
https://www.cinemablend.com/games/DirectX-12-May-Help-Xbox-One-Much-According-Developer-64410.html
https://www.cinemablend.com/games/1080p-Hard-Achieve-Xbox-One-Due-Complex-GPU-Says-Xbox-Director-62893.html
根据开发人员的说法,DirectX 12可能无法帮助Xbox One
Witcher 3 Dev表示Xbox One不太可能通过DX12达到1080p
当人们说“PS4比Xbox One强大50%”时,这就是他们所谈论的内容的一部分。PS4的GPU上有更多着色器单元,因此每帧输出的视觉效果比Xbox One更多。这就是为什么游戏将更频繁地在PS4上达到1080p
此外,当Xbox One上的游戏可以达到1080p时,通常它会这样做而牺牲其他正在渲染到屏幕上的东西。简而言之,每一块硬件都具有技术上限,而Xbox One的GPU由于较旧和较低等级的架构而具有如此低的上限,因此难以在游戏中始终如一地达到1080p。
最终,DirectX 12之前曾被提及为更好的CPU流水线指令,而不是检修GPU的运行方式。(还是跟硬件有关呗,这是因为GPU较弱,ESRAM有限)
这就像尝试使用软件优化来使GTX 7800达到2K分辨率。是的,这是可能的,但你必须做出巨大的牺牲才能在屏幕上显示什么来达到分辨率。你不能用软件神奇地升级硬件; 优化不能解决这个问题。
Xbox 360的1040x600分辨率与Xbox One的1408x792输出相差500,736像素。战地4在Xbox One上的720p相比PS4的900p输出相差518,400像素。
Unity 4.x 的代码中确实有使用:
- // $TODO Make this less complicated ;)
- // This code is unnecessarily complicated, just to cover the fact that it can be called both from
- // native code (through scripts Screen.SetResolution) and from Java (GLThread onSurfaceChanged).
- protected void setScreenSize(final int w, final int h, final boolean low_profile)
- {
- final SurfaceView view = mGlView;
- Rect rect = view.getHolder().getSurfaceFrame();
- if (Log.LOG_INFO)
- Log.Log(Log.INFO, String.format ("setScreenSize: %dx%d (%dx%d / %dx%d)",
- w, h, rect.width (), rect.height (),
- view.getWidth (), view.getHeight ()));
-
- // If w/h matches the view, or if w/h is 0/0, we use the layout size (and disable any fixed-size surface holder)
- final boolean reset = view.getWidth() == w && view.getHeight() == h || w == 0 && h == 0;
- // If w/h is -1/-1, we keep whatever was set before (no change to screen resolution)
- final boolean keep = w == -1 && h == -1;
- if (!keep)
- {
- if (reset)
- {
- if (Log.LOG_INFO) Log.Log(Log.INFO, "setScreenSize: setSizeFromLayout()");
- mSurfaceFixedW = 0;
- mSurfaceFixedH = 0;
- }
- else
- {
- if (Log.LOG_INFO) Log.Log(Log.INFO, "setScreenSize: setFixedSize(" + w + ", " + h + ")");
- mSurfaceFixedW = w;
- mSurfaceFixedH = h;
- }
- }
- else
- {
- boolean fixed = (mSurfaceFixedW != 0 || mSurfaceFixedH != 0);
- if (fixed)
- {
- if (Log.LOG_INFO) Log.Log(Log.INFO, "setScreenSize: keeping fixed size " + mSurfaceFixedW + "x" + mSurfaceFixedH);
- }
- else
- {
- if (Log.LOG_INFO) Log.Log(Log.INFO, "setScreenSize: keeping layout size " + view.getWidth() + "x" + view.getHeight());
- }
- }
-
- runOnUiThread(new Runnable () {
- public void run () {
- if (!keep)
- {
- if (reset)
- view.getHolder().setSizeFromLayout();
- else
- view.getHolder().setFixedSize(w, h);
- view.invalidate();
- }
- if (HONEYCOMB_SUPPORT)
- HONEYCOMB.setSystemUiHidden(UnityPlayer.this, low_profile);
- }
- });
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。