如果您已經使用Box2d,則您已熟悉設置b2Body->userData
屬性,該屬性將用於更新渲染後的形狀x,y座標:Box2D + Opengl ES 2.0(XCode,iPhone):高效更新身體頂點位置
// Physics update:
int32 velocityIterations = 6;
int32 positionIterations = 2;
world->Step(timeDelta, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) {
id obj = (id)b->GetUserData();
if ((obj != NULL)) {
Shape *s = (MyType*)obj;
CGPoint newCentre = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
[s drawAt:newCentre];
}
}
在概念上,用於該數據流的呈現過程非常簡單:創建一個Shape
類來表示每個體中,添加使用OpenGL ES 2.0渲染爲身體所有期望的頂點(具有屬性)一個drawAt
方法,以及具有該類在其座標改變時重繪。
但是,我想通過將所有物體的頂點粘貼到單個頂點緩衝區來優化渲染。因此,我打算修改類Shape
以在頂點所在位置的緩衝區中包含偏移量,然後可以在drawAt
上簡單更新緩衝區中的這些偏移量。
我意識到這些偏移量的管理可能會對緩衝區的添加/移除造成混亂,但是在我的應用程序中這些偏移量並不頻繁,我希望能夠將每一滴渲染性能都擠出管道。
我的問題是:
- 不OpenGL ES 2.0的讓我指定一組頂點作爲 「形狀」,然後可以用一個矩陣運算轉換,或 我必須明確地以這種方式逐個更新頂點?
- 我必須創建一個獨特的可更新對象來分配給每個 b2Body-> userData,還是有一些更有效的做法?
- 在自己的時間軸上更新圖形對象,從關聯的b2Body實例中讀取位置或在上面列出的b2Body更新循環中立即更新圖形對象是更好嗎?
我會很感激一些建議,謝謝。
感謝您的貢獻,iforce2d。我發佈後不久就自己解決了這個問題,並忘記刪除問題。我最終做了你在3推薦的內容,這很好;我現在在每個Shape類中存儲一個b2Body引用,並更新我的形狀,而不是通過b2Body-> userData進行更新。爲了清楚起見:您發佈的代碼是ES 1.x,而不是ES 2。0這正是我正在討論的。 (2)中提出的觀點是我意識到的,但不完全確定如何處理。現在我關注的是單屏視圖,後來我打算探討是否可以限制b2d更新。 – KomodoDave
這與ES 2.0不兼容。 – ManOx