SFML 3.1 - Buffory i optymalizacja VRAM
Ostatnio zmodyfikowano dzisiaj: 2h » 38 min
tBane Temat założony przez niniejszego użytkownika |
SFML 3.1 - Buffory i optymalizacja VRAM » 2026-10-31 01:42:17 Czy da się w sfml 3.1 zrobić dynamiczne ładowanie modeli. Tj jak model jest ustawiony jako visible to dopiero wtedy ładować jego mesh czyli kopiować go z prefabu jako buffer. Czy to jest optymalne rozwiązanie? Chodzi o to, żeby dla niewidocznych obiektów nie trzymać wierzchołków w bufforze, a dla widocznych już tak. W momencie gdy obiekt stałby się widoczny (sprawdzenie bounding box) to kopiować mesh z prefabu do buffora, a gdy stawiałby się niewidoczny to zwalniać pamięć. Chciałbym to robić na drugim rdzeniu/wątku.  |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-10-31 02:19:51 Tym bym kolejkował wątki: #include <condition_variable> #include <functional> #include <future> #include <mutex> #include <queue> #include <stdexcept> #include <thread> #include <utility>
class Worker { public: Worker() : _thread( & Worker::run, this ) { } Worker( const Worker & ) = delete; Worker & operator =( const Worker & ) = delete; ~Worker() { { std::lock_guard < std::mutex > lock( _mutex ); _stopping = true; } _condition.notify_one(); _thread.join(); } std::future < void > addTask( std::function < void() > function ) { if( !function ) throw std::invalid_argument( "Empty task" ); std::packaged_task < void() > task( std::move( function ) ); std::future < void > result = task.get_future(); { std::lock_guard < std::mutex > lock( _mutex ); if( _stopping ) throw std::runtime_error( "Worker is stopping" ); _tasks.push( std::move( task ) ); } _condition.notify_one(); return result; } private: void run() { for(;; ) { std::packaged_task < void() > task; { std::unique_lock < std::mutex > lock( _mutex ); _condition.wait( lock,[ this ] { return _stopping || !_tasks.empty(); } ); if( _stopping && _tasks.empty() ) return; task = std::move( _tasks.front() ); _tasks.pop(); } task(); } } std::mutex _mutex; std::condition_variable _condition; std::queue < std::packaged_task < void() >> _tasks; bool _stopping = false; std::thread _thread; };
|
|
| « 1 » |