Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML 3.1 - Buffory i optymalizacja VRAM

Ostatnio zmodyfikowano dzisiaj: 2h » 38 min
Autor Wiadomość
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.

P-184870
tBane
Temat założony przez niniejszego użytkownika
» 2026-10-31 02:19:51
Tym bym kolejkował wątki:

C/C++
#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();
       
       
// Dokończ zadania przed zniszczeniem wątku.
       
_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();
           
}
           
           
// Funkcja wykonuje się poza blokadą kolejki.
            // Jej ewentualny wyjątek zostanie zapisany w future.
           
task();
       
}
    }
   
   
std::mutex _mutex;
   
std::condition_variable _condition;
   
std::queue < std::packaged_task < void() >> _tasks;
   
   
bool _stopping = false;
   
std::thread _thread;
};
P-184871
« 1 »
  Strona 1 z 1