2016-08-03 27 views
8

Tôi đang làm việc trên một trò chơi cuộn dọc đơn giản cho Unity iOS. Trò chơi của tôi đang trải qua sự rùng mình không phù hợp. Tôi đã tìm kiếm trên web rộng rãi tìm kiếm một giải pháp mà không có bất kỳ may mắn nào. Tôi đang sử dụng phiên bản Unity 5.3.4 f1.jitter không phù hợp trong trò chơi iOS

The Game

Gameplay screenshot

  • Một nhân vật đang rơi xuống. Chúng tôi đang sử dụng bộ điều khiển ký tự thống nhất để di chuyển ký tự trong Update() (Time.deltaTime đang được nhân lên).
  • Máy ảnh đang theo dõi ký tự trong LateUpdate() (sử dụng Vector3.Lerp() để theo dõi).
  • Vì nhân vật đang di chuyển xuống, các chướng ngại vật dường như đang di chuyển lên trên màn hình.
  • Có 1 ánh sáng hướng trong cảnh, thiết lập cho bóng thời gian thực. Chất lượng bóng là bóng cao và cứng.
  • Không có vật cứng nhắc nào trong cảnh. Và không có đột biến lớn trong hồ sơ.
  • Chúng tôi có hình học rất đơn giản và rất ít cuộc gọi vẽ/đặt cuộc gọi vượt qua (avg. 7 set pass calls).
  • Chúng tôi có liên tục 60 khung hình/giây.
  • Vì chúng tôi đang chạy trên iOS vSync theo mặc định Bật và không thể tắt.

Vấn đề

  • Các yếu tố nền/chướng ngại vật (cây, đá, vv) bắt đầu jittering không có lý do rõ ràng. Hành vi này không nhất quán, đôi khi nó gây hấn và đôi khi nó không xảy ra.
  • Ngay cả khi nó không jitter chúng tôi kinh nghiệm nói lắp nhỏ khi người dùng cung cấp cho đầu vào thông qua liên lạc.

Những gì chúng ta đã cố gắng

  • Chúng tôi đã thử tất cả các kết hợp của Update(), LateUpdate(), FixedUpdate(), Time.deltaTimeTime.smoothDeltaTime, Lerp, giảm hiện trường để một vài hình khối và loại bỏ tất cả các máy va chạm và gây nên.
  • Chúng tôi đã nghiên cứu các chủ đề sau: Link1, Link2, Link3 và vô số chủ đề khác.
  • Ban đầu trò chơi của chúng tôi đang chạy ở tốc độ 30 khung hình/giây mặc định. Nhưng sau một số nghiên cứu, dường như vấn đề của chúng tôi là do sự khác biệt giữa "Tỷ lệ khung hình" và "Tốc độ làm mới màn hình". (để hiểu vấn đề này, hãy xem LINK) sau đây. Vì thiết bị iOS có tốc độ làm tươi 60Hz, chúng tôi đã đặt tốc độ khung hình mục tiêu là 60 và trò chơi của chúng tôi duy trì liên tục 60 khung hình/giây.
  • Sau khi đặt tốc độ khung hình mục tiêu thành 60, jitter đã được cải thiện nhưng hiện tại nó không phù hợp.

Tôi hoàn toàn không có ý tưởng. Bất kỳ trợ giúp hoặc con trỏ sẽ được đánh giá cao.

Xin cảm ơn trước.

+0

Có bao nhiêu đèn thời gian thực trong cảnh và bạn có thể vui lòng chia sẻ mã chuyển động của máy ảnh không? –

+0

Chussu anh trai. Chỉ có một hướng ánh sáng. Và tôi đang sử dụng 'Vector3.Lerp()' để di chuyển camera. Tôi đã thử nghiệm chuyển động của camera và nó không phải là vấn đề. Tôi cũng sẽ cập nhật bài đăng và thêm thông tin này vào đó. –

+0

