2014-11-02 29 views
13

我對OSN Cocoa編程相當新,但已決定使用新的Swift語言。基於NSTableview View的滾動性能

我有一個NSTableView與1500行(將更多)和7列。有一個複選框列,其餘的是文本字段,其中一個是日期格式的,另外一個是貨幣格式化程序。我首先將其設置爲基於單元格。滾動是but smooth順暢(我甚至做了一個測試,增加了100萬行,仍然平穩)。這是在特立獨行之下。

然後我升級到優勝美地,滾動性能明顯退化。在桌面視圖上啓用核心動畫層複選框可以改善這一點,但仍然比在特立獨行的情況下更糟。

在我的閱讀嘗試提高優勝美地的滾動性能期間,我遇到了「基於視圖」的NSTableViews。從文檔說,基於單元格的表格視圖通常不應該使用,並且只支持傳統項目。

因此,我將表格轉換爲基於視圖的表格視圖。示例簡單的概念,沒有什麼複雜滾動表現絕對糟糕。如果您的滾動速度非常緩慢,但它足夠平滑,但只要您開始更快地滾動滾動,就像它沒有足夠緩衝,並且它開始出現口吃和抽搐。另外,當人口數量較多時,聚焦和散焦窗口需要一秒或更多時間(我再次在小牛隊嘗試過,但這並不存在,滾動效果也稍微好一點,但仍然遠不及細胞基礎)。

是否基於NSTableviews總是不利於滾動性能?如果是這樣的話,爲什麼蘋果推薦在基於單元的NSTableviews上使用它們。

另外一些應用程序,如safari和Reeder2,即使在優勝美地也有順滑的滾動效果。他們如何實現這一目標?

我是否錯過了某些東西,或者是OS X的表現會隨着每一件新事物而下地獄?即

小牛>約塞米蒂

細胞爲基礎>查看基於

舊>新

任何幫助深表感謝。謝謝!

+0

你解決了這個問題嗎? – 2014-12-28 18:49:40

+0

不是。不幸的是,我已經停止開發,並在調用它之前在OS X的下一個版本中再次嘗試。 – Gavin 2015-01-17 11:56:13

+0

您是否報告過雷達上的錯誤?並不是說蘋果會在意,而是出於好奇。我真的覺得,蘋果真的很生氣。只要我在我的大表中使用TextFields,它很流暢,但是一旦我添加了Colorbox/TextField視圖,它就會在滾動時開始吃掉所有的CPU。優勝美地吸收> :-( – 2015-02-20 22:56:30

回答

0

最近他們引入了「重用隊列」的概念,其中只有當前可見的行實際上存在於表中。滾動時,剪出的行被新引入的行所取代。這是爲提高性能而引入的。但考慮到百萬x 7的視圖,我想在重用隊列中可能會浪費很多CPU週期。
與視圖相比,細胞的重量也很輕。


如果可能的話,您可以考慮將單個tableview重構爲多個tableviews。實際上,人類需要在腦海中用至少一些簡單的謂詞來查看數據。例如,在一個組織中,你可能想查看

  1. 所有經理細節
  2. 所有員工有工資比X
  3. 更大所有女員工

,而不是看在全體員工的詳細信息時間。
因此,初始化表視圖時,只有使用所需的信息才能提高性能和UX。

+0

是的,是時候進行分頁了我也做Gtk Linux和Windows GUI客戶端,它們在使用很多項目時都浪費了大量資源,而且我的意思是很多像100兆字節的RAM一樣 – Lothar 2017-12-05 21:44:00

2

我最近發現自己身處一個非常相似的情況,有一個基於細胞的NSOutlineView,在優勝美地之前快速燃燒,在升級到優勝美地後幾乎爬到了停止狀態。

根據我的經驗,在桌面視圖上啓用層疊支持是不夠的,您還必須爲包含您的桌面視圖的NSScrollView啓用它,並且它的編號爲NSClipView

做出這些更改後,我的表格視圖再次加速,但遇到了一些奇怪的視覺工件。這些可能會或可能不會與您的情況相關,因爲您沒有使用在Yosemite中使用新的活力/透明度材料的來源列表NSOutlineView

在任何情況下,只要我轉換爲基於視圖的表格,這些「效果」就會消失。

+1

我確實也有NSOutlineview,並且看到了你所說的視覺文物,他們在使用基於視圖時也消失了,在你從「緩衝」區域滾動出來之後,基於視圖的區域似乎滯後了,這似乎大約在500個物品左右 – Gavin 2014-11-16 00:00:07

+1

也是我現在有一個問題,當桌子滿了(在屏幕上可以看到大約30個條目),窗口花費大約1秒鐘來激活焦點和停用焦點。你是否也有這個,不能找出原因是什麼,嚴格禁用分層支持修復它:S – Gavin 2014-11-16 00:01:39

+0

我沒有看到您所描述的焦點問題,但有幾個其他奇怪問題始於優勝美地。您是否嘗試在滾動和剪輯視圖上啓用圖層備份? – lemonmojo 2014-11-17 12:07:01

0

我有類似的問題。我也是Swift和Apple開發的新手。我的項目運行良好,直到我開始添加1000行或更多行。

在玩了一番之後,我將問題縮小到了基於字典的數據源被訪問的方式。這可能會指向你正確的方向。

func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {... 

return myDictionary.values.array[row] //-- this makes access very slow, jerky with pauses 

return myDictionary[someKey] //-- this makes access a lot faster, smooth and slick 

看起來像我的數據源需要一些重新工作。它還沒有經過大量數據的測試,但一開始似乎有很大的不同。

0

您需要,只需關閉「繪製背景」的文本單元(或組細胞)

enter image description here

3

據蘋果OSX不會被啓用默認QuartzCore(如iOS的,相反,做)。所以,你需要:

  • 鏈接針對QuartzCore.framework您的項目在構建設置窗格下。
  • 在您的主窗口中啓用CoreAnimation圖層(如果可能,請在容器視圖上啓用它,以使您的表現不佳)。

引述蘋果文檔:

在iOS應用,核心動畫始終處於啓用狀態,每個視圖由層支持 。在OS X中,應用程序必須通過執行以下操作明確支持Core Animation 支持:

針對QuartzCore框架的鏈接。通過執行以下操作的 一個(iOS應用必須只如果他們使用的Core Animation接口,明確地將針對 這個框架。) 啓用一個或多個您的NSView對象層支持:

在你的筆尖文件,使用查看效果檢查器以啓用對您的視圖的支持 。檢查員顯示 所選視圖及其子視圖的複選框。建議您儘可能在窗口的內容視圖中啓用 圖層支持。 對於以編程方式創建的視圖,請調用視圖的setWantsLayer: 方法並傳遞值YES以指示視圖應使用 圖層。以上述方式之一啓用層支持將創建一個支持層的視圖。使用分層視圖,系統需要 負責創建底層對象,並且 負責保持該層更新。在OS X,還可以創建一個 層託管視圖,因此您的應用程序實際上是創建和管理 底層對象。 (您不能在 的iOS創建圖層託管的意見。)有關如何創建一個層託管視圖的更多信息,請參見 「圖層主機可以讓你在OS X更改圖層對象」

更多:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html