我現在的渲染方式並沒有什麼問題,但我覺得這不是處理渲染的好方法。我正在使用SDL。一個乾淨的方式來渲染東西
它歸結到這一點,我有一些抽象類
class Renderable
有兩個功能。
virtual void update() = 0;
virtual void doRender(SDL_Surface* surface) = 0;
我有另一類
class RenderManager
隨着1 std::vector
std::vector<Renderable*> _world;
和2 std::queue
std::queue<Renderable*> _addQueue;
std::queue<Renderable*> _delQueue;
這兩個隊列包含需要添加到下一個滴答的可渲染對象以及需要刪除的可渲染對象。盡一切辦法給了我一些問題,現在我想到了這一點,這是有道理的(至少我是這麼做的)。
可執行文件可以靜態添加和從RenderManager中刪除自己。
這裏或多或少的處理一切的函數。
void renderAll() {
std::vector<Renderable*>::iterator begin, end;
begin = _world.begin();
end = _world.end();
for (;begin != end; ++begin) {
(*begin)->update();
(*begin)->doRender(_mainWindow); // _mainWindow is the screen of course
}
begin = world.begin();
if (_delQueue.size() > 0) {
for (unsigned int i = 0; i < _delQueue.size(); i++) {
std::vector<Renderable*>::iterator del;
del = std::find(begin, end, _delQueue.front());
if (del != end) {
delete *del;
_world.erase(del);
}
_delQueue.pop();
}
}
if (_addQueue.size() > 0) {
for (unsigned int i = 0; i < _addQueue.size(); i++) {
Renderable* front = _addQueue.front();
// _placement is a property of Renderable calculated by RenderManager
// where they can choose the level they want to be rendered on.
_world.insert(begin + front->_placement, front);
_addQueue.pop();
}
}
}
我對C++很陌生,但我想我至少在平均規模上知道我的方式。我甚至更新SDL,但它看起來非常簡單易學。我很擔心,因爲我有3個大環一起。我嘗試了一次,但我在循環過程中遇到了問題,導致了大量的破壞。但我並不是說我做對了! :)
我在想也許是涉及到線程的東西?
編輯:
啊,對不起,含糊不清。 「更清潔」我的意思是更有效。我的方法也沒有「問題」,我只是覺得有一個更有效的方法。
我不明白你的做法。性能? – rasmus 2012-02-10 00:42:59
這是一個很難回答的問題,主要是因爲「渲染」是一個非常普遍的術語,處理它的最佳方式將在很大程度上取決於特定的渲染類型。另外,「最好」是主觀的:你說的是性能最高的?最簡單的代碼? – 2012-02-10 00:44:07
您可以使用[std :: remove](http://www.cplusplus.com/reference/algorithm/remove/)來代替手動循環_delQueue。 – 2012-02-17 12:34:31