ПотокобезопаÑное API Ð´Ð»Ñ Job System в Unity 2019.1
(Russian translation from English by Maxim Voloshin)
С каждым новым релизом Unity, добавлÑетÑÑ Ð²Ñе больше и больше потокобезопаÑного API Ð´Ð»Ñ Job System. Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð¼Ñ‹ поÑмотрим на Ñамое новое API и изучим как можно перемеÑтить еще больше кода в выÑокопроизводительные задачи C#.
Ð’ предыдущей Ñтатье, мы начали иÑпользовать Ñкрипт редактора, чтобы найти вÑе методы и ÑвойÑтва во вÑех DLL, которые Ñодержат [NativeMethod]
и IsThreadSafe = true
. Ðтот Ñкрипт нашел 301 потокобезопаÑную функцию в Unity 2018.1.3f2. ЗапуÑк того же Ñамого Ñкрипта Ñ Unity 2019.1.3f1 выводит Ñледующий ÑпиÑок из 350 функций:
ActiveEditorTracker: Void Internal_Create(UnityEditor.ActiveEditorTracker) ActiveEditorTracker: Void Internal_Create(UnityEditor.ActiveEditorTracker) ActiveEditorTracker: Void Internal_Dispose(UnityEditor.ActiveEditorTracker) ActiveEditorTracker: Void Internal_Dispose(UnityEditor.ActiveEditorTracker) Analytics: Boolean IsInitialized() Analytics: Boolean QueueEvent(System.String, System.Object, Int32, System.String) Analytics: UnityEngine.Analytics.AnalyticsResult SendEventWithLimit(System.String, System.Object, Int32, System.String) AnimationCurve: Int32 AddKey_Internal(UnityEngine.Keyframe) AnimationCurve: IntPtr Internal_Create(UnityEngine.Keyframe[]) AnimationCurve: UnityEngine.Keyframe GetKey(Int32) AnimationCurve: UnityEngine.Keyframe[] GetKeys() AnimationCurve: Void Internal_Destroy(IntPtr) AnimationCurve: Void SetKeys(UnityEngine.Keyframe[]) AnimationHumanStream: Single GetFootHeight(Boolean) AnimationHumanStream: Single GetHumanScale() AnimationHumanStream: Single InternalGetGoalWeightPosition(UnityEngine.AvatarIKGoal) AnimationHumanStream: Single InternalGetGoalWeightRotation(UnityEngine.AvatarIKGoal) AnimationHumanStream: Single InternalGetHintWeightPosition(UnityEngine.AvatarIKHint) AnimationHumanStream: Single InternalGetMuscle(UnityEngine.Experimental.Animations.MuscleHandle) AnimationHumanStream: UnityEngine.Quaternion InternalGetBodyLocalRotation() AnimationHumanStream: UnityEngine.Quaternion InternalGetBodyRotation() AnimationHumanStream: UnityEngine.Quaternion InternalGetGoalLocalRotation(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Quaternion InternalGetGoalRotation(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Quaternion InternalGetGoalRotationFromPose(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Vector3 GetLeftFootVelocity() AnimationHumanStream: UnityEngine.Vector3 GetRightFootVelocity() AnimationHumanStream: UnityEngine.Vector3 InternalGetBodyLocalPosition() AnimationHumanStream: UnityEngine.Vector3 InternalGetBodyPosition() AnimationHumanStream: UnityEngine.Vector3 InternalGetGoalLocalPosition(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Vector3 InternalGetGoalPosition(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Vector3 InternalGetGoalPositionFromPose(UnityEngine.AvatarIKGoal) AnimationHumanStream: UnityEngine.Vector3 InternalGetHintPosition(UnityEngine.AvatarIKHint) AnimationHumanStream: Void InternalResetToStancePose() AnimationHumanStream: Void InternalSetBodyLocalPosition(UnityEngine.Vector3) AnimationHumanStream: Void InternalSetBodyLocalRotation(UnityEngine.Quaternion) AnimationHumanStream: Void InternalSetBodyPosition(UnityEngine.Vector3) AnimationHumanStream: Void InternalSetBodyRotation(UnityEngine.Quaternion) AnimationHumanStream: Void InternalSetGoalLocalPosition(UnityEngine.AvatarIKGoal, UnityEngine.Vector3) AnimationHumanStream: Void InternalSetGoalLocalRotation(UnityEngine.AvatarIKGoal, UnityEngine.Quaternion) AnimationHumanStream: Void InternalSetGoalPosition(UnityEngine.AvatarIKGoal, UnityEngine.Vector3) AnimationHumanStream: Void InternalSetGoalRotation(UnityEngine.AvatarIKGoal, UnityEngine.Quaternion) AnimationHumanStream: Void InternalSetGoalWeightPosition(UnityEngine.AvatarIKGoal, Single) AnimationHumanStream: Void InternalSetGoalWeightRotation(UnityEngine.AvatarIKGoal, Single) AnimationHumanStream: Void InternalSetHintPosition(UnityEngine.AvatarIKHint, UnityEngine.Vector3) AnimationHumanStream: Void InternalSetHintWeightPosition(UnityEngine.AvatarIKHint, Single) AnimationHumanStream: Void InternalSetLookAtBodyWeight(Single) AnimationHumanStream: Void InternalSetLookAtClampWeight(Single) AnimationHumanStream: Void InternalSetLookAtEyesWeight(Single) AnimationHumanStream: Void InternalSetLookAtHeadWeight(Single) AnimationHumanStream: Void InternalSetLookAtPosition(UnityEngine.Vector3) AnimationHumanStream: Void InternalSetMuscle(UnityEngine.Experimental.Animations.MuscleHandle, Single) AnimationHumanStream: Void InternalSolveIK() AnimationStream: Boolean GetIsHumanStream() AnimationStream: Int32 GetInputStreamCount() AnimationStream: Single GetDeltaTime() AnimationStream: Single InternalGetInputWeight(Int32) AnimationStream: UnityEngine.Experimental.Animations.AnimationHumanStream GetHumanStream() AnimationStream: UnityEngine.Experimental.Animations.AnimationStream InternalGetInputStream(Int32) AnimationStream: UnityEngine.Quaternion GetRootMotionRotation() AnimationStream: UnityEngine.Vector3 GetAngularVelocity() AnimationStream: UnityEngine.Vector3 GetRootMotionPosition() AnimationStream: UnityEngine.Vector3 GetVelocity() AnimationStream: Void InternalReadSceneTransforms() AnimationStream: Void InternalWriteSceneTransforms() AnimationStream: Void SetAngularVelocity(UnityEngine.Vector3) AnimationStream: Void SetVelocity(UnityEngine.Vector3) AnimatorControllerPlayable: Int32 StringToHash(System.String) Asset: IntPtr Create(System.String) Asset: IntPtr Create(System.String) Asset: States GetState(IntPtr) Asset: States GetState(IntPtr) Asset: Void Destroy(IntPtr) Asset: Void Destroy(IntPtr) AssetBundle: UnityEngine.Object returnMainAsset(UnityEngine.AssetBundle) AsyncOperation: Void InternalDestroy(IntPtr) AsyncReadManager: Unity.IO.LowLevel.Unsafe.ReadHandle ReadInternal(System.String, Void*, UInt32) AtomicSafetyHandle: Void CheckReadAndThrowNoEarlyOut(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle) AtomicSafetyHandle: Void CheckWriteAndThrowNoEarlyOut(Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle) AudioSampleProvider: Boolean InternalGetEnableSampleFramesAvailableEvents(UInt32) AudioSampleProvider: Boolean InternalGetEnableSilencePadding(UInt32) AudioSampleProvider: Boolean InternalIsValid(UInt32) AudioSampleProvider: IntPtr InternalGetConsumeSampleFramesNativeFunctionPtr() AudioSampleProvider: UInt32 InternalCreateSampleProvider(UInt16, UInt32) AudioSampleProvider: UInt32 InternalGetAvailableSampleFrameCount(UInt32) AudioSampleProvider: UInt32 InternalGetFreeSampleFrameCount(UInt32) AudioSampleProvider: UInt32 InternalGetFreeSampleFrameCountLowThreshold(UInt32) AudioSampleProvider: UInt32 InternalGetMaxSampleFrameCount(UInt32) AudioSampleProvider: UInt32 InternalQueueSampleFrames(UInt32, IntPtr, UInt32) AudioSampleProvider: Void InternalGetFormatInfo(UInt32, UInt16 ByRef, UInt32 ByRef) AudioSampleProvider: Void InternalRemove(UInt32) AudioSampleProvider: Void InternalSetEnableSampleFramesAvailableEvents(UInt32, Boolean) AudioSampleProvider: Void InternalSetEnableSilencePadding(UInt32, Boolean) AudioSampleProvider: Void InternalSetFreeSampleFrameCountLowThreshold(UInt32, UInt32) AudioSampleProvider: Void InternalSetScriptingPtr(UInt32, UnityEngine.Experimental.Audio.AudioSampleProvider) Bounds: Boolean IntersectRayAABB(UnityEngine.Ray, UnityEngine.Bounds, Single ByRef) BuildPipeline: Boolean LicenseCheck(UnityEditor.BuildTarget) BuildPipeline: Boolean LicenseCheck(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildTargetName(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildTargetName(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildToolsDirectory(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildToolsDirectory(UnityEditor.BuildTarget) BuildPipeline: System.String GetEditorTargetName() BuildPipeline: System.String GetEditorTargetName() BuildPipeline: System.String GetPlaybackEngineExtensionDirectory(UnityEditor.BuildTargetGroup, UnityEditor.BuildTarget, UnityEditor.BuildOptions) BuildPipeline: System.String GetPlaybackEngineExtensionDirectory(UnityEditor.BuildTargetGroup, UnityEditor.BuildTarget, UnityEditor.BuildOptions) BuildReferenceMap: IntPtr Internal_Create() BuildReferenceMap: IntPtr Internal_Create() BuildReferenceMap: Void Internal_Destroy(IntPtr) BuildReferenceMap: Void Internal_Destroy(IntPtr) BuildUsageCache: IntPtr Internal_Create() BuildUsageCache: IntPtr Internal_Create() BuildUsageCache: Void Internal_Destroy(IntPtr) BuildUsageCache: Void Internal_Destroy(IntPtr) BuildUsageTagSet: IntPtr Internal_Create() BuildUsageTagSet: IntPtr Internal_Create() BuildUsageTagSet: Void Internal_Destroy(IntPtr) BuildUsageTagSet: Void Internal_Destroy(IntPtr) CertificateHandler: Void Release() ChangeSet: IntPtr Create() ChangeSet: IntPtr Create() ChangeSet: IntPtr CreateFromCopy(UnityEditor.VersionControl.ChangeSet) ChangeSet: IntPtr CreateFromCopy(UnityEditor.VersionControl.ChangeSet) ChangeSet: IntPtr CreateFromString(System.String) ChangeSet: IntPtr CreateFromString(System.String) ChangeSet: IntPtr CreateFromStringString(System.String, System.String) ChangeSet: IntPtr CreateFromStringString(System.String, System.String) ChangeSet: Void Destroy(IntPtr) ChangeSet: Void Destroy(IntPtr) Collab: UnityEditor.Collaboration.Change[] GetSelectedChangesInternal() Collab: UnityEditor.Collaboration.Change[] GetSelectedChangesInternal() Collab: Void SetChangesToPublishInternal(UnityEditor.Collaboration.ChangeItem[]) Collab: Void SetChangesToPublishInternal(UnityEditor.Collaboration.ChangeItem[]) CommandBuffer: Void ReleaseBuffer() ComputeBuffer: Int32 GetLineNumber() ComputeBuffer: System.String GetFileName() ConfigField: Void Destroy(IntPtr) ConfigField: Void Destroy(IntPtr) ConnectionConfigInternal: Void InternalDestroy(IntPtr) ConnectionSimulatorConfigInternal: Void InternalDestroy(IntPtr) Coroutine: Void ReleaseCoroutine(IntPtr) CrashReport: Boolean RemoveReport(System.String) CrashReport: System.String GetReportData(System.String, Double ByRef) CrashReport: System.String[] GetReports() CullingGroup: Void FinalizerFailure() CustomEventData: Void Internal_Destroy(IntPtr) CustomSampler: IntPtr CreateInternal(System.String) CustomSampler: Void BeginWithObject(UnityEngine.Object) Device: Void SettvOSNoBackupFlag(System.String) Device: Void tvOSResetNoBackupFlag(System.String) DictationRecognizer: Void DestroyThreaded(IntPtr) DownloadHandler: Void Release() DSPSampleProvider: Int32 Internal_ReadFloatFromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, Void*, Int32) DSPSampleProvider: Int32 Internal_ReadSInt16FromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, NativeFormatType, Void*, Int32) DSPSampleProvider: Int32 Internal_ReadUInt8FromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, NativeFormatType, Void*, Int32) DSPSampleProvider: UInt16 Internal_GetChannelCount(Unity.Experimental.Audio.DSPSampleProvider) DSPSampleProvider: UInt32 Internal_GetSampleRate(Unity.Experimental.Audio.DSPSampleProvider) Event: IntPtr Internal_Copy(IntPtr) Event: IntPtr Internal_Create(Int32) Event: Void CopyFromPtr(IntPtr) Event: Void Internal_Destroy(IntPtr) ExecuteContextInternal: Void Internal_PostEvent(Void*, Int64, Void*, Int32) FontEngine: Boolean TryAddGlyphsToTexture_Internal(UInt32[], Int32, UnityEngine.TextCore.LowLevel.GlyphPackingMode, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.LowLevel.GlyphRenderMode, UnityEngine.Texture2D, UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct[], Int32 ByRef) FontEngine: Boolean TryAddGlyphToTexture_Internal(UInt32, Int32, UnityEngine.TextCore.LowLevel.GlyphPackingMode, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.LowLevel.GlyphRenderMode, UnityEngine.Texture2D, UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct ByRef) FontEngine: Boolean TryGetGlyphWithIndexValue_Internal(UInt32, UnityEngine.TextCore.LowLevel.GlyphLoadFlags, UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct ByRef) FontEngine: Boolean TryGetGlyphWithUnicodeValue_Internal(UInt32, UnityEngine.TextCore.LowLevel.GlyphLoadFlags, UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct ByRef) FontEngine: Boolean TryPackGlyphInAtlas_Internal(UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct ByRef, Int32, UnityEngine.TextCore.LowLevel.GlyphPackingMode, UnityEngine.TextCore.LowLevel.GlyphRenderMode, Int32, Int32, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.GlyphRect[], Int32 ByRef) FontEngine: Boolean TryPackGlyphsInAtlas_Internal(UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct[], Int32 ByRef, UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct[], Int32 ByRef, Int32, UnityEngine.TextCore.LowLevel.GlyphPackingMode, UnityEngine.TextCore.LowLevel.GlyphRenderMode, Int32, Int32, UnityEngine.TextCore.GlyphRect[], Int32 ByRef, UnityEngine.TextCore.GlyphRect[], Int32 ByRef) FontEngine: Int32 GetFaceInfo_Internal(UnityEngine.TextCore.FaceInfo ByRef) FontEngine: Int32 LoadGlyph_Internal(UInt32, UnityEngine.TextCore.LowLevel.GlyphLoadFlags) FontEngine: Int32 RenderGlyphsToSharedTexture_Internal(UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct[], Int32, Int32, UnityEngine.TextCore.LowLevel.GlyphRenderMode) FontEngine: Int32 RenderGlyphsToTextureBuffer_Internal(UnityEngine.TextCore.LowLevel.GlyphMarshallingStruct[], Int32, Int32, UnityEngine.TextCore.LowLevel.GlyphRenderMode, Byte[], Int32, Int32) FontEngine: Int32 SetFaceSize_Internal(Int32) FontEngine: UInt32 GetGlyphIndex(UInt32) FontEngine: Void ReleaseSharedTexture() GcLeaderboard: Void GcLeaderboard_Dispose(IntPtr) GlobalConfigInternal: Void InternalDestroy(IntPtr) Gradient: Boolean Internal_Equals(IntPtr) Gradient: IntPtr Init() Gradient: Void Cleanup() GUIStyle: IntPtr GetStyleStatePtr(Int32) GUIStyle: IntPtr Internal_Copy(UnityEngine.GUIStyle, UnityEngine.GUIStyle) GUIStyle: IntPtr Internal_Create(UnityEngine.GUIStyle) GUIStyle: Void Internal_Destroy(IntPtr) GUIStyleState: IntPtr Init() GUIStyleState: Void Cleanup() HierarchyFrameDataView: IntPtr Internal_Create(Int32, Int32, ViewModes, Int32, Boolean) HierarchyFrameDataView: IntPtr Internal_Create(Int32, Int32, ViewModes, Int32, Boolean) HierarchyFrameDataView: Void Internal_Destroy(IntPtr) HierarchyFrameDataView: Void Internal_Destroy(IntPtr) HostTopologyInternal: Void InternalDestroy(IntPtr) InternalEditorUtility: Boolean HasUFSTLicense() InternalEditorUtility: Boolean HasUFSTLicense() JsonUtility: System.Object FromJsonInternal(System.String, System.Object, System.Type) JsonUtility: System.Object FromJsonInternal(System.String, System.Object, System.Type) JsonUtility: System.String ToJsonInternal(System.Object, Boolean) JsonUtility: System.String ToJsonInternal(System.Object, Boolean) LineUtility: Void GeneratePointsToKeep2D(System.Object, Single, System.Object) LineUtility: Void GeneratePointsToKeep3D(System.Object, Single, System.Object) LineUtility: Void GenerateSimplifiedPoints2D(System.Object, Single, System.Object) LineUtility: Void GenerateSimplifiedPoints3D(System.Object, Single, System.Object) MaterialPropertyBlock: Void DestroyImpl(IntPtr) Matrix4x4: Boolean IsIdentity() Matrix4x4: Single GetDeterminant() Matrix4x4: UnityEngine.FrustumPlanes DecomposeProjection() Matrix4x4: UnityEngine.Quaternion GetRotation() Matrix4x4: UnityEngine.Vector3 GetLossyScale() Message: Void Destroy(IntPtr) Message: Void Destroy(IntPtr) Microphone: Int32 GetMicrophoneDeviceIDFromName(System.String) Microphone: Int32 GetRecordPosition(Int32) MonoBehaviour: Void ConstructorCheck(UnityEngine.Object) Native: Void YGConfigFreeInternal(IntPtr) Native: Void YGNodeFreeInternal(IntPtr) NativeFormatImporterUtility: System.String Internal_GetExtensionForNativeAsset(UnityEngine.Object) NativeFormatImporterUtility: System.String Internal_GetExtensionForNativeAsset(UnityEngine.Object) NativeFormatImporterUtility: System.Type Internal_GetNativeTypeForExtension(System.String, Boolean ByRef) NativeFormatImporterUtility: System.Type Internal_GetNativeTypeForExtension(System.String, Boolean ByRef) NavMeshQuery: Boolean GetPortalPoints(IntPtr, UnityEngine.Experimental.AI.PolygonId, UnityEngine.Experimental.AI.PolygonId, UnityEngine.Vector3 ByRef, UnityEngine.Vector3 ByRef) NavMeshQuery: Boolean HasNodePool(IntPtr) NavMeshQuery: Boolean IsPositionInPolygon(IntPtr, UnityEngine.Vector3, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: Boolean IsValidPolygon(IntPtr, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: Int32 GetAgentTypeIdForPolygon(IntPtr, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: Int32 GetPathResult(IntPtr, Void*, Int32) NavMeshQuery: UnityEngine.Experimental.AI.NavMeshLocation MapLocation(IntPtr, UnityEngine.Vector3, UnityEngine.Vector3, Int32, Int32) NavMeshQuery: UnityEngine.Experimental.AI.NavMeshLocation MoveLocation(IntPtr, UnityEngine.Experimental.AI.NavMeshLocation, UnityEngine.Vector3, Int32) NavMeshQuery: UnityEngine.Experimental.AI.NavMeshPolyTypes GetPolygonType(IntPtr, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: UnityEngine.Experimental.AI.PathQueryStatus BeginFindPath(IntPtr, UnityEngine.Experimental.AI.NavMeshLocation, UnityEngine.Experimental.AI.NavMeshLocation, Int32, Void*) NavMeshQuery: UnityEngine.Experimental.AI.PathQueryStatus EndFindPath(IntPtr, Int32 ByRef) NavMeshQuery: UnityEngine.Experimental.AI.PathQueryStatus GetClosestPointOnPoly(IntPtr, UnityEngine.Experimental.AI.PolygonId, UnityEngine.Vector3, UnityEngine.Vector3 ByRef) NavMeshQuery: UnityEngine.Experimental.AI.PathQueryStatus Raycast(IntPtr, UnityEngine.Experimental.AI.NavMeshLocation, UnityEngine.Vector3, Int32, Void*, UnityEngine.AI.NavMeshHit ByRef, Void*, Int32 ByRef, Int32) NavMeshQuery: UnityEngine.Experimental.AI.PathQueryStatus UpdateFindPath(IntPtr, Int32, Int32 ByRef) NavMeshQuery: UnityEngine.Matrix4x4 PolygonLocalToWorldMatrix(IntPtr, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: UnityEngine.Matrix4x4 PolygonWorldToLocalMatrix(IntPtr, UnityEngine.Experimental.AI.PolygonId) NavMeshQuery: Void MoveLocations(IntPtr, Void*, Void*, Void*, Int32) NavMeshQuery: Void MoveLocationsInSameAreas(IntPtr, Void*, Void*, Int32, Int32) NotificationHelper: Void DestroyLocal(IntPtr) NotificationHelper: Void DestroyRemote(IntPtr) Object: Boolean CurrentThreadIsMainThread() Object: Boolean DoesObjectWithInstanceIDExist(Int32) Object: Int32 GetOffsetOfInstanceIDInCPlusPlusObject() ObjectGUIState: Void Internal_Destroy(IntPtr) OnDemandResourcesRequest: Void DestroyFromScript(IntPtr) PhraseRecognizer: Void DestroyThreaded(IntPtr) Ping: Void Internal_Destroy(IntPtr) Plugin: Void Destroy(IntPtr) Plugin: Void Destroy(IntPtr) Profiler: Void BeginSampleImpl(System.String, UnityEngine.Object) Profiler: Void BeginThreadProfilingInternal(System.String, System.String) Profiler: Void Internal_EmitFrameMetaData_Array(Byte[], Int32, System.Array, Int32, Int32) Profiler: Void Internal_EmitFrameMetaData_Native(Byte[], Int32, IntPtr, Int32, Int32) ProfilerFrameDataIterator: Void Internal_Destroy(IntPtr) ProfilerFrameDataIterator: Void Internal_Destroy(IntPtr) ProfilerMarker: IntPtr Internal_Create(System.String, Unity.Profiling.MarkerFlags) ProfilerMarker: Void Internal_Begin(IntPtr) ProfilerMarker: Void Internal_BeginWithObject(IntPtr, UnityEngine.Object) ProfilerMarker: Void Internal_End(IntPtr) ProfilerProperty: Void Internal_Delete(IntPtr) ProfilerProperty: Void Internal_Delete(IntPtr) PropertySceneHandle: Boolean GetBoolInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertySceneHandle: Boolean HasValidTransform(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertySceneHandle: Boolean IsBound(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertySceneHandle: Int32 GetIntInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertySceneHandle: Single GetFloatInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertySceneHandle: Void ResolveInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertyStreamHandle: Boolean GetBoolInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertyStreamHandle: Int32 GetIntInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertyStreamHandle: Single GetFloatInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertyStreamHandle: Void ResolveInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) PropertyStreamHandle: Void SetBoolInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Boolean) PropertyStreamHandle: Void SetFloatInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Single) PropertyStreamHandle: Void SetIntInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Int32) Quaternion: UnityEngine.Quaternion Internal_FromEulerRad(UnityEngine.Vector3) Quaternion: UnityEngine.Vector3 Internal_ToEulerRad(UnityEngine.Quaternion) Quaternion: Void Internal_ToAxisAngleRad(UnityEngine.Quaternion, UnityEngine.Vector3 ByRef, Single ByRef) ReadHandle: Boolean IsReadHandleValid(Unity.IO.LowLevel.Unsafe.ReadHandle) ReadHandle: Unity.IO.LowLevel.Unsafe.ReadStatus GetReadStatus(Unity.IO.LowLevel.Unsafe.ReadHandle) ReadHandle: Unity.Jobs.JobHandle GetJobHandle(Unity.IO.LowLevel.Unsafe.ReadHandle) ReadHandle: Void ReleaseReadHandle(Unity.IO.LowLevel.Unsafe.ReadHandle) Recorder: Boolean IsEnabled() Recorder: Int32 GetSampleBlockCount() Recorder: Int64 GetElapsedNanoseconds() Recorder: Void DisposeNative(IntPtr) Recorder: Void SetEnabled(Boolean) RemoteConfigSettings: Void Internal_Destroy(IntPtr) ResourceContext: Void Internal_FreeArray(Void*, Void*) ResourceContext: Void* Internal_AllocateArray(Void*, Int32) Sampler: System.String GetSamplerName() ScriptableObject: Void CreateScriptableObject(UnityEngine.ScriptableObject) SerializedObject: Void Internal_Destroy(IntPtr) SerializedObject: Void Internal_Destroy(IntPtr) SerializedObjectChangeTracker: Void Internal_Destroy(IntPtr) SerializedObjectChangeTracker: Void Internal_Destroy(IntPtr) SerializedProperty: Void Internal_Destroy(IntPtr) SerializedProperty: Void Internal_Destroy(IntPtr) Task: Void Destroy(IntPtr) Task: Void Destroy(IntPtr) TerrainData: Int32 GetBoundaryValue(BoundaryValueType) TextGenerator: IntPtr Internal_Create() TextGenerator: Void Internal_Destroy(IntPtr) TouchScreenKeyboard: Void Internal_Destroy(IntPtr) TransformAccess: Void GetLocalPosition(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void GetLocalRotation(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Quaternion ByRef) TransformAccess: Void GetLocalScale(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void GetPosition(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void GetRotation(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Quaternion ByRef) TransformAccess: Void SetLocalPosition(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void SetLocalRotation(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Quaternion ByRef) TransformAccess: Void SetLocalScale(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void SetPosition(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Vector3 ByRef) TransformAccess: Void SetRotation(UnityEngine.Jobs.TransformAccess ByRef, UnityEngine.Quaternion ByRef) TransformAccessArray: IntPtr GetSortedToUserIndex(IntPtr) TransformAccessArray: IntPtr GetSortedTransformAccess(IntPtr) TransformSceneHandle: Boolean HasValidTransform(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformSceneHandle: UnityEngine.Quaternion GetLocalRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformSceneHandle: UnityEngine.Quaternion GetRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformSceneHandle: UnityEngine.Vector3 GetLocalPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformSceneHandle: UnityEngine.Vector3 GetLocalScaleInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformSceneHandle: UnityEngine.Vector3 GetPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: UnityEngine.Quaternion GetLocalRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: UnityEngine.Quaternion GetRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: UnityEngine.Vector3 GetLocalPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: UnityEngine.Vector3 GetLocalScaleInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: UnityEngine.Vector3 GetPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: Void ResolveInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef) TransformStreamHandle: Void SetLocalPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformStreamHandle: Void SetLocalRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Quaternion) TransformStreamHandle: Void SetLocalScaleInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformStreamHandle: Void SetPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformStreamHandle: Void SetRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Quaternion) TypeDB: IntPtr Internal_Create() TypeDB: IntPtr Internal_Create() TypeDB: Void Internal_Destroy(IntPtr) TypeDB: Void Internal_Destroy(IntPtr) UnityLogWriter: Void WriteStringToUnityLogImpl(System.String) UnityWebRequest: System.String GetWebErrorString(UnityWebRequestError) UnityWebRequest: Void Release() UnsafeUtility: Int32 GetFieldOffsetInClass(System.Reflection.FieldInfo) UnsafeUtility: Int32 GetFieldOffsetInStruct(System.Reflection.FieldInfo) UnsafeUtility: Void LogError(System.String, System.String, Int32) UnsafeUtility: Void* PinSystemArrayAndGetAddress(System.Object, UInt64 ByRef) UnsafeUtility: Void* PinSystemObjectAndGetAddress(System.Object, UInt64 ByRef) UploadHandler: Void Release() Vector3: Void OrthoNormalize2(UnityEngine.Vector3 ByRef, UnityEngine.Vector3 ByRef) Vector3: Void OrthoNormalize3(UnityEngine.Vector3 ByRef, UnityEngine.Vector3 ByRef, UnityEngine.Vector3 ByRef) VFXCPUBufferData: Void Internal_Destroy(IntPtr) VFXCPUBufferData: Void Internal_Destroy(IntPtr) VFXEventAttribute: Void Internal_Destroy(IntPtr) VFXSpawnerState: Void Internal_Destroy(IntPtr) WaveformStreamer: Void Internal_WaveformStreamerDestroy(IntPtr) WaveformStreamer: Void Internal_WaveformStreamerDestroy(IntPtr)
ÐашлоÑÑŒ 59 новых функций:
ActiveEditorTracker: Void Internal_Create(UnityEditor.ActiveEditorTracker) ActiveEditorTracker: Void Internal_Dispose(UnityEditor.ActiveEditorTracker) AnimationStream: Single InternalGetInputWeight(Int32) Asset: IntPtr Create(System.String) Asset: States GetState(IntPtr) Asset: Void Destroy(IntPtr) AudioSampleProvider: UInt32 InternalCreateSampleProvider(UInt16, UInt32) AudioSampleProvider: UInt32 InternalQueueSampleFrames(UInt32, IntPtr, UInt32) AudioSampleProvider: Void InternalGetFormatInfo(UInt32, UInt16 ByRef, UInt32 ByRef) AudioSampleProvider: Void InternalRemove(UInt32) BuildPipeline: Boolean LicenseCheck(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildTargetName(UnityEditor.BuildTarget) BuildPipeline: System.String GetBuildToolsDirectory(UnityEditor.BuildTarget) BuildPipeline: System.String GetEditorTargetName() BuildReferenceMap: IntPtr Internal_Create() BuildReferenceMap: Void Internal_Destroy(IntPtr) BuildUsageCache: IntPtr Internal_Create() BuildUsageCache: Void Internal_Destroy(IntPtr) BuildUsageTagSet: IntPtr Internal_Create() BuildUsageTagSet: Void Internal_Destroy(IntPtr) ChangeSet: IntPtr Create() ChangeSet: IntPtr CreateFromCopy(UnityEditor.VersionControl.ChangeSet) ChangeSet: IntPtr CreateFromString(System.String) ChangeSet: IntPtr CreateFromStringString(System.String, System.String) ChangeSet: Void Destroy(IntPtr) Collab: UnityEditor.Collaboration.Change[] GetSelectedChangesInternal() Collab: Void SetChangesToPublishInternal(UnityEditor.Collaboration.ChangeItem[]) ConfigField: Void Destroy(IntPtr) DSPSampleProvider: Int32 Internal_ReadFloatFromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, Void*, Int32) DSPSampleProvider: Int32 Internal_ReadSInt16FromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, NativeFormatType, Void*, Int32) DSPSampleProvider: Int32 Internal_ReadUInt8FromSampleProvider(Unity.Experimental.Audio.DSPSampleProvider, NativeFormatType, Void*, Int32) DSPSampleProvider: UInt16 Internal_GetChannelCount(Unity.Experimental.Audio.DSPSampleProvider) DSPSampleProvider: UInt32 Internal_GetSampleRate(Unity.Experimental.Audio.DSPSampleProvider) ExecuteContextInternal: Void Internal_PostEvent(Void*, Int64, Void*, Int32) HierarchyFrameDataView: IntPtr Internal_Create(Int32, Int32, ViewModes, Int32, Boolean) HierarchyFrameDataView: IntPtr Internal_Create(Int32, Int32, ViewModes, Int32, Boolean) HierarchyFrameDataView: Void Internal_Destroy(IntPtr) HierarchyFrameDataView: Void Internal_Destroy(IntPtr) InternalEditorUtility: Boolean HasUFSTLicense() Message: Void Destroy(IntPtr) Microphone: Int32 GetMicrophoneDeviceIDFromName(System.String) Microphone: Int32 GetRecordPosition(Int32) NativeFormatImporterUtility: System.String Internal_GetExtensionForNativeAsset(UnityEngine.Object) NativeFormatImporterUtility: System.Type Internal_GetNativeTypeForExtension(System.String, Boolean ByRef) Plugin: Void Destroy(IntPtr) Profiler: Void Internal_EmitFrameMetaData_Array(Byte[], Int32, System.Array, Int32, Int32) Profiler: Void Internal_EmitFrameMetaData_Native(Byte[], Int32, IntPtr, Int32, Int32) ProfilerFrameDataIterator: Void Internal_Destroy(IntPtr) ProfilerProperty: Void Internal_Delete(IntPtr) ResourceContext: Void Internal_FreeArray(Void*, Void*) ResourceContext: Void* Internal_AllocateArray(Void*, Int32) SerializedObject: Void Internal_Destroy(IntPtr) SerializedObjectChangeTracker: Void Internal_Destroy(IntPtr) SerializedProperty: Void Internal_Destroy(IntPtr) Task: Void Destroy(IntPtr) TypeDB: IntPtr Internal_Create() TypeDB: Void Internal_Destroy(IntPtr) VFXCPUBufferData: Void Internal_Destroy(IntPtr) WaveformStreamer: Void Internal_WaveformStreamerDestroy(IntPtr)
Реще еÑÑ‚ÑŒ 10 функций, которые были удалены:
FrameDataView: IntPtr Internal_Create(UnityEditorInternal.Profiling.ProfilerViewType, Int32, Int32, UnityEditorInternal.Profiling.ProfilerColumn, Boolean, UnityEditorInternal.Profiling.FrameViewFilteringModes) FrameDataView: Void Internal_Destroy(IntPtr) PropertySceneHandle: Void SetBoolInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Boolean) PropertySceneHandle: Void SetFloatInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Single) PropertySceneHandle: Void SetIntInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, Int32) TransformSceneHandle: Void SetLocalPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformSceneHandle: Void SetLocalRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Quaternion) TransformSceneHandle: Void SetLocalScaleInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformSceneHandle: Void SetPositionInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Vector3) TransformSceneHandle: Void SetRotationInternal(UnityEngine.Experimental.Animations.AnimationStream ByRef, UnityEngine.Quaternion)
Очень важно уточнить, что многие из Ñтих функций имеют модификатор private
или internal
. Многие даже имеют Ñлово “Internal†в Ñвоем имени. ХотÑ, техничеÑки, некоторые из них можно вызвать через рефлекÑию, лучшим вариантом будет иÑпользование функции из публичного API, которые, в Ñвою очередь, вызовут private
или internal
функции напрÑмую или коÑвенно.
Ðахождение того, как вызываютÑÑ Ð²Ñе Ñти 59 новых потокобезопаÑных функций не проÑÑ‚Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°, Ñ‚.к. должно выполнÑÑ‚ÑŒÑÑ Ð² каждом конкретном Ñлучае отдельно, но легко заметить, что Ñам движок ÑтановитÑÑ Ð² целом более потокобезопаÑным. Ðто очень хорошо Ð´Ð»Ñ Ñ€Ð°Ð·Ð²Ð¸Ñ‚Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного кода в Unity, оÑобенно ÑейчаÑ, когда мы имеем Burst, который работает только в Job System.