Unity3d 周分享(20期 2019.6.30 )

选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 

1、Unity的Android音频延迟在2019.1.0 中改进

https://gametorrahod.com/unitys-android-audio-latency-improvement-in-2019-1-0/

文章作者因为这个延迟问题,弄了一个,正是基于OpenSL 原生音频 - 通过OS的原生音频库降低音频延迟。

Native Audio是一个插件,可以帮助您使用每个平台最快的本机方法轻松加载和播放音频... beyond7.com

其中也提到一些有名的插件: 除了FMOD和wwise之外,还有来自日本的Criware。 文章真的好长~~

有关使用Unity的Android音频的复习,我建议你阅读这篇长达一小时的关于我的研究的文章。

适用于Unity开发人员的Android原生音频入门

我将揭开围绕Android音频系统的“黑匣子”的神秘面纱,并分析为什么Unity使用它的方式会让人失望... gametorrahod.com

作者使用 小米 miA2 (2018年发布/奥利奥8.1.0)和 Xperia Z5 (2015年发布/ Nougat 7.1.1)两个手机做了测试。

结果

令人印象深刻!在小米米A2上,从以前的Unity版本减少是一个疯狂的-200毫秒!(如果完全跳过Unity到本机,-317ms)

在Xperia Z5上没有任何有意义的改进,表明手机已经在之前的版本中使用了OpenSL ES。

摘要

我建议所有节奏游戏开发者尽快升级到2019.1,因为这些小米设备因价格低而非常普及。谁知道哪些设备能够实际处理低延迟时报告错误的低延迟功能标志?

 

 

 

 

2、 了解实体组件系统的面向数据的设计--GDC 2019年的Unity 【Understanding data-oriented design for entity component systems - Unity at GDC 2019】 https://www.youtube.com/watch?time_continue=565&v=0_Byw9UMn9g

          与传统的面向对象的游戏系统设计方式相比,Unity的新ECS功能可以实现巨大的性能提升,但面向数据的设计是一种截然不同的思维方式。观察如何以面向数据的方式思考,以便您可以利用这些新功能。演讲人:Elizabeth Baumel(DOTS软件工程师,Unity Technologies)了解有关面向数据技术堆栈(DOTS)的更多信息:

https://unity.com/dots?utm_source=youtube&utm_medium=social&utm_campaign=engine_global_generalpromo_2019-04-09_gdc19&utm_content=video_understanding-dots

PPT : https://docs.google.com/presentation/d/1s8XV63Dy092i1FSfUFUvfXrne2OmisrlxM5zbr4F8gQ/edit#slide=id.p

 

 

Unity at GDC - A Data Oriented Approach to Using Component Systems

https://www.youtube.com/watch?v=p65Yt20pw0g

 

 

 

3、 使用Unity的AudioMixer

音频混音器音量设置 , http://tsubakit1.hateblo.jp/entry/2015/05/23/234053 这个文章使用 mixer.SetFloat("MasterVolume", Mathf.Lerp(-80, 0, value)); 这种方式控制音量。

https://qiita.com/u-n-k-man1gou/items/ea206c700ed5076ecd79 volume 和 DB 有一个转换关系的~~

             因为AudioMixer的音量是Digibell(-80~0)。 如果你在AudioSource.volume的0f-1f意义上这样做,那将毫无用处。

0.5f = -40dB如果你考虑一下,声音将会低于50%。

            Digibell(dB)转换的公式是

dB = 20.0 × log10(i0/i1) ※「i0/i1」是一个比例,

             所以用C#写

20 * Mathf.Log10(volume);

volume 就是Slider的值(0f至1f)。

public void SetBgmVolume(float _volume)
{
    float volume = Mathf.Clamp(_volume, 0.0001f, 1.0f);
    var volumeDB = (float) (20.0d * Math.Log10(volume));
    audioMixer.SetFloat("BGMVol", Mathf.Clamp(volumeDB, -80.0f, 0.0f));
}

 

 

 

 

