Commit 6bcf8bfc authored by Mahmoud Aglan's avatar Mahmoud Aglan

super sexy dynamic patching code

parent 254d1a68
fileFormatVersion: 2
guid: 745e9c17df962b24a80a69d5da8e5d38
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: d308d9efe86ef6242a75802e1f37de49
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: e5036f96e3c15ea49b96f7ee989dd3c1
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 9e9f7f46a1ba34c338eb95b193ae1327
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: b18b93d4b5d00384ba417df18aeac5a3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 92a80e6f6cd90464b8f87b98fc72999a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
......@@ -14,7 +14,7 @@ OcclusionCullingSettings:
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 10
m_Fog: 1
m_Fog: 0
m_FogColor: {r: 0.4, g: 0.4, b: 0.4, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
......@@ -225,7 +225,7 @@ Camera:
width: 1
height: 1
near clip plane: 0.3
far clip plane: 100
far clip plane: 75
field of view: 80
orthographic: 0
orthographic size: 5
......@@ -237,8 +237,8 @@ Camera:
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_HDR: 0
m_AllowMSAA: 0
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
......@@ -272,7 +272,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData
m_RenderShadows: 1
m_RenderShadows: 0
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
......@@ -285,7 +285,7 @@ MonoBehaviour:
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_AntialiasingQuality: 0
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
......@@ -532,7 +532,7 @@ Light:
m_InnerSpotAngle: 21.80208
m_CookieSize2D: {x: 0.5, y: 0.5}
m_Shadows:
m_Type: 1
m_Type: 0
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 0.496
......
......@@ -353,7 +353,7 @@ Camera:
width: 1
height: 1
near clip plane: 0.3
far clip plane: 100
far clip plane: 75
field of view: 60
orthographic: 0
orthographic size: 5
......@@ -365,8 +365,8 @@ Camera:
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_HDR: 0
m_AllowMSAA: 0
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
......@@ -399,7 +399,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData
m_RenderShadows: 1
m_RenderShadows: 0
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
......@@ -412,7 +412,7 @@ MonoBehaviour:
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_AntialiasingQuality: 0
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
......
......@@ -532,6 +532,7 @@ namespace com.al_arcade.mcq
gate.transform.position = position;
gate.gameObject.SetActive(true);
gate.Setup(index, answerText, isCorrect);
SSGraphicsOptimizer.OptimizeGameObject(gate.gameObject);
return gate;
}
......
......@@ -282,6 +282,9 @@ namespace com.al_arcade.mcq
SetupLighting();
yield return null;
// ── Graphics optimization (kill shadows, enable GPU instancing) ──
SSGraphicsOptimizer.OptimizeScene();
Debug.Log("═══ MCQ Ready — A/D or ←/→ to steer ═══");
yield return new WaitForSeconds(0.3f);
......@@ -316,6 +319,18 @@ namespace com.al_arcade.mcq
var cam = Camera.main;
if (cam == null) return;
cam.farClipPlane = 75f;
cam.allowHDR = false;
cam.allowMSAA = false;
var urpCamData = cam.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>();
if (urpCamData != null)
{
urpCamData.renderShadows = false;
urpCamData.renderPostProcessing = false;
urpCamData.antialiasing = UnityEngine.Rendering.Universal.AntialiasingMode.None;
}
var follower = cam.GetComponent<McqCameraFollow>();
if (follower == null)
follower = cam.gameObject.AddComponent<McqCameraFollow>();
......
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace com.al_arcade.shared
{
/// <summary>
/// Runtime graphics optimizer for mobile performance.
/// Call SSGraphicsOptimizer.OptimizeScene() after scene setup to:
/// - Kill shadow casting on all renderers (eliminates shadow caster passes)
/// - Enable GPU Instancing on all materials (reduces draw calls)
/// - Disable shadows on all lights
/// - Set target resolution for mobile
/// </summary>
public static class SSGraphicsOptimizer
{
public static void OptimizeScene()
{
DisableAllShadowCasters();
EnableGPUInstancingOnAllMaterials();
DisableAllLightShadows();
OptimizeResolution();
OptimizeQualitySettings();
}
/// <summary>
/// Disables shadow casting on every MeshRenderer and SkinnedMeshRenderer in the scene.
/// This eliminates the 595+ shadow caster render passes.
/// </summary>
public static void DisableAllShadowCasters()
{
int count = 0;
var renderers = Object.FindObjectsByType<Renderer>(FindObjectsSortMode.None);
foreach (var r in renderers)
{
if (r.shadowCastingMode != ShadowCastingMode.Off)
{
r.shadowCastingMode = ShadowCastingMode.Off;
r.receiveShadows = false;
count++;
}
}
Debug.Log($"[SSGraphicsOptimizer] Disabled shadow casting on {count} renderers");
}
/// <summary>
/// Enables GPU Instancing on all materials in the scene.
/// This allows Unity to batch objects sharing the same mesh+material.
/// </summary>
public static void EnableGPUInstancingOnAllMaterials()
{
int count = 0;
var renderers = Object.FindObjectsByType<Renderer>(FindObjectsSortMode.None);
foreach (var r in renderers)
{
var materials = r.sharedMaterials;
foreach (var mat in materials)
{
if (mat != null && !mat.enableInstancing)
{
mat.enableInstancing = true;
count++;
}
}
}
Debug.Log($"[SSGraphicsOptimizer] Enabled GPU Instancing on {count} materials");
}
/// <summary>
/// Disables shadows on all lights in the scene.
/// </summary>
public static void DisableAllLightShadows()
{
int count = 0;
var lights = Object.FindObjectsByType<Light>(FindObjectsSortMode.None);
foreach (var light in lights)
{
if (light.shadows != LightShadows.None)
{
light.shadows = LightShadows.None;
count++;
}
}
Debug.Log($"[SSGraphicsOptimizer] Disabled shadows on {count} lights");
}
/// <summary>
/// Sets mobile-friendly resolution.
/// Caps at 720p equivalent for portrait mode.
/// </summary>
public static void OptimizeResolution()
{
#if !UNITY_EDITOR
int maxShortSide = 720;
int w = Screen.width;
int h = Screen.height;
int shortSide = Mathf.Min(w, h);
if (shortSide > maxShortSide)
{
float scale = (float)maxShortSide / shortSide;
int newW = Mathf.RoundToInt(w * scale);
int newH = Mathf.RoundToInt(h * scale);
Screen.SetResolution(newW, newH, true);
Debug.Log($"[SSGraphicsOptimizer] Resolution capped: {w}x{h} -> {newW}x{newH}");
}
#endif
}
/// <summary>
/// Applies runtime quality overrides for mobile.
/// </summary>
public static void OptimizeQualitySettings()
{
QualitySettings.shadows = ShadowQuality.Disable;
QualitySettings.shadowDistance = 0;
QualitySettings.antiAliasing = 0;
QualitySettings.softParticles = false;
QualitySettings.realtimeReflectionProbes = false;
QualitySettings.skinWeights = SkinWeights.TwoBones;
Debug.Log("[SSGraphicsOptimizer] Quality settings optimized for mobile");
}
/// <summary>
/// Call after instantiating new objects to disable their shadow casting.
/// Use this for dynamically spawned prefabs (gates, particles, etc.)
/// </summary>
public static void OptimizeGameObject(GameObject go)
{
if (go == null) return;
var renderers = go.GetComponentsInChildren<Renderer>(true);
foreach (var r in renderers)
{
r.shadowCastingMode = ShadowCastingMode.Off;
r.receiveShadows = false;
var materials = r.sharedMaterials;
foreach (var mat in materials)
{
if (mat != null && !mat.enableInstancing)
mat.enableInstancing = true;
}
}
}
}
}
fileFormatVersion: 2
guid: 74d98c8d692a044309c8d43d43e97fb5
\ No newline at end of file
......@@ -247,6 +247,9 @@ namespace com.al_arcade.tf
_uiManager.onRestartClicked.AddListener(OnRestartClicked);
yield return null;
// ── Graphics optimization (kill shadows, enable GPU instancing) ──
SSGraphicsOptimizer.OptimizeScene();
Debug.Log("═══ TF Ready! A/← = True D/→ = False ═══");
yield return new WaitForSeconds(0.5f);
......@@ -269,6 +272,17 @@ namespace com.al_arcade.tf
cam.transform.rotation = Quaternion.Euler(0, 90, 0);
cam.fieldOfView = cameraFOV;
cam.nearClipPlane = 0.1f;
cam.farClipPlane = 75f;
cam.allowHDR = false;
cam.allowMSAA = false;
var urpCamData = cam.GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>();
if (urpCamData != null)
{
urpCamData.renderShadows = false;
urpCamData.renderPostProcessing = false;
urpCamData.antialiasing = UnityEngine.Rendering.Universal.AntialiasingMode.None;
}
}
private void SetupLighting()
......
......@@ -30,7 +30,7 @@ MonoBehaviour:
m_UpscalingFilter: 0
m_FsrOverrideSharpness: 0
m_FsrSharpness: 0.92
m_EnableLODCrossFade: 1
m_EnableLODCrossFade: 0
m_LODCrossFadeDitheringType: 1
m_ShEvalMode: 0
m_LightProbeSystem: 0
......@@ -42,38 +42,38 @@ MonoBehaviour:
m_SupportProbeVolumeScenarioBlending: 0
m_ProbeVolumeSHBands: 1
m_MainLightRenderingMode: 1
m_MainLightShadowsSupported: 1
m_MainLightShadowmapResolution: 2048
m_AdditionalLightsRenderingMode: 1
m_AdditionalLightsPerObjectLimit: 4
m_AdditionalLightShadowsSupported: 1
m_AdditionalLightsShadowmapResolution: 2048
m_MainLightShadowsSupported: 0
m_MainLightShadowmapResolution: 512
m_AdditionalLightsRenderingMode: 0
m_AdditionalLightsPerObjectLimit: 0
m_AdditionalLightShadowsSupported: 0
m_AdditionalLightsShadowmapResolution: 512
m_AdditionalLightsShadowResolutionTierLow: 256
m_AdditionalLightsShadowResolutionTierMedium: 512
m_AdditionalLightsShadowResolutionTierHigh: 1024
m_ReflectionProbeBlending: 1
m_ReflectionProbeBoxProjection: 1
m_ReflectionProbeBlending: 0
m_ReflectionProbeBoxProjection: 0
m_ReflectionProbeAtlas: 1
m_ShadowDistance: 50
m_ShadowCascadeCount: 4
m_ShadowDistance: 20
m_ShadowCascadeCount: 1
m_Cascade2Split: 0.25
m_Cascade3Split: {x: 0.1, y: 0.3}
m_Cascade4Split: {x: 0.12299999, y: 0.2926, z: 0.53599995}
m_CascadeBorder: 0.107758604
m_ShadowDepthBias: 0.1
m_ShadowNormalBias: 0.5
m_AnyShadowsSupported: 1
m_AnyShadowsSupported: 0
m_SoftShadowsSupported: 0
m_ConservativeEnclosingSphere: 1
m_NumIterationsEnclosingSphere: 64
m_SoftShadowQuality: 3
m_AdditionalLightsCookieResolution: 2048
m_AdditionalLightsCookieFormat: 3
m_AdditionalLightsCookieResolution: 256
m_AdditionalLightsCookieFormat: 1
m_UseSRPBatcher: 1
m_SupportsDynamicBatching: 0
m_MixedLightingSupported: 1
m_SupportsLightCookies: 1
m_SupportsLightLayers: 1
m_SupportsDynamicBatching: 1
m_MixedLightingSupported: 0
m_SupportsLightCookies: 0
m_SupportsLightLayers: 0
m_DebugLevel: 0
m_StoreActionsOptimization: 0
m_UseAdaptivePerformance: 1
......@@ -81,8 +81,8 @@ MonoBehaviour:
m_ColorGradingLutSize: 32
m_AllowPostProcessAlphaOutput: 0
m_UseFastSRGBLinearConversion: 0
m_SupportDataDrivenLensFlare: 1
m_SupportScreenSpaceLensFlare: 1
m_SupportDataDrivenLensFlare: 0
m_SupportScreenSpaceLensFlare: 0
m_GPUResidentDrawerMode: 0
m_SmallMeshScreenPercentage: 0
m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0
......
<Solution>
<Project Path="Unity.Timeline.csproj" />
<Project Path="Unity.VisualEffectGraph.Editor.csproj" />
<Project Path="Unity.RenderPipelines.GPUDriven.Runtime.csproj" />
<Project Path="Unity.PlasticSCM.Editor.csproj" />
<Project Path="Assembly-CSharp.csproj" />
<Project Path="Unity.ShaderGraph.Editor.csproj" />
<Project Path="Unity.RenderPipelines.Core.Runtime.csproj" />
<Project Path="Unity.Mathematics.csproj" />
<Project Path="Unity.Timeline.Editor.csproj" />
<Project Path="Unity.Cinemachine.Editor.csproj" />
<Project Path="Unity.Multiplayer.Center.Editor.csproj" />
<Project Path="Unity.RenderPipelines.Core.Editor.csproj" />
<Project Path="UnityEngine.UI.csproj" />
<Project Path="Unity.RenderPipelines.Universal.2D.Runtime.csproj" />
<Project Path="Unity.Collections.csproj" />
<Project Path="Unity.VisualScripting.Core.Editor.csproj" />
<Project Path="Unity.RenderPipelines.Universal.Editor.csproj" />
<Project Path="Unity.PerformanceTesting.Editor.csproj" />
<Project Path="Unity.Splines.csproj" />
<Project Path="UnityEngine.TestRunner.csproj" />
<Project Path="Unity.Burst.csproj" />
<Project Path="Unity.VisualScripting.Flow.Editor.csproj" />
<Project Path="Unity.Recorder.Editor.csproj" />
<Project Path="Unity.VisualStudio.Editor.csproj" />
<Project Path="Unity.InputSystem.csproj" />
<Project Path="PPv2URPConverters.csproj" />
<Project Path="LightSide.UniText.csproj" />
<Project Path="LeanCommon.csproj" />
<Project Path="UniTask.csproj" />
<Project Path="Unity.Searcher.Editor.csproj" />
<Project Path="UnityEditor.TestRunner.csproj" />
<Project Path="Unity.VisualScripting.Core.csproj" />
<Project Path="Unity.RenderPipelines.Universal.Runtime.csproj" />
<Project Path="Unity.UnifiedRayTracing.Runtime.csproj" />
<Project Path="Unity.AI.Navigation.Editor.ConversionSystem.csproj" />
<Project Path="Unity.VisualScripting.State.Editor.csproj" />
<Project Path="Unity.VisualEffectGraph.Runtime.csproj" />
<Project Path="Unity.Burst.CodeGen.csproj" />
<Project Path="Unity.Cinemachine.csproj" />
<Project Path="Unity.Postprocessing.Editor.csproj" />
<Project Path="FlatKit.Utils.Editor.csproj" />
<Project Path="Unity.VisualScripting.Flow.csproj" />
<Project Path="Unity.Splines.Editor.csproj" />
<Project Path="Unity.PerformanceTesting.csproj" />
<Project Path="Unity.TextMeshPro.csproj" />
<Project Path="UniTask.Linq.csproj" />
<Project Path="Unity.TextMeshPro.Editor.csproj" />
<Project Path="ExternAttributes.Editor.csproj" />
<Project Path="Unity.Burst.Editor.csproj" />
<Project Path="Nobi.UiRoundedCorners.Editor.csproj" />
<Project Path="Unity.Rider.Editor.csproj" />
<Project Path="Unity.VisualScripting.State.csproj" />
<Project Path="Unity.AI.Navigation.Updater.csproj" />
<Project Path="UnityEditor.UI.csproj" />
<Project Path="Unity.RenderPipelines.Universal.2D.Editor.Overrides.csproj" />
<Project Path="Unity.Postprocessing.Runtime.csproj" />
<Project Path="CFXRRuntime.csproj" />
<Project Path="LightSide.UniText.Editor.csproj" />
<Project Path="Unity.2D.Sprite.Editor.csproj" />
<Project Path="NuGetForUnity.csproj" />
<Project Path="Unity.AI.Navigation.Editor.csproj" />
<Project Path="CFXRDemo.csproj" />
<Project Path="Unity.Recorder.csproj" />
<Project Path="CFXREditor.csproj" />
<Project Path="CW.Common.csproj" />
<Project Path="Unity.Multiplayer.Center.Common.csproj" />
<Project Path="Assembly-CSharp-firstpass.csproj" />
<Project Path="Unity.InputSystem.ForUI.csproj" />
<Project Path="Unity.AI.Navigation.csproj" />
<Project Path="Unity.Collections.CodeGen.csproj" />
<Project Path="Assembly-CSharp-Editor.csproj" />
<Project Path="Unity.Mathematics.Editor.csproj" />
<Project Path="Unity.VisualScripting.SettingsProvider.Editor.csproj" />
<Project Path="UnityEditor.UI.Analytics.csproj" />
<Project Path="UniTask.TextMeshPro.csproj" />
<Project Path="Unity.Settings.Editor.csproj" />
<Project Path="Unity.InputSystem.TestFramework.csproj" />
<Project Path="Unity.ShaderGraph.Utilities.csproj" />
<Project Path="Unity.VisualScripting.Shared.Editor.csproj" />
<Project Path="Unity.Recorder.Base.csproj" />
<Project Path="KinoBloom.Runtime.csproj" />
<Project Path="Nobi.UiRoundedCorners.csproj" />
<Project Path="Unity.CollabProxy.Editor.csproj" />
<Project Path="CFXR.WelcomeScreen.csproj" />
<Project Path="Unity.RenderPipeline.Universal.ShaderLibrary.csproj" />
<Project Path="UniTask.Editor.csproj" />
<Project Path="ToonyColorsPro.Demo.Editor.csproj" />
<Project Path="LeanPool.csproj" />
<Project Path="Unity.Bindings.OpenImageIO.Editor.csproj" />
<Project Path="Unity.InputSystem.DocCodeSamples.csproj" />
<Project Path="Unity.RenderPipelines.Universal.Shaders.csproj" />
<Project Path="Unity.RenderPipelines.Core.Runtime.Shared.csproj" />
<Project Path="Unity.InternalAPIEngineBridge.004.csproj" />
<Project Path="Unity.RenderPipelines.Core.Editor.Shared.csproj" />
<Project Path="Unity.VisualScripting.DocCodeExamples.csproj" />
<Project Path="Unity.PlasticSCM.Editor.Entities.csproj" />
<Project Path="UniTask.Addressables.csproj" />
<Project Path="Unity.Rendering.LightTransport.Editor.csproj" />
<Project Path="Unity.Collections.Editor.csproj" />
<Project Path="UniTask.DOTween.csproj" />
<Project Path="Unity.RenderPipelines.Universal.Config.Runtime.csproj" />
<Project Path="Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.csproj" />
<Project Path="Unity.RenderPipelines.Core.ShaderLibrary.csproj" />
</Solution>
......@@ -66,14 +66,14 @@
"url": "https://packages.unity.com"
},
"com.unity.collections": {
"version": "2.6.5",
"version": "2.6.2",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.8.27",
"com.unity.burst": "1.8.23",
"com.unity.mathematics": "1.3.2",
"com.unity.test-framework": "1.4.6",
"com.unity.nuget.mono-cecil": "1.11.6",
"com.unity.nuget.mono-cecil": "1.11.5",
"com.unity.test-framework.performance": "3.0.3"
},
"url": "https://packages.unity.com"
......@@ -224,7 +224,7 @@
}
},
"com.unity.splines": {
"version": "2.8.4",
"version": "2.8.2",
"depth": 1,
"source": "registry",
"dependencies": {
......
m_EditorVersion: 6000.3.12f1
m_EditorVersionWithRevision: 6000.3.12f1 (fca03ac9b0d5)
m_EditorVersion: 6000.3.9f1
m_EditorVersionWithRevision: 6000.3.9f1 (7a9955a4f2fa)
......@@ -9,11 +9,11 @@ QualitySettings:
- serializedVersion: 5
name: Web
pixelLightCount: 2
shadows: 2
shadowResolution: 1
shadows: 0
shadowResolution: 0
shadowProjection: 1
shadowCascades: 2
shadowDistance: 40
shadowCascades: 1
shadowDistance: 0
shadowNearPlaneOffset: 3
shadowCascade2Split: 0.33333334
shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment