原型图高保真和中保真的区别

We recently wrapped up GDC 2019, where we spoke about Adaptive Performance during our Keynote. We’re excited to let you know that the Preview version and the Megacity mobile sample are now available so you can get started exploring this feature. This blog explains more about Adaptive Performance and how to apply it to your own projects.

我们最近结束了GDC 2019,我们在 主题演讲中 谈到了自适应性能 。 很高兴地通知您, 现在已经提供 预览 版和 Megacity 移动示例,因此您可以开始探索此功能。 该博客详细介绍了自适应性能以及如何将其应用于您自己的项目。

Unlike for a PC or console game, harnessing the full power of mobile hardware requires a delicate balance for games to look beautiful and play smoothly. Maxing out a device’s capabilities can quickly compromise your game’s performance by overtaxing the hardware, which leads to throttling, poor battery life, and inconsistent performance. For developers, this issue becomes even more problematic considering the wide range of low-end to high-end target devices.

与PC或主机游戏不同,要充分利用移动硬件的功能,就需要在游戏外观和流畅玩法之间取得微妙的平衡。 最大限度地发挥设备的功能可能会使硬件负担过重,从而Swift损害游戏性能,从而导致节流,电池续航时间短和性能不稳定。 对于开发人员而言,考虑到低端到高端目标设备的广泛范围,这个问题变得更加棘手。

Today, developers take different tactics to solve this problem. The two main approaches we’ve seen are: trying to make sure games perform at their best on all target hardware, which means sacrificing graphics fidelity and frame rate, or attempting to anticipate hardware behavior, which is really difficult because there are not many options to precisely measure hardware trends.

今天,开发人员采取不同的策略来解决此问题。 我们看到的两种主要方法是:尝试确保游戏在所有目标硬件上都能发挥最佳性能,这意味着牺牲图形保真度和帧速率,或者试图预测硬件行为,这确实很困难,因为没有太多选择精确衡量硬件趋势。

自适应性能如何工作 (How Adaptive Performance works)

Adaptive Performance provides you with a better way to manage thermals and performance of your games on a device in real time, allowing you to proactively adjust on-the-fly performance and quality settings of your game and utilizing the hardware without overtaxing the device. The result is a predictable frame rate and a decrease in thermal buildup, enabling longer play times and a much more enjoyable player experience while preserving battery life.

自适应性能为您提供了一种更好的实时管理设备上游戏热量和性能的方法,使您可以主动调整游戏的实时性能和质量设置,并利用硬件而不会增加设备负担。 结果是可预测的帧速率和减少的热量累积,从而延长了播放时间,并在保持电池寿命的同时提供了更加愉悦的播放器体验。

For developers, it means having a new, deeper insight into hardware with new tools to make your games more dynamic and flexible, providing your players with the smoothest and best-performing experiences when they’re playing on mobile devices. It gives you control over decisions that usually the operating system makes, such as when to run at high clock speeds or what to adjust to avoid throttling.

对于开发人员而言,这意味着使用新工具对硬件进行全新的更深入的了解,可以使您的游戏更具动态性和灵活性,为您的玩家在移动设备上玩游戏时提供最流畅,性能最佳的体验。 它使您可以控制通常由操作系统做出的决策,例如何时以高时钟速度运行或为避免限制而进行调整。

We gave several talks about this feature during GDC 2019. You can view the slide deck here and watch the Unity GDC Booth Talk – Megacity on mobile: How we optimized it with Adaptive Performance below.

我们在GDC 2019期间就此功能进行了多次讨论。您可以在此处查看幻灯片,并观看Unity GDC展位谈话–移动中的特大城市:我们如何通过以下自适应性能对其进行优化。

演示地址

与三星合作开发自适应性能 (Partnering with Samsung on Adaptive Performance)

We’ve partnered with Samsung, the world’s largest Android mobile device manufacturer, to help bring this solution to fruition. Built on top of Samsung’s GameSDK, Adaptive Performance will first be available for Samsung Galaxy devices such as the Samsung Galaxy S10 and Galaxy Fold, followed by additional Samsung Galaxy devices later this year.

我们已经与全球最大的Android移动设备制造商三星合作,以帮助实现该解决方案。 自适应性能基于三星的GameSDK构建, 将首先在三星Galaxy设备(如三星Galaxy S10和Galaxy Fold)上提供,然后在今年晚些时候推出。

