TextInlineSprite icon indicating copy to clipboard operation
TextInlineSprite copied to clipboard

InlineText在列表划动过快时,表情容易位置偏移

Open lizijie opened this issue 5 years ago • 2 comments

渲染一个表情在v3.0的实现里,流程大致如下: 【流程一】 InlineText.OnPopulateMesh转换表情顶点至全局坐标,InlineManager.UpdateTextInfo再将全局坐标转换到SpriteGraphic下的局部坐标。 【流程二】 InlineManager.Update合批相同表情ID的Mesh,转输到SpriteGraphic.OnPopulateMesh作最终渲染。

因为InlineManager.Update合批Mesh,所以这两个流程相差1帧。如果InlineText的坐标在这帧变动了(如列表划动),因为没其它逻辑去强刷缓存在InlineManager的EmojiText.Taurus.MeshInfo坐标,所以SpriteGraphic.OnPopulateMesh使用的是不正确的坐标。结果显示上表情位置偏移了。

像ChatTest样例中,监听ScrollRect.onValueChanged事件,修复SpriteGraphic坐标并未解决以上问题。因为它是与 【流程一】 同帧进行。依然与 【流程二】 相差了1帧。

private void OnSrcollViewChanged(Vector2 pos)
{
    _spriteRect.anchoredPosition = _scrollView.content.anchoredPosition;
}

测试代码如下:

public class Test : MonoBehaviour
{
    public InlineText inText = null;
    public SpriteGraphic graphic = null;

    void Start()
    {
        inText.text = "NewText[#emoji_0]";

		// 模拟在【流程一】与【流程二】中间1帧,修改了InlineText坐标
        graphic.RegisterDirtyVerticesCallback(() =>
        {
            inText.transform.localPosition = new Vector3(200, 200, 0);
        });
    }
}

执行结果如下 image

lizijie avatar Sep 11 '19 10:09 lizijie

兄弟,这个问题找到解决办法了吗? 哪怕是牺牲一些性能对特定的会移动的文本框强制刷新也好

linchenrr avatar Oct 25 '19 03:10 linchenrr

@linchenrr 像UGUI ScrollRect需要平滑过度,每次update强刷表情消耗太大了。我基于InlineText3. 0版本作了修改https://lizijie.github.io/2019/09/18/%E8%AE%B0%E4%B8%80%E6%AC%A1%E4%BF%AE%E6%94%B9unity3d%E5%AF%8C%E6%96%87%E6%9C%AC%E6%8F%92%E4%BB%B6%E7%9A%84%E8%AE%BE%E8%AE%A1%E7%BC%BA%E9%99%B7.html

对于不需要平滑过渡(瞬移),用作者ChatTest例子中监听ScrollRect得滑动事件的方法的可以了

private void OnSrcollViewChanged(Vector2 pos) { _spriteRect.anchoredPosition = _scrollView.content.anchoredPosition; }

lizijie avatar Oct 26 '19 06:10 lizijie