4、

这个手册之前看过两边吧, 最近有看了一遍~~~~

ARM 针对Unity推出的 手册 : 中文最新 3.3 版本

ARM® Unity 开发者指南 版本 3.3 优化移动游戏图形 https://developer.arm.com/-/media/developer/Graphics%20and%20Multimedia/Developer%20Guides%20-%20PDFs/Unity%20Developer%20Guides/Oct18%20-%20%20Unity%20%20ARM%20-%20Chinese.pdf?revision=2dd4b6af-bf6d-4930-ac23-2ed841fbd55b&la=en

https://developer.arm.com/tools-and-software/graphics-and-gaming/gaming-engine/unity/unity-guides-and-white-papers

           Unity 5 及更高版本会自动缓存Transform组件。

 

 

 

 

 

5、在Unity 2018的PlayerLoop中,禁用Unity调用每一帧的处理或在Update之前添加您自己的处理

这次,使用从Unity 2018添加的PlayerLoop,您可以添加或自定义您自己的事件,例如Unity事件(Update,FixedUpdate等

                 在Unity 4和Unity 5时,基本上使用MonoBehaviour调用Unity事件,例如Update和LateUpdate,除非由ScriptExecutionOrder设置,否则顺序是未知的。

            基本上它适用于Component, 但是好像没有场景相关的事件。

RuntimeInitializeOnLoad似乎可以调用与场景无关的初始化处理。

            Unity 2018.1 引入了一个名为PlayerLoop 的功能。这是Unity引擎重新更新过程的顺序,或停止特定的事件,或插入自己的处理似乎是有可能这样。

获取标准事件列表

using UnityEngine;
using UnityEngine.Experimental.LowLevel;
public class ShowPlayerLoop
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Init()
    {
        var playerLoop = PlayerLoop.GetDefaultPlayerLoop();

        foreach (var header in playerLoop.subSystemList)
        {
            Debug.LogFormat("------{0}------", header.type.Name);
            foreach (var subSystem in header.subSystemList)
            {
                Debug.LogFormat("{0}.{1}", header.type.Name, subSystem.type.Name);
            }
        }
    }
}

          首先var playerLoop = PlayerLoop.GetDefaultPlayerLoop();获得所有标准事件。

           重要的是playerLoop.subSystemList,存储在此列表中的方法是递归调用的。如果要自定义调用,则将编辑此subSystemList的各个部分。

           此外,此部分中要获取的方法列表似乎与UnityEngine.Experimental.PlayLoop中可以检查的方法相匹配。