早期结果 (Early results)

These charts (shown during our Unity at GDC 2019 keynote) illustrate how Adaptive Performance helps deliver a steady high frame rate with Megacity running on the new Samsung Galaxy S10.

这些图表(在我们 在GDC 2019上的Unity大会 期间 展示)展示了自适应性能如何通过在新的三星Galaxy S10上运行Megacity来提供稳定的高帧频。

In red, you can see the frame rate in Megacity before we added Adaptive Performance; and in blue, you can see the results after we added Adaptive Performance. With Adaptive Performance, the demo runs at 30 fps for a much longer time and is much more stable.

以红色显示,在添加自适应性能之前,您可以看到Megacity中的帧频; 并以蓝色显示,您可以在添加自适应性能后看到结果。 借助自适应性能,该演示可以30 fps的速度运行更长的时间,并且更加稳定。

为什么是特大城市? (Why Megacity?)

Megacity is a futuristic, interactive city featuring millions of entities, demonstrating how Unity can run even the most complex projects on current-gen mobile hardware. It showcases the latest advances in our Data-Oriented Technology Stack (DOTS), the name for all projects under our “Performance by Default” banner, including Entity Component System (ECS), Native Collections, C# Job System, and the Burst Compiler. Megacity was first presented at Unite Los Angeles 2018 and was released for desktop during GDC 2019.

大城市是一个具有数百万个实体的未来派互动城市,展示了Unity如何在当前移动硬件上运行最复杂的项目。 它展示了面向数据技术栈( DOTS ) 的最新进展,它是 “默认性能”旗帜下所有项目的名称,包括实体组件系统(ECS),本机集合,C#作业系统和Burst编译器。 Megacity首次在 2018年洛杉矶联合展上 展出, 并在 GDC 2019 期间发布用于台式机 。

Megacity is the right project to demonstrate a sample implementation of Adaptive Performance, as it provides us with the flexibility to adapt the game dynamically and proactively to best utilize the hardware. Adaptive Performance was built with scalability in mind, which works great with the principles of DOTS used to build the foundation in Megacity.

Megacity是演示自适应性能示例实现的正确项目,因为它为我们提供了灵活,动态,主动地适应游戏以充分利用硬件的灵活性。 自适应性能是在考虑可伸缩性的基础上构建的,它与用于在Megacity中建立基础的DOTS原理非常兼容。

The mobile version of the project has 4.5M mesh renderers, 200K building components, 100K audio sources, and more than 6M entities – an ideal candidate for demonstrating Adaptive Performance’s capabilities.

该项目的移动版本具有450万个网格渲染器,20万个建筑组件,10万个音频源以及超过600万个实体,是展示Adaptive Performance功能的理想之选。

自适应性能如何工作(在特大城市中) (How Adaptive Performance works (in Megacity))

After you install Adaptive Performance via the Unity Package Manager, Unity automatically adds the Samsung GameSDK subsystem to your project when you build to a device. During runtime, Unity creates and starts an Adaptive Performance Manager on supported devices, which provides you with feedback about the thermal state of the mobile device. You can subscribe to events or query the information from the Adaptive Performance Manager during runtime to react in real-time; otherwise, it will only report the stats to the console.

通过Unity软件包管理器安装Adaptive Performance后,在构建到设备上时,Unity会自动将Samsung GameSDK子系统添加到您的项目中。 在运行时,Unity在受支持的设备上创建并启动Adaptive Performance Manager,它为您提供有关移动设备热状态的反馈。 您可以在运行时订阅事件或从Adaptive Performance Manager查询信息,以进行实时响应。 否则,它只会将统计信息报告给控制台。

As an example, you can use the API provided to create applications that react to the thermal trends and events on the device. This ensures constant frame rates over a longer period of time while avoiding thermal throttling, even before throttling begins. In the sample implementation of Adaptive Performance in Megacity, we used three different ways to smooth the frame rate:

