2013-04-17 66 views
0

我正在使用CCSpriteBatchNode一次繪製基本上一個像素的線(使用1x1色板)。我需要這樣做,因爲用戶正在控制線路的實時位置(這不是繪圖應用程序,但我認爲我所做的是可比的)。CCSpriteBatchNode停止添加約15k的兒童

事實證明,當我將15-16k的孩子添加到batchNode中時,它會停止註冊新的孩子。基本上,它似乎就像筆用完了!

我在cocos2d代碼中探索了一下,但沒有發現任何問題。它只是停止註冊新的子節點。有人知道爲什麼嗎?

回答

1

首先,讓我的方式,確實是一個巨大的輕描淡寫這樣說:

哎喲!

接下來是技術原因。你的精靈只要你有16.384的批次就會失敗。由於每個精靈都使用一個四邊形(4個頂點)在屏幕上渲染精靈,因此每個批處理操作的頂點數限制爲65.536個頂點。

每個批次操作都不會繪製更多頂點(VBO buffer limit)。這是一個技術限制。你可以嘗試使用另一個CCSpriteBatchNode來獲得更多的精靈 - 但是,嚴肅地說,你會在這裏通往無處可去的道路。

如果你只需要畫線,這可能是我可以想象的最糟糕的方法。考慮使用線條繪製(ccDrawLine),單個像素(我相信ccDrawPixel也存在,但15k像素會非常慢)或着色器來實現相同或相似的效果。您甚至可以使用CCDrawNode使用cocos2d 2.1對圖元進行批處理。

我在YETIPIPI中成功使用的另一個解決方案是使用有限數量的精靈,比如20到200,並將它們繪製到CCRenderTexture。每次添加新的精靈時,都會重新使用最近最少使用的精靈。通過不清除rendertexture,你可以繼續吸引到更少的精靈,而之前繪製的所有東西仍然存在。通過以低透明度繪製精靈,您甚至可以在相同位置繪製更長時間的效果,以使該區域更加不透明。

+0

謝謝,這非常好知道!有趣的是,這種技術到目前爲止一直非常卓越 - 直到你達到極限。我喜歡將精靈繪製到CCRenderTexture的想法,以便它們可以重用。我想知道如果我在不同的繪圖時間改變像素大小,是否會有問題... –