------Initialization------
Initialization.PlayerUpdateTime
Initialization.AsyncUploadTimeSlicedUpdate
Initialization.SynchronizeInputs
Initialization.SynchronizeState
Initialization.XREarlyUpdate
------EarlyUpdate------
EarlyUpdate.PollPlayerConnection
EarlyUpdate.ProfilerStartFrame
EarlyUpdate.GpuTimestamp
EarlyUpdate.UnityConnectClientUpdate
EarlyUpdate.CloudWebServicesUpdate
EarlyUpdate.UnityWebRequestUpdate
EarlyUpdate.ExecuteMainThreadJobs
EarlyUpdate.ProcessMouseInWindow
EarlyUpdate.ClearIntermediateRenderers
EarlyUpdate.ClearLines
EarlyUpdate.PresentBeforeUpdate
EarlyUpdate.ResetFrameStatsAfterPresent
EarlyUpdate.UpdateAllUnityWebStreams
EarlyUpdate.UpdateAsyncReadbackManager
EarlyUpdate.UpdateTextureStreamingManager
EarlyUpdate.UpdatePreloading
EarlyUpdate.RendererNotifyInvisible
EarlyUpdate.PlayerCleanupCachedData
EarlyUpdate.UpdateMainGameViewRect
EarlyUpdate.UpdateCanvasRectTransform
EarlyUpdate.UpdateInputManager
EarlyUpdate.ProcessRemoteInput
EarlyUpdate.XRUpdate
EarlyUpdate.TangoUpdate
EarlyUpdate.ScriptRunDelayedStartupFrame
EarlyUpdate.UpdateKinect
EarlyUpdate.DeliverIosPlatformEvents
EarlyUpdate.DispatchEventQueueEvents
EarlyUpdate.DirectorSampleTime
EarlyUpdate.PhysicsResetInterpolatedTransformPosition
EarlyUpdate.NewInputBeginFrame
EarlyUpdate.SpriteAtlasManagerUpdate
EarlyUpdate.PerformanceAnalyticsUpdate
------FixedUpdate------
FixedUpdate.ClearLines
FixedUpdate.NewInputEndFixedUpdate
FixedUpdate.DirectorFixedSampleTime
FixedUpdate.AudioFixedUpdate
FixedUpdate.ScriptRunBehaviourFixedUpdate
FixedUpdate.DirectorFixedUpdate
FixedUpdate.LegacyFixedAnimationUpdate
FixedUpdate.XRFixedUpdate
FixedUpdate.PhysicsFixedUpdate
FixedUpdate.Physics2DFixedUpdate
FixedUpdate.DirectorFixedUpdatePostPhysics
FixedUpdate.ScriptRunDelayedFixedFrameRate
FixedUpdate.ScriptRunDelayedTasks
FixedUpdate.NewInputBeginFixedUpdate
------PreUpdate------
PreUpdate.PhysicsUpdate
PreUpdate.Physics2DUpdate
PreUpdate.CheckTexFieldInput
PreUpdate.IMGUISendQueuedEvents
PreUpdate.NewInputUpdate
PreUpdate.SendMouseEvents
PreUpdate.AIUpdate
PreUpdate.WindUpdate
PreUpdate.UpdateVideo
------Update------
Update.ScriptRunBehaviourUpdate
Update.ScriptRunDelayedDynamicFrameRate
Update.DirectorUpdate
------PreLateUpdate------
PreLateUpdate.AIUpdatePostScript
PreLateUpdate.DirectorUpdateAnimationBegin
PreLateUpdate.LegacyAnimationUpdate
PreLateUpdate.DirectorUpdateAnimationEnd
PreLateUpdate.DirectorDeferredEvaluate
PreLateUpdate.UpdateNetworkManager
PreLateUpdate.UpdateMasterServerInterface
PreLateUpdate.UNetUpdate
PreLateUpdate.EndGraphicsJobsLate
PreLateUpdate.ParticleSystemBeginUpdateAll
PreLateUpdate.ScriptRunBehaviourLateUpdate
PreLateUpdate.ConstraintManagerUpdate
------PostLateUpdate------
PostLateUpdate.PlayerSendFrameStarted
PostLateUpdate.DirectorLateUpdate
PostLateUpdate.ScriptRunDelayedDynamicFrameRate
PostLateUpdate.PhysicsSkinnedClothBeginUpdate
PostLateUpdate.UpdateCanvasRectTransform
PostLateUpdate.PlayerUpdateCanvases
PostLateUpdate.UpdateAudio
PostLateUpdate.ParticlesLegacyUpdateAllParticleSystems
PostLateUpdate.ParticleSystemEndUpdateAll
PostLateUpdate.UpdateCustomRenderTextures
PostLateUpdate.UpdateAllRenderers
PostLateUpdate.EnlightenRuntimeUpdate
PostLateUpdate.UpdateAllSkinnedMeshes
PostLateUpdate.ProcessWebSendMessages
PostLateUpdate.SortingGroupsUpdate
PostLateUpdate.UpdateVideoTextures
PostLateUpdate.UpdateVideo
PostLateUpdate.DirectorRenderImage
PostLateUpdate.PlayerEmitCanvasGeometry
PostLateUpdate.PhysicsSkinnedClothFinishUpdate
PostLateUpdate.FinishFrameRendering
PostLateUpdate.BatchModeUpdate
PostLateUpdate.PlayerSendFrameComplete
PostLateUpdate.UpdateCaptureScreenshot
PostLateUpdate.PresentAfterDraw
PostLateUpdate.ClearImmediateRenderers
PostLateUpdate.PlayerSendFramePostPresent
PostLateUpdate.UpdateResolution
PostLateUpdate.InputEndFrame
PostLateUpdate.TriggerEndOfFrameCallbacks
PostLateUpdate.GUIClearEvents
PostLateUpdate.ShaderHandleErrors
PostLateUpdate.ResetInputAxis
PostLateUpdate.ThreadedLoadingDebug
PostLateUpdate.ProfilerSynchronizeStats
PostLateUpdate.MemoryFrameMaintenance
PostLateUpdate.ExecuteGameCenterCallbacks
PostLateUpdate.ProfilerEndFrame

