LoopScrollRect icon indicating copy to clipboard operation
LoopScrollRect copied to clipboard

當 Rect Transform 都設為 stretch 時,沒有自動呼叫 ReturnToTempPool 來回收 ScrollCell

Open SyaoranChang opened this issue 2 years ago • 10 comments

你好,

我遇到一個問題 當 Rect Transform 都設為 stretch 時,沒有自動呼叫 ReturnToTempPool 來回收 ScrollCell 的問題 所以會產生所有塞入資料數量的 ScrollCell ,然後全部都是顯示的狀態而沒有回收到 Pool 中 然後之後手動滑動後就"有機會"會正常了

只是在我自己的專案,手動滑動後還是會維持在有問題的狀態 然後似乎在某個數值更新後,就會自動去呼叫 ReturnToTempPool 但不知道為什麼會有畫面應該顯示5個,但只顯示4個,少1個的狀況

問題大概是這樣: Snipaste_2022-04-20_16-34-45

原先預期的處理結果: Snipaste_2022-04-20_16-38-14

遇到問題的結果: Snipaste_2022-04-20_16-37-48

能夠重現的範例場景 DemoScene_MultiCellFullScreen.zip

SyaoranChang avatar Apr 20 '22 08:04 SyaoranChang

剛剛發現 手動拖動後也不會自動去呼叫 ReturnToTempPool 的重現方法 只要從 LoopHorizontalScrollRectMulti 中 移除 Scrollbar 的元件參考 這時移動就不會馬上更新,要移動夠多才會有機會更新自動去呼叫 ReturnToTempPool

只是不知道為什麼在我自己的專案中 手動拖動很多也不會自動更新自動去呼叫 ReturnToTempPool

能夠重現的範例場景 DemoScene_MultiCellFullScreen2.zip

SyaoranChang avatar Apr 20 '22 09:04 SyaoranChang

哈喽,我使用两个附件的场景测试了下没有问题orz

微信图片_20220423190300

如果说没有自动呼叫ReturnToTempPool,可以在对应的UpdateItems里加log输出下contentBoundsviewBounds,或者打断点看下为什么没有进到ReturnToTempPool或者DeleteItemAtEnd/DeleteItemAtStart的逻辑。这块其实判断的很简单:如果content范围>view范围,那说明内容已经超出所需要的范围了,然后检查头部和尾部能不能回收掉一些~

qiankanglai avatar Apr 23 '22 11:04 qiankanglai

我是用 Unity 2020.3.30 不知道有沒有關係? 想說遠端回去公司電腦測試一下 但不知道為什麼unity 現在無法顯示畫面 不知道跟換螢幕後,都換成用 DisplayPort 的線有沒有關係...

這是完整的專案檔案 雖然大概沒什麼差別? LoopScrollRect_Pro.zip

SyaoranChang avatar Apr 23 '22 11:04 SyaoranChang

我目前手头测试的版本是2020.3.33f1,还是比较接近的~ 完整档案我这边也是正常的,待我下一个2020.3.30再测试一下。

无法显示页面是指家里的启动白屏嘛,也许可以尝试下检查显卡驱动或者Editor.log?

qiankanglai avatar Apr 23 '22 11:04 qiankanglai

就這樣 Unity 只看的到 上面的工具列 下面畫面都是黑的沒有更新畫面 Snipaste_2022-04-23_19-55-35

SyaoranChang avatar Apr 23 '22 11:04 SyaoranChang

有一个骚套路可以试一下,譬如强制使用vulkan或者d3d12渲染 (具体参考https://docs.unity3d.com/Manual/EditorCommandLineArguments.html) 看上去确实像是RHI层挂掉了 image

qiankanglai avatar Apr 23 '22 13:04 qiankanglai

遠端Unity 編輯器沒畫面的問題 用 -force-vulkan 測試畫面一樣還是全黑的 用 -force-d3d12 就有畫面了

然後我上傳的測試專案 什麼都沒改 目前 ScrollCell 數量也是正常的跟你的截圖是一樣的 奇怪了...

SyaoranChang avatar Apr 24 '22 13:04 SyaoranChang

-force-d3d12如果有画面那说明确实是和驱动相关,我之前遇到过两个情况可以参考下: 1) 升级驱动 2) 也许和远程桌面有关,参考微软远程桌面开启显卡加速

如果暂时不能稳定复现的话就有点麻烦了,只能下次遇到的时候想办法保存场景

qiankanglai avatar Apr 25 '22 01:04 qiankanglai

剛剛又調整了測試的專案 將物件數量加到40左右

拉到最後面 原先預期 Content上的數量 會比 顯示的數量 還要多左右各1個 所以約是 8 + 2 = 10個 但實際上 Content 上面的數量會是13個左右 前後多拖曳幾次後,數量會不太一樣 Snipaste_2022-04-25_16-28-07

Snipaste_2022-04-25_16-44-08

能夠重現的範例專案 LoopScrollRect_Test.zip

SyaoranChang avatar Apr 25 '22 08:04 SyaoranChang

这里比较难控制在外面有且仅有一个,目前的策略是估算一个threshold(必须大于cell的大小)来实现预加载一个,保证拖拽时候的顺滑。然后有两个地方会影响倒

  • https://github.com/qiankanglai/LoopScrollRect/commit/78714f9fd2427753cd9e3dd0e50a449d2c7f2aa9 里我换了个方式修复#128 同时避免闪烁,已经提交了~
  • 代码里我目前写死threshold是取MaxCellSize的1.5倍,可以改成1.1来进一步压低(这里改小的好处是两侧预加载的cell会变少,但是快速滑动的时候可能会有一丝卡顿) https://github.com/qiankanglai/LoopScrollRect/blob/78714f9fd2427753cd9e3dd0e50a449d2c7f2aa9/Runtime/LoopScrollRectBase.cs#L1058 https://github.com/qiankanglai/LoopScrollRect/blob/78714f9fd2427753cd9e3dd0e50a449d2c7f2aa9/Runtime/LoopScrollRectBase.cs#L1141

qiankanglai avatar May 05 '22 12:05 qiankanglai

剛剛測試似乎沒問題了 感謝修正

SyaoranChang avatar Aug 18 '22 03:08 SyaoranChang