98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Generic jobs
 | |
| 
 | |
| While Burst supports generics, it has limited support for generic jobs or function pointers. If you notice that a job runs at full speed in the Editor but not in a built Player, the problem might be related to generic jobs.
 | |
| 
 | |
| The following example defines a generic job:
 | |
| 
 | |
| ```c#
 | |
| // Direct generic job
 | |
| [BurstCompile]
 | |
| struct MyGenericJob<TData> : IJob where TData : struct { 
 | |
|     public void Execute() { ... }
 | |
| }
 | |
| ```
 | |
| 
 | |
| You can also nest generic jobs: 
 | |
| 
 | |
| ```c#
 | |
| // Nested generic job
 | |
| public class MyGenericSystem<TData> where TData : struct {
 | |
|     [BurstCompile]
 | |
|     struct MyGenericJob  : IJob { 
 | |
|         public void Execute() { ... }
 | |
|     }
 | |
| 
 | |
|     public void Run()
 | |
|     {
 | |
|         var myJob = new MyGenericJob(); // implicitly MyGenericSystem<TData>.MyGenericJob
 | |
|         myJob.Schedule();    
 | |
|     }
 | |
| }
 | |
| ```
 | |
| 
 | |
| Jobs that are Burst-compiled look like this:
 | |
| 
 | |
| ```c#
 | |
| // Direct Generic Job
 | |
| var myJob = new MyGenericJob<int>();
 | |
| myJob.Schedule();
 | |
| 
 | |
| // Nested Generic Job
 | |
| var myJobSystem = new MyGenericSystem<float>();
 | |
| myJobSystem.Run();
 | |
| ```
 | |
| 
 | |
| In both cases, in a Player build, the Burst compiler detects that it has to compile `MyGenericJob<int>` and `MyGenericJob<float>`. This is because the generic jobs (or the type surrounding it for the nested job) are used with fully resolved generic arguments (`int` and `float`).
 | |
| 
 | |
| However, if these jobs are used indirectly through a generic parameter, the Burst compiler can't detect the jobs it has to compile at Player build time:
 | |
| 
 | |
| ```c#
 | |
| public static void GenericJobSchedule<TData>() where TData: struct {
 | |
|     // Generic argument: Generic Parameter TData
 | |
|     // This Job won't be detected by the Burst Compiler at standalone-player build time.
 | |
|     var job = new MyGenericJob<TData>();
 | |
|     job.Schedule();
 | |
| }
 | |
| 
 | |
| // The implicit MyGenericJob<int> will run at Editor time in full Burst speed
 | |
| // but won't be detected at standalone-player build time.
 | |
| GenericJobSchedule<int>();
 | |
| ```
 | |
| 
 | |
| The same restriction applies if you declare the job in the context of a generic parameter that comes from a type:
 | |
| 
 | |
| ```c#
 | |
| // Generic Parameter TData
 | |
| public class SuperJobSystem<TData>
 | |
| {
 | |
|     // Generic argument: Generic Parameter TData
 | |
|     // This Job won't be detected by the Burst Compiler at standalone-player build time.
 | |
|     public MyGenericJob<TData> MyJob;
 | |
| }
 | |
| ```
 | |
| 
 | |
| If you want to use generic jobs, you must use them directly with fully resolved generic arguments (for example, `int`, `MyOtherStruct`). You can't use them with a generic parameter indirection (for example, `MyGenericJob<TContext>`).
 | |
| 
 | |
| >[!IMPORTANT]
 | |
| >Burst doesn't support scheduling generic Jobs through generic methods.
 | |
| 
 | |
| ## Function pointers
 | |
| 
 | |
| Function pointers are restricted because you can't use a generic delegate through a function pointer with Burst:
 | |
| 
 | |
| ```c#
 | |
| public delegate void MyGenericDelegate<T>(ref TData data) where TData: struct;
 | |
| 
 | |
| var myGenericDelegate = new MyGenericDelegate<int>(MyIntDelegateImpl);
 | |
| // Will fail to compile this function pointer.
 | |
| var myGenericFunctionPointer = BurstCompiler.CompileFunctionPointer<MyGenericDelegate<int>>(myGenericDelegate);
 | |
| ```
 | |
| 
 | |
| This limitation is because of a limitation of the .NET runtime to interop with such delegates.
 | |
| 
 | |
| For more information, refer to [Function pointers](csharp-function-pointers.md).
 | |
| 
 | |
| ## Additional resources
 | |
| 
 | |
| * [Burst compilation in Play mode](compilation-synchronous.md)
 | |
| * [Job system](xref:um-job-system) |