例如,您可以使用提供的API创建对设备的热趋势和事件做出React的应用程序。 这样可以确保在更长的时间内保持恒定的帧速率,同时避免了热调节,即使在调节开始之前也是如此。 在“大城市中的自适应性能”的示例实现中, 我们使用了三种不同的方法来平滑帧速率:

  • By starting at moderate CPU and GPU levels, and increasing them gradually to eliminate bottlenecks, we were able to keep energy consumption low.

    通过从中等的CPU和GPU级别开始并逐渐增加它们以消除瓶颈,我们能够将能耗保持在较低水平。

  • If we saw that the device was getting close to throttling, we could tune quality settings to reduce thermal load – and we decided to lower the LOD levels.

    如果我们发现该设备已接近节流状态,则可以调整质量设置以降低热负荷–我们决定降低LOD级别。

  • We also decreased the target frame rate once we were close to throttling.

    一旦接近节流,我们还降低了目标帧速率。

  • When the target frame rate is reached and temperature is in decline, we increase LOD levels, raise target frame rate, and decrease CPU and GPU levels again.

    当达到目标帧速率且温度下降时,我们将提高LOD级别,提高目标帧速率,然后再次降低CPU和GPU级别。

These capabilities enable your game to achieve a smoother performance over time. By keeping a close eye on a device’s thermal trends, you can adjust performance settings on the fly to avoid throttling altogether.

这些功能使您的游戏能够随着时间的推移获得更流畅的性能。 通过密切关注设备的热趋势,您可以即时调整性能设置,从而避免完全节流。

Download the Megacity mobile sample project here, to see how we’ve done this. For feedback or questions about Megacity, please visit this forum thread.

在 此处 下载Megacity移动示例项目 ,以了解我们如何做到这一点。 有关Megacity的反馈或问题,请访问此论坛 主题 。

自适应绩效管理器 (Adaptive Performance Manager)

The heart of the package is the Adaptive Performance Manager, which Unity creates during startup, allowing you to access and subscribe for thermal and performance event notifications easily. The example below shows how to access the Adaptive Performance Manager using the IAdaptivePerformance interface in the Start function of your MonoBehaviour.

该软件包的核心是Adaptive Performance Manager,它是Unity在启动期间创建的,使您可以轻松访问和订阅热事件和性能事件通知。 下面的示例演示如何使用 MonoBehaviour 的“ 开始” 功能中 的 IAdaptivePerformance 接口 访问Adaptive Performance Manager 。

private IAdaptivePerformance ap = null; void Start() { ap = Holder.instance; } private IAdaptivePerformance ap = null; void Start() { ap = Holder.instance; }

1

2
3
4
5
6

private IAdaptivePerformance ap = null;  
void Start()  
{  
ap = Holder.instance;  
}

1

2
3
4
5
6

private IAdaptivePerformance ap = null ;   
void Start ( )   
{   
ap = Holder . instance ;   
}

热事件 (Thermal events)

Unity sends thermal events whenever there are changes in the thermal state of the device. The important states are when throttling is imminent and when throttling is occurring. In the example below, you subscribe to ThermalEvents to reduce or increase your lodBias, which helps to reduce GPU load.

只要设备的热状态发生变化,Unity就会发送热事件。 重要状态是何时将要进行节流以及何时进行节流。 在下面的示例中,您预订了 ThermalEvents以减少或增加lodBias,这有助于减少GPU负载。

using UnityEngine; using UnityEngine.Mobile.AdaptivePerformance; public class AdaptiveLOD : MonoBehaviour { private IAdaptivePerformance ap = null; void Start() { if (Holder.instance == null) return; ap = Holder.instance; if (!ap.active) return; QualitySettings.lodBias = 1; ap.ThermalEvent += OnThermalEvent; } void OnThermalEvent(object obj, ThermalEventArgs ev) { switch (ev.warningLevel) { case PerformanceWarningLevel.NoWarning: QualitySettings.lodBias = 1; break; case PerformanceWarningLevel.ThrottlingImminent: QualitySettings.lodBias = 0.75f; break; case PerformanceWarningLevel.Throttling: QualitySettings.lodBias = 0.5f; break; } } } using UnityEngine; using UnityEngine.Mobile.AdaptivePerformance; public class AdaptiveLOD : MonoBehaviour { private IAdaptivePerformance ap = null; void Start() { if (Holder.instance == null) return; ap = Holder.instance; if (!ap.active) return; QualitySettings.lodBias = 1; ap.ThermalEvent += OnThermalEvent; } void OnThermalEvent(object obj, ThermalEventArgs ev) { switch (ev.warningLevel) { case PerformanceWarningLevel.NoWarning: QualitySettings.lodBias = 1; break; case PerformanceWarningLevel.ThrottlingImminent: QualitySettings.lodBias = 0.75f; break; case PerformanceWarningLevel.Throttling: QualitySettings.lodBias = 0.5f; break; } } }

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