覆盖PlayerLoop本身

我将用我认为最强大的进程取代PlayerLoop 。

正确地说,一旦你没有调用Unity的基本功能的各种处理,请将处理插入其中。

           这本身很容易实现。但是,如果您不调用进程== Unity循环被完全销毁,Unity使用的大多数函数都将停止。 物理操作,输入和UI 的所有操作都死掉了。

using UnityEngine;
using UnityEngine.Experimental.LowLevel;
public class SpawnSystem
{
    [RuntimeInitializeOnLoadMethod()]
    static void Init()
    {
        var mySystem = new PlayerLoopSystem()
        {
            type = typeof(MyLoopSystemUpdate),
            updateDelegate = () =>
            {
                Debug.Log("DO IT!!!");
            }
        };
        var playerLoop = new PlayerLoopSystem();
        playerLoop.subSystemList = new PlayerLoopSystem[] { mySystem };
        PlayerLoop.SetPlayerLoop(playerLoop);
    }
    public struct MyLoopSystemUpdate { }
}

这次,我会尝试在更新之前执行类似...的 函数你可以看到每帧都在打印Log, 但是画面都是静止的, 因为之前的正常循环都被覆盖没有了。

using UnityEngine;
using UnityEngine.Experimental.LowLevel;
using System.Collections.Generic;
public class PreUpdateSystem
{
    [RuntimeInitializeOnLoadMethod()]
    static void Init()
    {
        var mySystem = new PlayerLoopSystem()
        {
            type = typeof(MyLoopSystemUpdate),
            updateDelegate = () =>
            {
                Debug.Log("DO IT!!!");
            }
        };
        var playerLoop = PlayerLoop.GetDefaultPlayerLoop();
        var updateSystem = playerLoop.subSystemList[4]; // Update
        var subSystem = new List<PlayerLoopSystem>(updateSystem.subSystemList);
        subSystem.Insert(0, mySystem);
        updateSystem.subSystemList = subSystem.ToArray();
        playerLoop.subSystemList[4] = updateSystem;
        PlayerLoop.SetPlayerLoop(playerLoop);
    }
    public struct MyLoopSystemUpdate { }
}

我正在做的就是重写subSystemList的内容并反映它。playerLoop.subSystemList[4];从更新过程中取出,在顶部添加您自己的进程并返回。现在整个显示如果有动画的话, 又动起来了~~~

下面的列表是Unity调用的事件获取的事件列表。

 

指数

类型

内容

0

Initialization

“时间”更新或状态?同步

1

EarlyUpdate

更新“输入”等

2

FixedUpdate

物理操作系统,调用FixedUpdate

3

PreUpdate

物理计算的反映?或鼠标输入

4

Update

更新过程

5

PreLateUpdate

动画更新等。最后是LateUpdate

6

PostLateUpdate

布料更新,渲染等

结果如下,我在FixedUpdate和Update之间插入了自己的事件。

 

禁用特定事件

