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

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

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


这是第181篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5dabdb05efeb9d3d55d15ab0


Overdraw

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

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

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

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

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5da6f4959fabd93d42071160


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问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5da91128e84db43d6efbdab5


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提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5dadc7f0efeb9d3d55d15ad0


Animation

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

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

A1:可以动态加载AnimationClip,然后替换掉状态绑定的AnimationClip。
详见官方手册:Animation Override Controller

感谢李泽兴@UWA问答社区提供了回答

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

感谢唐崇@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5da6d3fbefeb9d3d55d15a24

封面图来源于:Airtest官方网站


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)