using UnityEngine;  
using UnityEngine.Mobile.AdaptivePerformance;  
public class AdaptiveLOD : MonoBehaviour  
{  
private IAdaptivePerformance ap = null;  
void Start() {  
if (Holder.instance == null)  
return;  
ap = Holder.instance;  
if (!ap.active)  
return;  
QualitySettings.lodBias = 1;  
ap.ThermalEvent += OnThermalEvent;  
}  
void OnThermalEvent(object obj, ThermalEventArgs ev) {  
switch (ev.warningLevel) {  
case PerformanceWarningLevel.NoWarning:  
QualitySettings.lodBias = 1;  
break;  
case PerformanceWarningLevel.ThrottlingImminent:  
QualitySettings.lodBias = 0.75f;  
break;  
case PerformanceWarningLevel.Throttling:  
QualitySettings.lodBias = 0.5f;  
break;  
}  
}  
}

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

using UnityEngine ;   
using UnityEngine . Mobile . AdaptivePerformance ;   
public class AdaptiveLOD : MonoBehaviour   
{   
private IAdaptivePerformance ap = null ;   
void Start ( ) {   
if ( Holder . instance == null )   
return ;   
ap = Holder . instance ;   
if ( ! ap . active )   
return ;   
QualitySettings . lodBias = 1 ;   
ap . ThermalEvent += OnThermalEvent ;   
}   
void OnThermalEvent ( object obj , ThermalEventArgs ev ) {   
switch ( ev . warningLevel ) {   
case PerformanceWarningLevel . NoWarning :   
QualitySettings . lodBias = 1 ;   
break ;   
case PerformanceWarningLevel . ThrottlingImminent :   
QualitySettings . lodBias = 0.75f ;   
break ;   
case PerformanceWarningLevel . Throttling :   
QualitySettings . lodBias = 0.5f ;   
break ;   
}   
}   
}

Note that if you reduce the lodBias below a value of 1, it will have a visual impact in many cases and LOD object-popping might occur, but it is an easy way to reduce graphics load if it is not required for the game experience. In case you want to make even more detailed decisions to fine-tune how your game’s graphics and behavior are handled, the bottleneck events are very useful.

请注意,如果将lodBias减小到小于1的值,则在许多情况下会产生视觉影响,并且可能会发生LOD对象弹出,但是如果游戏体验不需要,这是减少图形负载的简便方法。 如果您要做出更详细的决定来微调游戏的图形和行为的处理方式,则瓶颈事件非常有用。

CPU和GPU性能等级 (CPU and GPU performance levels)

The CPU and GPU of a mobile device make up a very large part of its power utilization, especially when running a game. Typically, the operating system decides which clock speeds are used for the CPU and GPU.

移动设备的CPU和GPU占其功耗的很大一部分,尤其是在运行游戏时。 通常,操作系统决定将哪些时钟速度用于CPU和GPU。

CPU cores and GPUs are less efficient when running at their maximum clock speed. Running at high clock speeds overheats the mobile device easily and the operating system throttles the frequency of the CPU and GPU to cool down the device.

以最大时钟速度运行时,CPU内核和GPU的效率较低。 高时钟速度运行很容易使移动设备过热,并且操作系统会降低CPU和GPU的频率以冷却设备。

You can avoid this situation by limiting the maximum-allowed clock speeds with these properties:

您可以通过使用以下属性限制最大允许时钟速度来避免这种情况:

  • IAdaptivePerformance.cpuLevel

    IAdaptivePerformance.cpuLevel

  • IAdaptivePerformance.gpuLevel

    IAdaptivePerformance.gpuLevel

The application can configure those properties based on its special knowledge about the current performance requirements and decide, based on the scenario, if the levels should be lowered or raised.

应用程序可以基于对当前性能要求的特殊知识来配置这些属性,并根据场景决定是否降低或提高级别。

  • Did the application reach the target frame rate in the previous frames?

    应用程序是否达到了先前帧中的目标帧率?

  • Is the application in an in-game scene or in a menu?

    该应用程序是在游戏场景中还是在菜单中?

  • Is a heavy scene coming up next?

    接下来会有沉重的场面吗?

  • Is an upcoming event CPU or GPU heavy?

    即将发生的事件CPU或GPU重吗?

  • Will you show ads that do not require high CPU/GPU levels?

    您会显示不需要较高CPU / GPU水平的广告吗?

