7

ToLua或XLua中的虚拟机是否独立于Unity的主线程

 2 years ago
source link: https://blog.uwa4d.com/archives/TechSharing_291.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ToLua或XLua中的虚拟机是否独立于Unity的主线程

1)ToLua或XLua中的虚拟机是否独立于Unity的主线程
​2)Timeline技能编辑器提取关键帧信息
3)Canvas AdditionalShaderChannels设置无效
4)SDK返回的时候取Time.deltaTime比较大


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

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

Q:ToLua或XLua中的虚拟机是否独立于Unity的主线程?

A:Lua的虚拟机有自己的堆、栈内存,虚拟机的更新需要有外部的线程通过函数调用来驱动,而Lua虚拟机目前只支持单个线程来驱动。在实际项目中,因为Lua中要访问Unity的API,所以基本上都是通过主线程来驱动。

但实际上,如果不需要访问Unity API,完全是可以放在子线程里去驱动的。

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


Timeline

Q:最近在用Unity做一个技能编辑器,让策划可以在Timeline编辑器里编辑技能动画、施法特效、受击动画、受击特效和播放声音等等。编辑这些都没什么问题,我想根据编辑好的Timeline导出一系列行为节点,在Editor的环境下导出成配置(包含所有行为节点)。现在我不清楚怎么获取Timeline里第m帧开始某动画x,第n帧结束这些行为。同时怎么能给动画打上对应Tag?

A1:Timeline的组成如下图:

1.png

每个Track对应一个TrackAsset其实就是一个PlayableAsset,整个Timeline也是一个TimelineAsset,里面存了所有Track的数据。

2.png

对于每个Clip的开始和结束时间在TimelineClip中可以获取。

3.png

4.png

感谢羽飞@UWA问答社区提供了回答

A2:我把基于Timeline的编辑器小Demo共享上来。

5.png

技能编辑器Demo

以上是本人摸索着写的一个简单技能编辑器Demo,基于Timeline的。

感谢题主右前锋@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/61c00a17d8413e18eb546b3b

Q:在UI中使用到的Shader中用到了UV1和UV2通道,在Canvas AdditionalShaderChannels中选择添加了对应通道后没有效果,相同代码资源在2019.4.26f1c1正确显示,请教大家是否是版本问题还是需要特殊设置处理?

Unity版本:2018.4.17f1

6.png

7.png

Unity版本:2019.4.26f1c1

8.png

9.png

A:搜索了一下Unity Release Note,在Unity 2019.2.0版本中发现Unity修复了这个问题。修复后,AddVert会把UV2的数据和UV3的数据也拷贝进去。没修复前,UV2的数据从RenderDoc里面看是0。

10.png

11.png

测试了一下,确实在2019.1.14版本还是有问题的,下一个版本2019.2.0就没问题了。

在2018.4.23f1版本上参考这个链接的Outline效果进行了测试,在小米9真机上没有发现问题,题主可以参考一下:
https://www.1024sou.com/article/2307.html

PS:看了2018.4.18到2018.4.23之间的所有的Release Note,没有发现相关问题的修复。这个文章是使用Shader来实现Outline的,感觉效果挺不错。

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


Script

Q:nity调用某SDK进行登录,SDK返回的时候取Time.deltaTime比较大(就是从调用SDK开始到SDK返回的时间),这种情况可能导致我在Update里的逻辑经历了很长的一帧。

A1:直接点就是判断Time.deltaTime大于某个阈值时直接Return。

感谢碎心客@UWA问答社区提供了回答

A2:Time.deltaTime比较大也就是说登录操作的耗时很高,而且是一个同步调用,确实会导致卡顿问题(在Update里的逻辑经历了很长的一帧)。

一般来说,网络请求等操作应该尽可能通过异步调用来实现,如果是SDK的登录接口没有提供异步方法,建议先尝试通过子线程(new Thread)来调用,然后主线程上开个协程每帧轮询下结果。

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

封面图来源于网络


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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK