问答 Airtest 工具在使用时的卡顿问题

侑虎科技 · 2020年06月01日 · 1716 次阅读

1)Airtest 工具在使用时的卡顿问题
2)Overdraw 视图问题
3)ModelImporterTangents.CalculateMikk
4)ASTC 格式的位图转换
5)AnimatorController 如何动态管理其中的挂点 Clip


UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)


Airtest

Q:在测试中需要等待战斗结束,代码中是用 poco(‘UIRoot’).child(‘BattleEnd’).wait_for_appearance(100000) 实现的,但是我发现开始执行到这段代码,每隔一两秒画面就会卡顿一次,然后我把"Poco 辅助窗"改成"Stop",把 Device 窗口也关掉,卡顿依然存在,这个卡顿是怎么造成的?有什么方法可以解决吗?
(测试设备是华为荣耀 10)

A:自问自答一下,项目有管理 UI 的管理器,所以在 PocoManager 添加了 RPC 方法:

[RPC]
    private object IsModuleVisible(List<object> param)

然后 air 代码里添加:

from poco.utils.simplerpc.utils import sync_wrapper
from poco.drivers.unity3d import UnityPoco
import time;
from poco.exceptions import PocoTargetTimeout
auto_setup(__file__)
poco = UnityPoco()

@sync_wrapper
def IsModuleVisible(module):
    return poco.agent.c.call("IsModuleVisible", module)

def WaitForAppearance(module, timeout = 120):
    start = time.time()
    while not IsModuleVisible(module):
        poco.sleep_for_polling_interval();
        if time.time() - start > timeout:
            raise PocoTargetTimeout('Appearance', module)

然后调用这个自定义的 WaitForAppearance 就没有卡顿了,不知道还有什么更简单的解决方法。

感谢题主 COOLFISH GAMES@UWA 问答社区提供了回答


Overdraw

Q:在 Scene 视图的 RenderMode->Overdraw 中,这里的视图只是提供了查看物体遮挡的层数关系,并不是真正的最终屏幕绘制的 Overdraw,可以这么理解吗?

A:Editor 的做法只是将不透明的 Shader 换成了半透明来画,会带来计算误差。

比如两个不透明物体叠加时,实际上在移动端不透明只会有一层 Overdraw,但是在 Editor 中会被统计为 2 层。

同时 Editor 的 Overdraw 视图对很多项目自定义的 Shader 是不支持的,所以也看不到对应的 Overdraw 视图。

该回答由 UWA 提供


Mesh

Q:最近在做 Unity 升级的工作,在 Unity 4 中,关于 Mesh 的切线的设置是定义在
ModelImporterTangentSpaceMode
Import
Calculate
None

在 Unity 2018 中,切线的导入设置是一个新的枚举
ModelImporterTangents
Import
CalculateLegacy:对应着原有的 Calculate 和 splitTangentsAcrossSeams 等于 false
None
CalculateMikk
CalculateLegacyWithSplitTangents : 对应着原有的 Calculate 和 splitTangentsAcrossSeams 等于 true

这个 CalculateMikk 是个什么含义,Unity 官方文档中提到:
Calculate tangents using MikkTSpace (default).

Vertex tangents are calculated with Morten Mikkelsen’s tangent space algorithm (“MikkTSpace”). This algorithm is used by many 3D modeling packages, normal mapping tools and graphics engines.

现在不知道 CalculateLegacy 和 CalculateMikk 之间的详细一些的区别,也就是我们什么时候应该使用 CalculateLegacy,什么时候应该使用 CalculateMikk?

A:看下 DCC 是怎么生成的,如果本身模型里有 TB 就不用生成;如果是用 SP 之类的比较新的 DCC 就用 MIKKT;如果是老一点的工具,就用 Legacy。本质是保持 TB 在引擎和 DCC 一致,这样法线贴图效果一致。

感谢钱康来@UWA问答社区提供了回答


Texture

Q:(1)我在 Sketchfab 上买了一个模型,但是在纹理的档案中发现一个 ASTC 档案,有没有办法让它变成真正的图片 BMP 档?


(2)要怎么把 ASTC 贴图导出成 jpg 格式的贴图出来呢?

A:(1)实际上 ASTC 格式是性价比更好的格式。不过你可以将其加载到 Unity 引擎中,让其读取出 Texture2D,然后将其转出成位图格式。可以阅读该篇文章:Bitmap & Texture2D 互转方法搜集

同时,也可以使用ImageConversion方法来做一个中转,最后将其转换成位图。

再或者可以 Google 下读取 ASTC 格式纹理的工具,看看是否可以直接将其转成位图(这个我没有搜索过,可以自行 Google)。

(2)这个可以帮到你。
https://docs.unity3d.com/560/Documentation/ScriptReference/Texture2D.EncodeToJPG.html

该回答由 UWA 提供


Animation

Q:想请教一下,现在 MMO 游戏角色的动画管理是自己手写的状态机播放的 Legacy 动画,还是用现在的 Animator 来做的。

用 Animator 来做,貌似需要把所有的动画都拖入状态机中,加载的时候上百个动画一并加载出来太浪费内存了。有没有办法在运行时动态修改动画状态机里面的 motion 信息呢?或者如何优化状态机呢?

A1:可以动态加载 AnimationClip,然后替换掉状态绑定的 AnimationClip。
详见官方手册:Animation Override Controller
感谢李泽兴@UWA问答社区提供了回答

A2:试试 Playable,可以支持动态加载 Clip,缺点是也要自己写一套状态机管理。

感谢唐崇@UWA问答社区提供了回答


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册