Unigine::CPUShader Class
Header: | #include <UnigineThread.h> |
This class is used to create a custom CPU shader, for example, to implement multi-threaded mesh cluster update. Your custom CPU-shader must be inherited from this class. The corresponding sample is included in the SDK(/samples/Api/Systems/CPUShader/). Engine::swap() always waits for CPU shaders, therefore they cannot be used as tasks. CPU shader is updated with the current framerate of the application.
Here is an example of implementing a custom CPU shader:
struct UpdateClustersCPUShader: public CPUShader
{
UpdateClustersCPUShader() {}
virtual ~UpdateClustersCPUShader()
{
// wait until all asynchronous operations are completed
wait();
}
Vector<AsyncCluster> clusters;
volatile int counter{0};
// overriding the process method to performa our calculations
void process(int thread_num, int threads_count) override
{
UNIGINE_PROFILER_FUNCTION;
while (true)
{
int num = AtomicAdd(&counter, 1);
if (num >= clusters.size())
break;
clusters[num].update();
}
}
void run()
{
for (auto &c : clusters)
c.swap();
counter = 0;
// running shader code in asynchronous mode
runAsync();
}
};
CPUShader Class
Members
static CPUShaderPtr create ( ) #
Default CPUShader class constructor.void runSync ( int threads_count ) #
Runs CPU shader code synchronously. This method is blocking. No additional threads are created, as the Engine's thread pool is used.Arguments
- int threads_count - Number of threads to be used. The default value of -1 sets an optimum number of threads calculated for the particular PC.
void runAsync ( int threads_count ) #
Runs CPU shader code asynchronously. This method is non-blocking. No additional threads are created, as the Engine's thread pool is used.Arguments
- int threads_count - Number of threads to be used. The default value of -1 sets an optimum number of threads calculated for the particular PC.
void wait ( ) #
Waits for running asynchronous shader code execution.int isRunning ( ) #
Returns a value indicating if the CPU shader code is currently executed.Return value
1 if the shader code is currently executed; otherwise, 0.int getNumThreads ( ) #
Returns the currently used number of threads.Return value
Number of currently used threads.virtual void process ( int thread_num, int threads_count ) #
Override this method to implement calculations.Arguments
- int thread_num - Current thread number. This number is not a thread ID, it just a virtual number.
- int threads_count - Number of threads to be used.
Last update:
2021-10-27
Help improve this article
Was this article helpful?
(or select a word/phrase and press Ctrl+Enter)