public void EnterMenu(){ if (!ap.active) return; // Set low CPU and GPU level in menu ap.cpuLevel = 0; ap.gpuLevel = 0; // Set low target FPS Application.targetFrameRate = 15; } public void ExitMenu(){ // Set higher CPU and GPU level when going back into the game ap.cpuLevel = ap.maxCpuPerformanceLevel; ap.gpuLevel = ap.maxGpuPerformanceLevel; } public void EnterMenu(){ if (!ap.active) return; // Set low CPU and GPU level in menu ap.cpuLevel = 0; ap.gpuLevel = 0; // Set low target FPS Application.targetFrameRate = 15; } public void ExitMenu(){ // Set higher CPU and GPU level when going back into the game ap.cpuLevel = ap.maxCpuPerformanceLevel; ap.gpuLevel = ap.maxGpuPerformanceLevel; }

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public void EnterMenu(){  
if (!ap.active)  
return;  
// Set low CPU and GPU level in menu  
ap.cpuLevel = 0;  
ap.gpuLevel = 0;  
// Set low target FPS  
Application.targetFrameRate = 15;  
}  
public void ExitMenu(){  
// Set higher CPU and GPU level when going back into the game  
ap.cpuLevel = ap.maxCpuPerformanceLevel;  
ap.gpuLevel = ap.maxGpuPerformanceLevel;  
}

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public void EnterMenu ( ) {   
if ( ! ap . active )   
return ;   
// Set low CPU and GPU level in menu  
ap . cpuLevel = 0 ;   
ap . gpuLevel = 0 ;   
// Set low target FPS  
Application . targetFrameRate = 15 ;   
}   
public void ExitMenu ( ) {   
// Set higher CPU and GPU level when going back into the game  
ap . cpuLevel = ap . maxCpuPerformanceLevel ;   
ap . gpuLevel = ap . maxGpuPerformanceLevel ;   
}

用于性能瓶颈的预警系统 (An early-warning system for performance bottlenecks)

In the Adaptive Performance Manager, you can subscribe to receive performance bottleneck events that let you know if you are GPU, CPU, or “frame-rate bound.” Frame-rate bound means that the game is limited by Application.targetFrameRate, in which case the application should consider lowering its performance requirements.

在Adaptive Performance Manager中,您可以订阅以接收性能瓶颈事件,这些事件使您知道您是GPU,CPU还是“帧速率绑定”。 帧速率限制意味着游戏受Application.targetFrameRate限制,在这种情况下,应用程序应考虑降低其性能要求。

Running in the background governing bottleneck decisions – and queryable via the Manager – is the GPU frametime driver, which monitors the hardware time the GPU spent on the last frame; for the moment, the CPU time is calculated by summing Unity’s internal subsystems. Depending on the game and scenario, you can have it react differently when the game is CPU or GPU bound according to thermal state changes.

GPU帧时间驱动程序在后台管理瓶颈决策(可通过Manager查询),该驱动程序可监视GPU在最后一帧上花费的硬件时间。 目前,CPU时间是通过汇总Unity的内部子系统来计算的。 根据游戏和场景的不同,当游戏受CPU或GPU限制时(根据热状态变化),您可以做出不同的React。

void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) { switch (ev.bottleneck) { case PerformanceBottleneck.TargetFrameRate: if (ap.cpuLevel > 0) { ap.cpuLevel--; } if (ap.gpuLevel > 0) { ap.gpuLevel--; } break; case PerformanceBottleneck.GPU: if (ap.gpuLevel < ap.maxGpuPerformanceLevel) { ap.gpuLevel++; } break; case PerformanceBottleneck.CPU: if (ap.cpuLevel < ap.maxCpuPerformanceLevel) { ap.cpuLevel++; } break; } } void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) { switch (ev.bottleneck) { case PerformanceBottleneck.TargetFrameRate: if (ap.cpuLevel > 0) { ap.cpuLevel--; } if (ap.gpuLevel > 0) { ap.gpuLevel--; } break; case PerformanceBottleneck.GPU: if (ap.gpuLevel < ap.maxGpuPerformanceLevel) { ap.gpuLevel++; } break; case PerformanceBottleneck.CPU: if (ap.cpuLevel < ap.maxCpuPerformanceLevel) { ap.cpuLevel++; } break; } }

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

