Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 23. únor 2023, 19:30:48 Předmět: OpenGL shared_ptr |
|
|
Ahoj, otázka na C++20 guru: Dá se nějak (rozumně) ohnout std::shared_ptr, aby pracoval např. s GLuint místo pointeru, glGenTextures místo new a glDeleteTextures místo delete? _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 23. únor 2023, 21:52:33 Předmět: Re: OpenGL shared_ptr |
|
|
no já sice nejsem C++20 guru, možná tak C++98 guru...
vůbec mi není jasné proč chceš na něco takového používat shared_ptr?
nebylo by jednodušší si to wrapnout do nějakého classu a tam to jednoduše udělat v ctoru/dtoru?
případně můžeš vracet nějaký proxy objekt co bude mít GLuint konverzní operátor, ale to je na můj vkus už velká divočina - pak by to mohlo jít používat jako GLuint z toho shared_ptr při dereferenci, viz link níž
něco takového třeba na godboltu, snad bude link fungovat:
https://godbolt.org/z/McoMbYzYW |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 23. únor 2023, 23:46:54 Předmět: |
|
|
To je taky dobrý Jak to, že mě to nenapadlo? Přiznám se, že z toho prvního examplu jsem to nepochopil. Každopádně díky za tvůj pohled na věc. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 27. únor 2023, 14:19:31 Předmět: |
|
|
Takhle podobně, jako poslal odkaz mar, to používá kolega v práci. Přes ten přetypovávací operator. Používáme už vulkán a tam je tolik šílených struktur, že bylo vhodné na ně udělat pár wrapperů.
Rozhodně bych ale nedoporučil dávat glDeleteTextures (a podobné) přímo do destruktoru toho referencovaného objektu. Samozřejmě záleží na použití, ale je to nebezpečné a nepružné. Zvlášť v OpenGL, který je těma svýma GL kontextama uplně naprd (slušně řečeno). Radši bych vytvořil wrapovací řídu, která bude mít interně referenci na nějaký texture manager. Pak stačí v destruktoru manageru říct, že tato textura je již na vyhození. Manager je pak může smazat v nějaký vhodný okamžik, třeba za pár framů a ve správném threadu. Přitom se snáz ohlídá, jestli je aktivní GL kontext, a tak podobně.
No a tak wrapovací třída může mít opět ten operator GLuint() const, takže bude fungovat i s ostatníma GL funkcema. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
|