שירות אופטימיזציית אפליקציות AR שלנו מספק 60 FPS יציב וחסכון של עד 30% בסוללה. במשך 5 שנים, אופטימיזציה של 50+ פרויקטי AR — מקטלוגי רהיטים ועד ויזואליזציות תעשייתיות. ביקורת ביצועי AR שלנו מזהה צווארי בקבוק, ואנו מבטיחים תוצאות מדידות. לקוחות חוסכים בממוצע $5,000 לפרויקט.
אפליקציית AR מחממת iPhone 12 ל-45°C תוך 8 דקות, מרוקנת סוללה בקצב של 1% לדקה, ומספקת 45–50 FPS במקום 60. זה לא פיגור קל — זו אפליקציה בלתי שמישה. אנו מבטיחים תוצאות: 60 FPS יציב וחסכון של עד 30% בסוללה. הלקוחות שלנו חסכו בממוצע $5,000 לפרויקט.
למה אפליקציות AR מתחממות ומאבדות FPS
ARKit/ARCore רצים ברציפות: לכידת פריימים ממצלמה → זיהוי תכונות → הערכת מישור → עדכון מודל עולם → רינדור. כל שלב הוא עומס חישובי. באייפונים, ARKit משתמש במנוע העצבי (Neural Engine) למעקב מישורים, מה שמקל משמעותית על CPU/GPU. באנדרואיד, ARCore כבד יותר על ה-GPU במכשירים ללא NPU.
צווארי בקבוק אופייניים:
- טעינת מודלי תלת-ממד כבדים לתוך
ARSCNViewללא אופטימיזציה:SCNNodeעם 500K פוליגונים ללא LOD, טקסטורות 4096×4096 ללא mipmapping. ה-GPU מרנדר אובייקט באותה רמת פירוט בין אם הוא במרחק מטר אחד או 10 מטרים. - תכונות מעקב מופעלות שאינן בשימוש.
ARWorldTrackingConfigurationעםisAutoFocusEnabled = trueו-environmentTexturing = .automaticללא צורך אמיתי — עומס מערכת קבוע. - פיזיקה ב-
SCNSceneעםSCNPhysicsBodyעל כל אובייקט כשיש עשרות אובייקטי AR — מנוע הפיזיקה של SceneKit אינו מותאם לסצנות AR ניידות עם גופים רבים.
איך אנו מייעלים ARKit: תצורת סשן ורינדור
תצורת סשן
let configuration = ARWorldTrackingConfiguration() // Включаем только то что реально нужно
configuration.planeDetection = [.horizontal] // не .vertical если не нужно
configuration.isAutoFocusEnabled = false // фиксированный фокус — меньше нагрузки
configuration.environmentTexturing = .none // отключаем если нет PBR-материалов
// Для простых сцен — lighter tracking
let simpleConfig = AROrientationTrackingConfiguration() // только ориентация, без world trackingלאפליקציות שצריכות רק מעקב פנים, השתמשו ב-let configuration = ARWorldTrackingConfiguration() // Включаем только то что реально нужно configuration.planeDetection = [.horizontal] // не .vertical если не нужно configuration.isAutoFocusEnabled = false // фиксированный фокус — меньше нагрузки configuration.environmentTexturing = .none // отключаем если нет PBR-материалов // Для простых сцен — lighter tracking let simpleConfig = AROrientationTrackingConfiguration() // только ориентация, без world tracking במקום ARFaceTrackingConfiguration. ההבדל בעומס ה-CPU מורגש.
רינדור עם Metal במקום SceneKit
ARWorldTrackingConfiguration נוח, אבל לסצנות מורכבות ARSCNView + רנדרר Metal מותאם אישית נותן שליטה מלאה על draw calls. SceneKit מוסיף תקורה לניהול צמתים ופיזיקה. עם MTKView + ARSession:
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let commandBuffer = commandQueue.makeCommandBuffer()!
// Рендерим captured image (камера)
renderCapturedImage(frame.capturedImage, commandBuffer: commandBuffer)
// Рендерим AR-контент
renderVirtualContent(frame, commandBuffer: commandBuffer)
commandBuffer.present(drawable)
commandBuffer.commit()
}זה מניב שיפור של 20–30% ב-FPS בסצנות עם 10+ אובייקטי AR בהשוואה ל-MTKView.
Culling ו-LOD
func session(_ session: ARSession, didUpdate frame: ARFrame) { let commandBuffer = commandQueue.makeCommandBuffer()! // Рендерим captured image (камера) renderCapturedImage(frame.capturedImage, commandBuffer: commandBuffer) // Рендерим AR-контент renderVirtualContent(frame, commandBuffer: commandBuffer) commandBuffer.present(drawable) commandBuffer.commit() } לאובייקטים מחוץ לשדה הראייה — SceneKit אינו מרנדר צמתים נסתרים אבל עדיין מריץ פיזיקה ועדכונים. הגישה הנכונה היא להסיר אובייקטים מהסצנה: ARSCNView.
// Frustum culling вручную
func shouldRenderNode(_ node: SCNNode, camera: ARCamera) -> Bool {
let screenPoint = camera.projectPoint(node.worldPosition, orientation: .portrait, viewportSize: viewportSize)
return screenPoint.x > -0.1 && screenPoint.x < 1.1 && screenPoint.y > -0.1 && screenPoint.y < 1.1
} מה לעשות עם ARCore: סשן ורינדור
תצורת סשן
val config = Config(session)
config.planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_ONLY
config.lightEstimationMode = Config.LightEstimationMode.DISABLED // +15% battery
config.depthMode = Config.DepthMode.DISABLED // если глубина не нужна
session.configure(config)SCNNode.isHidden = true הוא המצב היקר ביותר, המספק השתקפויות ריאליסטיות. במכשירים ללא Depth API (רוב מכשירי הביניים), השתמשו בו רק אם זה תכונה מרכזית.
רינדור עם Filament
אפליקציות ARCore המשתמשות ב-Filament (רנדרר ה-PBR של גוגל) מרנדרות חומרי PBR דרך Vulkan במכשירים נתמכים — מהיר יותר באופן ניכר מאשר דרך OpenGL ES. דוגמה מוכנה היא דוגמאות node.removeFromParentNode() עם אינטגרציית Filament.
איך להשיג 60 FPS יציב ב-AR
שלבים מרכזיים:
- כיבוי תכונות מעקב שאינן בשימוש (environmentTexturing, autoFocus, depth mode).
- מעבר לרינדור ברמה נמוכה (Metal או Vulkan).
- החלת LOD ו-culling על מודלי תלת-ממד.
- דחיסת טקסטורות (ASTC, ETC2).
| פרמטר תצורה | השפעה על ביצועים | המלצה |
|---|---|---|
| planeDetection | בינוני: זיהוי מישורים מעמיס על CPU | הפעל רק סוגים נחוצים (אופקי/אנכי) |
| environmentTexturing | גבוה: תאורה דינמית דרך HDR | כבה אם PBR לא בשימוש |
| depthMode | גבוה: עיבוד עומק (ARCore) | כבה אם חסימה (occlusion) לא נחוצה |
| lightEstimationMode | בינוני–גבוה: ENVIRONMENTAL_HDR היקר ביותר | השתמש ב-DISABLED או AMBIENT_INTENSITY |
| isAutoFocusEnabled | נמוך: פוקוס אוטומטי של מצלמה | כבה לפוקוס קבוע |
השוואה: גישות ARKit לעומת ARCore
| פרמטר | ARKit (iOS) | ARCore (Android) |
|---|---|---|
| עומס מעקב | משתמש במנוע העצבי למעקב מישורים — פחות עומס CPU | תלוי ב-Depth API; בלעדיו, עומס GPU גבוה יותר |
| רינדור ראשי | Metal — שליטה ברמה נמוכה, SceneKit — אב-טיפוס מהיר | Vulkan (דרך Filament) או OpenGL ES |
| FPS מומלץ | 60 FPS יציב ניתן להשגה ב-iPhone 11+ לאחר אופטימיזציה | 30–60 FPS תלוי במכשיר |
| בעיות אופייניות | חום מקצב פריימים גבוה + מעקב | פיצול מכשירים, תמיכת Depth API משתנה |
מקרה בוחן: קטלוג רהיטים ב-AR
מהניסיון שלנו: לקוח בנה אפליקציה לצפייה ברהיטים ב-AR. ספות ושולחנות היו מודלי תלת-ממד ממעצבים, כל אחד עם 800K–1.2M פוליגונים. ב-iPhone 13, האפליקציה רצה ב-24 FPS כשהציבו 2 אובייקטים. הבעיה הייתה ברורה.
העבודה שלנו: ייצוא מודלים דרך Blender עם decimation ל-50K פוליגונים לגרסת AR (אובדן פירוט לא היה מורגש במרחק 1–2 מטרים בטלפון). המרת טקסטורות מ-4096×4096 PNG ל-2048×2048 ASTC. הוספת LOD — פירוט גבוה לאובייקטים קרובים מ-1.5 מטרים, בינוני לרחוקים יותר. תוצאה: 58–60 FPS יציב, טמפרטורה תקינה. הלקוח חסך כ-$5,000 על תיקונים, ונמנע משכתוב מלא.
איך האופטימיזציה עובדת: תהליך שלב-אחר-שלב
- ביקורת ביצועים — פרופיילינג במכשירים אמיתיים (iPhone 12, Pixel 6 וכו'), מדידת FPS, טמפרטורה, צריכת סוללה. קביעת קו בסיס.
- ניתוח ותכנון — זיהוי צווארי בקבוק, יצירת תוכנית פעולה ממוקדת.
- יישום — אופטימיזציה של תצורת סשן, רינדור ומודלי תלת-ממד.
- בדיקות — פרופיילינג חוזר, השוואה לקו הבסיס, התאמות.
- פריסה ותמיכה — הטמעת שינויים, מתן ייעוץ.
מה כלול באופטימיזציית אפליקציות AR
- ביקורת ביצועים במכשירי יעד.
- אופטימיזציית תצורת סשן (כיבוי תכונות שאינן בשימוש, כוונון פרמטרים).
- אופטימיזציית רינדור (מעבר ל-Metal/Filament, LOD, culling, דחיסת טקסטורות).
- תיעוד עם דוח והמלצות.
- תמיכה לאחר פריסה.
- הדרכה והעברת ידע לצוות הפיתוח שלך.
לוחות זמנים ואיך להתחיל
- ביקורת ביצועים: 2–3 ימים.
- אופטימיזציית רינדור ותצורת סשן: 1–2 שבועות.
- אם נדרשת אופטימיזציה של מודלי תלת-ממד, הזמן תלוי במספר הנכסים.
העלות נקבעת באופן אישי לאחר ניתוח; ביקורת מתחילה ב-$500, ופרויקטי אופטימיזציה מלאים נעים בדרך כלל בין $1,500 ל-$5,000. לקוחות רואים לעתים קרובות הפחתה של 30% בעלויות הפיתוח הכוללות בכך שנמנעים משכתובים בשלבים מאוחרים. קבלו ייעוץ על אופטימיזציית אפליקציית ה-AR שלכם — הזמינו ביקורת ביצועים היום.
טעויות נפוצות באופטימיזציית AR
- ניסיון לייעל רינדור ללא מדידת קו בסיס.
- שימוש בתצורת מעקב מקסימלית לסצנות פשוטות.
- שכחת LOD ו-mipmapping למודלי תלת-ממד.
- אי בדיקת ביצועים על פני דורות שונים של מכשירים.
לפי תיעוד אפל: ARKit Best Practices