Chào mừng bạn đến với StackOverflow! sẽ hữu ích hơn nếu bạn cập nhật câu hỏi của mình bằng cách thêm ** một chút mã **. Và nếu bạn chưa đọc nó, [Documents] (https://docs.unity3d.com/ScriptReference/Application-targetFrameRate.html) nói điều này: ** Lưu ý rằng việc đặt targetFrameRate không đảm bảo tốc độ khung hình đó. Có thể có biến động do các chi tiết cụ thể của nền tảng hoặc trò chơi có thể không đạt được tốc độ khung hình vì máy tính quá chậm. ** Ngoài ra, bạn có muốn chia sẻ ảnh chụp màn hình của Profiler với _deep profile_ được bật và không giới hạn targetfps. –

Trả lời

1

Điều này có thể được gây ra bởi nhiều lý do khác nhau, và không nhìn thấy bất kỳ mã tôi chỉ có thể thực hiện một vài ý kiến ​​cho rằng tôi suy nghĩ:

1. lỗi phao điểm chính xác

  • Nhân vật có liên tục rơi không?
  • Lỗi xảy ra sau khi ký tự đã giảm một lúc?

Điều đó sẽ trỏ đến lỗi chính xác của dấu phẩy động. thay vì bị rơi nhân vật, di chuyển các đối tượng xung quanh nhân vật từ bên dưới chế độ xem màn hình sang chế độ xem trên màn hình để mọi thứ xuất hiện gần nguồn gốc.

2. Instantiating thường hay lag khác gai

  • Bạn đang instantiating đối tượng hoặc tổng hợp chúng?
  • Bạn có thực hiện bất kỳ phép tính dài nào không?
  • Bạn có rất nhiều for/foreach/while vòng?

Việc lập tức sẽ gây ra hiện tượng lún và tạo ra khoảng trống sẽ làm cho bộ thu gom rác chạy thường xuyên hơn. Kể từ khi tốc độ khung hình cố định, khi một hoạt động chậm xảy ra bạn sẽ thấy một số jitter.

Thay vì Instantiating và destorying objects khi người chơi đi một khoảng cách, bạn nên Instantiate một nhóm GameObjects sau khi tải cảnh, làm cho chúng không hoạt động với gameObject.SetActive(false) và lưu trữ chúng trong danh sách, mảng, vv và khi bạn cần đến Instatiate một đối tượng mới, chỉ cần lấy một đối tượng ra khỏi hồ bơi và thay đổi nó là Transform.positiongameObject.SetActive(true) khi cần.

3. rác thu chạy thường

Cái này khó có thể là một vấn đề, nhưng vẫn nhắc đến nó. lấy mã ví dụ này:

void Update() 
{ 
    Vector3 someVector = new Vector3(0,0,0); 
    float distance = someVector.magnitude; 
    if (distance > 5.0f) 
     Vector3 someNewVector = someVector + transform.position; 
    else 
     Vector3 someNewVector = Vector3.zero; 
} 

Mỗi lần Update chạy, nó tạo biến mới và cấp phát bộ nhớ cho chúng. Lần sau Cập nhật runs, it creates new variables, and allocates more memory. Eventually, the memory usage sets off the garbage collector, which goes around and frees up the memory used by all the previous chức năng Update`. Thay vào đó, bạn nên cấp phát bộ nhớ lúc bắt đầu và sau đó sử dụng lại các biến.

void Start() 
{ 
    Vector3 someVector = new Vector3(0,0,0); 
    Vector3 someNewVector = new Vector3(0,0,0); 
    float distance = 0f; 
} 
void Update() 
{ 
    someVector = Vector3.zero; 
    float distance = someVector.magnitude; 
    if (distance > 5.0f) 
     Vector3 someVector += transform.position; 
    else 
     Vector3 someVector = Vector3.zero; 
} 

Để chẩn đoán điều này, bạn cần phải đính kèm trình gỡ lỗi hồ sơ và xem và xem thiết bị có phù hợp với bộ thu gom rác hay không.

Hy vọng rằng điều gì đó ở đây có thể giúp ích cho bạn. Đặt cược tốt nhất của bạn để tìm nguồn gốc của jitter là sử dụng profiler.Dưới đây là các hướng dẫn dành cho iOS:

Kết nối thiết bị iOS của bạn vào mạng WiFi của bạn (local/Adhoc mạng WiFi được sử dụng bởi hồ sơ để gửi dữ liệu profiling từ thiết bị đến Unity Editor). Đánh dấu vào hộp kiểm “Autoconnect Profiler” trong hộp thoại cài đặt của Unity. Đính kèm thiết bị của bạn vào máy Mac qua cáp, hãy chọn hộp kiểm "Bản dựng phát triển" trong hộp thoại Cài đặt xây dựng của Unity và nhấn "Build & Run" trong Unity Editor. Khi ứng dụng khởi chạy trên thiết bị, hãy mở cửa sổ hồ sơ trong Unity Editor (Window-> Profiler).

Thông tin thêm: The Profiler Window

1

Cảm ơn tất cả các bạn đã dành thời gian.

  1. Không, nó không phải là lỗi ưu tiên điểm nổi.
  2. Chúng tôi đang instantiating đối tượng tại thời gian chạy nhưng khi vấn đề xảy ra chúng tôi chuyển sang đối tượng tổng hợp nhưng nó đã không giúp đỡ.
  3. Tôi đã thực hiện cấu hình kỹ lưỡng, thậm chí việc định hình từ xa trên thiết bị và bộ thu gom rác cũng không phải là vấn đề.

Sau khi nghiên cứu sâu hơn, tôi đã gặp phải một sự cố tương tự và giải pháp hoạt động trong trường hợp của tôi.

Tóm lại, vấn đề là với khung thống nhất không đồng bộ với tốc độ khung hình của thiết bị. Khi Unity mất nhiều thời gian hơn để hiển thị khung của nó, vòng lặp render của thiết bị sẽ không đợi cho sự thống nhất kết thúc và vẽ một khung trống có kết quả là jitter. Nhưng, như tôi đã nói trong tiêu đề của bài viết "Không phù hợp Jitter", blog cũng báo cáo như nhau và do đó, nó không xảy ra tất cả các thời gian.

Làm cách nào để bạn biết đó là vấn đề tương tự? Vâng, bạn sẽ thấy các cú sốc của Render trong profiler (mặc dù chúng ta có hình học rất tối giản). Nó sẽ trông giống như là Render đang phát điên.

Mặc dù blog là nhiều hơn về đầu vào bị laggy nhưng nó cũng giúp trong kịch bản của tôi. Một số có thể không hiểu làm thế nào chính xác để giải quyết vấn đề này cho họ Tôi khuyên bạn nên POST, trong đó trình bày một giải pháp rõ ràng nhiều.

Để nghiên cứu thêm, hãy bắt đầu đọc khi người dùng có tên "cgJames" nhảy vào CONVERSATION.

Tôi hy vọng điều này cũng giúp ích cho người khác.

0

Gần đây, tôi đã gặp vấn đề tương tự. Chính xác ... Một cuộn dọc trong Unity, với đồ họa đơn giản, trải qua một khung hình không ổn định trên iOS chỉ, đôi khi, có thể liên quan đến đầu vào, có thể không.

Dù sao, cuối cùng tôi cũng đã tìm thấy sự cố xuất phát từ đâu. Thử thay đổi công cụ hiển thị trên iOS từ Metal thành OpenGL ES 2 hoặc 3.

Hy vọng điều này cũng sẽ giải quyết được vấn đề của bạn.

+0

Cảm ơn câu trả lời. Tôi chắc chắn sẽ cố gắng này và lấy lại cho bạn nếu điều này làm việc cho tôi. –

Các vấn đề liên quan