void OnBottleneckChange(object obj, PerformanceBottleneckChangeEventArgs ev) {  
switch (ev.bottleneck) {  
case PerformanceBottleneck.TargetFrameRate:  
if (ap.cpuLevel > 0) {
ap.cpuLevel--;
}
if (ap.gpuLevel > 0) {
ap.gpuLevel--;
}
break;  
case PerformanceBottleneck.GPU:  
if (ap.gpuLevel < ap.maxGpuPerformanceLevel) {
ap.gpuLevel++;
}
break;  
case PerformanceBottleneck.CPU:  
if (ap.cpuLevel < ap.maxCpuPerformanceLevel) {
ap.cpuLevel++;
}
break;  
}  
}

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

void OnBottleneckChange ( object obj , PerformanceBottleneckChangeEventArgs ev ) {   
switch ( ev . bottleneck ) {   
case PerformanceBottleneck . TargetFrameRate :   
if ( ap . cpuLevel > 0 ) {
ap . cpuLevel -- ;
}
if ( ap . gpuLevel > 0 ) {
ap . gpuLevel -- ;
}
break ;   
case PerformanceBottleneck . GPU :   
if ( ap . gpuLevel < ap . maxGpuPerformanceLevel ) {
ap . gpuLevel ++ ;
}
break ;   
case PerformanceBottleneck . CPU :   
if ( ap . cpuLevel < ap . maxCpuPerformanceLevel ) {
ap . cpuLevel ++ ;
}
break ;   
}   
}

There are many different ways to optimize games, and the samples above and in Megacity only provide some suggestions for how to do it; ultimately, it depends very much on what works best for your game. For more information, please also check the package documentation.

优化游戏的方式有很多,上面和《大城市》中的示例仅提供了一些有关如何进行优化的建议。 最终,这很大程度上取决于哪种游戏最适合您的游戏。 欲了解更多信息,请查阅包装 文件 。

自适应性能的下一步 (What’s next for Adaptive Performance)

This is only the beginning! We are going to continue to invest in Adaptive Performance, adding more features and supporting more devices over time. The current package includes a low-level API, but we are already working on a high-level, component-based API compatible with DOTS, which should make it even easier to adapt performance in your Unity projects. Stay tuned for more information.

这仅仅是个开始! 我们将继续投资于自适应性能,随着时间的推移增加更多功能并支持更多设备。 当前的软件包包括一个低级API,但是我们已经在开发一个与 DOTS 兼容的基于组件的高级API ,这将使在Unity项目中适应性能变得更加容易。 敬请期待更多的信息。

立即开始 (Get started today)

A Preview version of Adaptive Performance is available now for Unity 2019.1 (beta) via the Unity Package Manager. You can access it here. For up-to-date information on Adaptive Performance, to see how other developers are using it, and to post questions or comments, please visit the forum.

现在可以通过Unity软件包管理器为Unity 2019.1(beta)提供Adaptive Performance的预览版。 您可以 在这里 访问它 。 有关Adaptive Performance的最新信息,以了解其他开发人员如何使用它,以及发表问题或评论,请访问 论坛 。

翻译自: https://blogs.unity3d.com/2019/04/01/higher-fidelity-and-smoother-frame-rates-with-adaptive-performance/

原型图高保真和中保真的区别