最后,尝试禁用某些事件。这也很简单,只需准备一个已删除特定事件的PlayerLoop版本,然后执PlayerLoop.SetPlayerLoop。

这次,我将尝试禁用FixedUpdate.PhysicsFixedUpdate。

using UnityEngine;
using UnityEngine.Experimental.LowLevel;
using UnityEngine.Experimental.PlayerLoop;
using System.Collections.Generic;
public class StopPhysicsFixedUpdate
{
    static PlayerLoopSystem[] originalPlayerLoop, updatedPlayerLoop;
    [RuntimeInitializeOnLoadMethod()]
    static void Init()
    {
        var playerLoop = PlayerLoop.GetDefaultPlayerLoop();
        originalPlayerLoop = playerLoop.subSystemList[2].subSystemList; // Update
        var subSystem = new List<PlayerLoopSystem>(originalPlayerLoop);
        subSystem.RemoveAll(c => c.type == typeof(FixedUpdate.PhysicsFixedUpdate));
        updatedPlayerLoop = subSystem.ToArray();
        PhysicsOFF();
    }
    public static void PhysicsOFF()
    {
        var playerLoop = PlayerLoop.GetDefaultPlayerLoop();
        var sub = playerLoop.subSystemList[2];
        sub.subSystemList = updatedPlayerLoop;
        playerLoop.subSystemList[2] = sub;
        PlayerLoop.SetPlayerLoop(playerLoop);
    }
    public static void PhysicsON()
    {
        var playerLoop = PlayerLoop.GetDefaultPlayerLoop();
        var sub = playerLoop.subSystemList[2];
        sub.subSystemList = originalPlayerLoop;
        playerLoop.subSystemList[2] = sub;
        PlayerLoop.SetPlayerLoop(playerLoop);
    }
}

因为它是一个低级函数,所以最好小心如何使用它。

             就个人而言,我认识到在Update之前添加初始化处理以及在帧结束时收集信息是一个很好的用法。

 

 

 

 

6、 CEDEC 2018摘要

[CEDEC 2018摘要]发布了47篇报告文章,重点关注与智能手机游戏相关的会议

计算机娱乐协会(CESA)于8月22日至24日在Pacifico Yokohama举行日本最大的游戏开发者大会“2018年计算机娱乐开发者大会”(CEDEC 2018),创下历史新高254进行了一次会议 其中,社交游戏信息发布了47篇关于智能手机游戏相关会话的报道文章。

今年的主题是“幻想成为现实”。在CEDEC开始时,许多被认为远未实现的“梦想”现在正在变为现实,他们表示新的“梦想”将在不久的将来成为现实。 。

下面,我们将提供已发布会话的列表,作为每个制造商的摘要。

· Applibot(1) 【CEDEC 2018】揭示了成功的营销改革......也证明了ROAS翻倍!数字营销发展业务

·Aiming(1) “开发和管理分析自己的数据的文化!”(瞄准Koichiro Shibao)改善游戏的方法和措施是什么?

· Epic Games(1) 降低CPU成本并按预期执行!在UE4中使用许多角色的技术

·Craft Egg(1) “Galpa”管理中最上游的思想是“用户至上”......这个想法随着Craft Egg的价值而被揭示出来

· gumi(1) “为什么我们需要分析数据?”......根据“海鸥订单”的例子,介绍可用于“决策”的分析数据

· KLab(2) 为用户提供更高品质的音响体验!在社交游戏中实现响度控制的工作流程构建和考虑 ※本次会议也是Sono Logic Design,腾讯也在舞台上。 “Uta no Tsu☆Prince-sama♪Shining Live”用“CRIWARE”产生逼真的现场感...... KLab展示声音和指挥技术

· 格力(2) 测试〜游戏应用程序,随着时代的变化误传措施母鸡- ...误传的风险,可以提前检测 发生在外包和解决方案的时间问题...委托从两家公司的角度

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值