原型图高保真和中保真的区别_具有自适应性能的更高保真度和更平滑的帧频相关推荐

  1. 美柚-产品原型图(高保真) 一个拥有腾讯产品梦的小精灵

    我的梦想是成为腾讯的产品经理  哈哈哈 人总要有梦想的嘛  万一见鬼了呢 (仰脸大笑的我) 前端时间自己学习了下Axure的使用 然而当自己动手去做原型图的时候发现不知从何下手 但是 凡事都要有第一步 ...

  2. 公有云私有云的区别_私有云 vs. 公有云:谁更安全?

    "云变革" 早期时,在系统管理员眼中,用 "云" 这个比喻来圈定该技术栈是个有趣的选择.大脑意象中,云这种绵软蓬松的形象似乎难以锁定 IT 市场营销人员口中无处 ...

  3. iVMS-4200 Vs区别_异地恋 VS 网恋,哪个更难坚持到最后?| Newth互动158

    八点集合,江湖再见! 欢迎回到Newth的江湖世界.  Newth互动  158 异地恋 VS  网恋,哪个更难坚持到最后? 01 异地恋更难 网恋不管距离多远 顺着网线就能找到 可是异地恋 是依赖感 ...

  4. 尚硅谷和尚学堂的区别_传智播客和尚学堂哪个更好些啊?

    张笑翔,你做个几个企业项目呀?你真会忽悠呀,呵呵,我真佩服你,人面兽心,答应给我们的课时费怎么老是出尔反尔,你当初说一年给我们20万,这也是小数目呀,你一年挣上千万呀,你真是不够意思!!!而且连这20 ...

  5. 三菱880彩铅和uni的区别_彩铅测评 | 清新风格的花卉更有层次感?来试试三菱uni彩铅!...

    花卉/多肉是我自学彩铅的重要动力,红辉颜色清新淡雅,特别适合画日式小清新风格:笔身偏硬,刻画复杂花瓣纹理.结构时也非常好用. 但如果是颜色鲜艳或更写实的花卉作品,红辉的还是难以叠浓烈的颜色,而三菱un ...

  6. svg大小自适应_网格自适应的 2 种方法——实现更高效的计算

    网格自适应的目标是:修正网格以更有效地解决问题.通常,我们希望使用尽可能少的单元来获得精确的解:并希望在不太重要的区域使用较粗糙的网格,而在感兴趣的区域使用较精细的网格.有时,我们甚至可能会考虑各向异 ...

  7. 网格自适应_网格自适应的 2 种方法——实现更高效的计算

    网格自适应的目标是修正网格以更有效地解决问题. 通常,我们希望使用尽可能少的单元来获得精确的解:并希望在不太重要的区域使用较粗糙的网格,而在感兴趣的区域使用较精细的网格.有时,我们甚至可能会考虑各向异 ...

  8. 创业公司产品经理如何画好原型图

    对于创业公司的产品经理来说,一般身兼交互设计,所以输出的原型图一方面要给研发作为需求说明,一方面是为了让UI更有效率的输出. 画原型的工具我一直使用的是axure,因为用习惯了,上手比较顺,而我对于原 ...

  9. 原型图是什么?如何画原型图

    在我第一次听说"原型图"的时候,我一度以为"原型图"是圆的,从一开始的不了解,到尝试着画,已经是软件开发过程中不可或缺的一部分. 原型图是什么? 原型图是一款产 ...

最新文章

  1. Keil C语言数据类型,KeilC的指针类型
  2. Thymeleaf 学习笔记 (5)
  3. Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)
  4. 【学习笔记】python - pyecharts
  5. sklearn 主成分分析法 PCA和IPCA
  6. 20169217 《Linux内核原理与分析》第七周作业
  7. Java中泛型 Class<T>、T与Class<?>、 Object类和Class类、 object.getClass() 和 Object.class
  8. 要高薪地进入IT,你得这样做
  9. Google学术IP被锁--403
  10. 数据库镜像怎么还原数据库_镜像数据库上的日志传送
  11. [Java] 1001. 害死人不偿命的(3n+1)猜想 (15)-PAT乙级
  12. docker端口映射失效解决方法
  13. 关于NDK及安装使用
  14. 管理感悟:怎样给程序找好的思路
  15. java中static代码块_java中静态代码块详解
  16. 三行Python代码,实现数据库和excel之间的导入导出!
  17. 论文邮箱不是导师的_考研初试成绩出来后,可以给导师群发邮件吗?想发邮件要做到三点...
  18. 基于Highcharts箱线图实现k线图
  19. 北京工业大学计算机组成,GitHub - WuSiYu/mips-proj5: 5级流水线MIPS-lite微系统(北工大计组课设)...
  20. ios sinaweibo 客户端(一)

热门文章

  1. 微信小程序中相机api_微信小程序API 相机·CameraContext实例
  2. jquery实现点击按钮变灰不可点击并开始倒计时10秒特效代码
  3. android固定位置拍照,Android调用系统相机拍照并保存到指定位置
  4. 怎么找电脑服务器文档,电脑服务器地址怎么找
  5. esp32使用CH340N实现自动下载电路
  6. vue-cli脚本架安装出错处理
  7. # cs231n (四)反向传播
  8. 用C语言实现贪吃蛇笔记1-------.wav格式音乐的添加及播放(方法一:嵌入到可执行文件里面)
  9. docker发布一个springboot项目真香
  10. uniapp图片地址以文件流的形式传给后端