2012-02-22 44 views
7

Tôi chỉ muốn tạo một hoạt ảnh đơn giản (ví dụ trong C++ sử dụng OpenGL) của một số đối tượng chuyển động.OpenGL - hoạt hình "siêu mượt" của đối tượng di chuyển theo chiều ngang đơn giản

Trong OpenGL, tôi có thể sử dụng phương pháp "đệm đôi" và giả sử người dùng (chạy ứng dụng của tôi bằng hoạt ảnh) đã bật "đồng bộ hóa dọc" - vì vậy tôi có thể gọi một số chức năng mỗi khi màn hình tự làm mới (Tôi có thể đạt được điều đó ví dụ bằng cách sử dụng bộ công cụ Qt và chức năng của nó "swapBuffers"). Vì vậy, tôi nghĩ, hoạt hình "mượt mà nhất" mà tôi có thể đạt được, là "di chuyển hình vuông bằng ví dụ 1 pixel (có thể là các giá trị khác) mỗi lần theo dõi làm mới", do đó, tại mỗi "khung" hình vuông thêm 1 pixel nữa - "TÔI ĐÃ KIỂM TRA NÀY, VÀ NÓ HOẠT ĐỘNG NÓI". Tuy nhiên, vấn đề nảy sinh khi tôi muốn có chuỗi "riêng biệt" cho "logic trò chơi" (di chuyển hình vuông 1 pixel sang bên phải) và cho "hoạt hình" (hiển thị vị trí hiện tại của hình vuông trên màn hình). Vì giả sử chuỗi logic của trò chơi là một vòng lặp trong khi tôi di chuyển hình vuông lên 1 pixel và sau đó "ngủ" chuỗi trong một thời gian, ví dụ 10 mili giây và màn hình của tôi làm mới ví dụ sau mỗi 16 mili giây - chuyển động của hình vuông "sẽ không được 100% mịn" bởi vì đôi khi màn hình sẽ làm mới hai lần khi hình vuông di chuyển chỉ 1 pixel và không phải 2 pixel (vì có hai tần số "khác nhau" của màn hình và chuỗi logic trò chơi) - và chuyển động sẽ trông "hơi giật". Vì vậy, về mặt logic, tôi có thể ở lại với phương pháp siêu mịn đầu tiên, nhưng nó không thể được sử dụng trong ví dụ "nhiều người chơi" (ví dụ "máy chủ-khách hàng") - bởi vì các máy tính khác nhau có tần số giám sát khác nhau (vì vậy Tôi nên sử dụng các chủ đề khác nhau cho logic trò chơi (trên máy chủ) và cho hoạt ảnh (trên các máy khách)).

Vì vậy, câu hỏi của tôi là: Có một số phương pháp, sử dụng chủ đề khác nhau cho logic trò chơi và hoạt hình, mà làm "100% mịn" hình ảnh động của một số đối tượng di chuyển và nếu một số tồn tại, xin vui lòng mô tả nó ở đây, hoặc khi Tôi chỉ có một số "cảnh phức tạp hơn để render", tôi sẽ không thấy "chuyển động nhỏ" mà tôi thấy bây giờ, khi tôi di chuyển một hình vuông đơn giản theo chiều ngang, và tôi tập trung vào nó :)?

Trả lời

6

Vâng, đây thực sự là hành vi lặp trò chơi riêng biệt điển hình. Bạn quản lý tất cả các hành động liên quan đến vật lý (chuyển động) của bạn trong một luồng, cho phép chuỗi kết xuất thực hiện công việc của nó. Điều này thực sự là mong muốn.

Đừng quên cách triển khai vòng lặp trò chơi này là có tốc độ khung hình tối đa có sẵn trong khi duy trì tốc độ vật lý không đổi. Ở FPS cao hơn, bạn không thể thấy hiệu ứng này bằng bất kỳ cơ hội nào, nếu không có bất kỳ vấn đề nào liên quan đến mã khác. Ví dụ, một số kết nối giữa tốc độ khung hình và vật lý.

Nếu bạn muốn đạt được những gì bạn mô tả là êm ái hoàn hảo, bạn có thể đồng bộ hóa công cụ vật lý của bạn với VSync. Đơn giản chỉ cần làm tất cả các vật lý của bạn TRƯỚC KHI làm mới đá trong, hơn chờ đợi khác.

Nhưng tất cả điều này áp dụng cho các đối tượng tốc độ không đổi. Nếu bạn có đối tượng với tốc độ động, bạn không bao giờ có thể biết khi nào để vẽ nó thành "đồng bộ". Cùng một vấn đề phát sinh sau đó bạn muốn nhiều đối tượng với tốc độ không đổi khác nhau.

Ngoài ra, đây KHÔNG phải là điều bạn muốn trong các cảnh phức tạp. Toàn bộ ý tưởng của V-sync là giới hạn hiệu ứng rách màn hình. Bạn chắc chắn KHÔNG nên móc mã vật lý hoặc hiển thị của bạn để hiển thị tốc độ làm mới. Bạn muốn bạn mã vật lý chạy độc lập với người dùng hiển thị tốc độ làm mới. Điều này có thể là nỗi đau thực tế trong trò chơi nhiều người chơi chẳng hạn. Để bắt đầu, hãy xem trang này: How A Game Loop Works

EDIT: Tôi nói tầm nhìn của bạn về sự mượt mà hoàn hảo là không thực tế. Bạn có thể che giấu nó bằng cách sử dụng các kỹ thuật mà Kevin viết. Nhưng bạn sẽ luôn đấu tranh với giới hạn HW như tỷ lệ làm mới hoặc hiển thị pixelation. Ví dụ, bạn có cửa sổ 640x480 px. Bây giờ, bạn muốn đối tượng của bạn di chuyển theo chiều ngang. Bạn có thể di chuyển đối tượng của mình bằng tiêu đề vector về phía góc dưới cùng bên phải, NHƯNG bạn phải tăng tọa độ đối tượng bằng số phao (640/480). Nhưng trong rendering, bạn đi đến số nguyên. Vì vậy, đối tượng của bạn di chuyển lởm chởm. Không còn cách nào khác. Với tốc độ nhỏ, bạn có thể nhận thấy nó. Bạn có thể làm mờ nó, hoặc làm cho nó di chuyển nhanh hơn, nhưng không bao giờ loại bỏ nó ...

+0

Vì vậy, trong kết luận, bạn nói rằng tôi không thể đạt được "smoothnes hoàn hảo" trong trò chơi nhiều người chơi? –

+0

Nhạt câu trả lời của tôi :) –

+0

Ok cảm ơn bạn rất nhiều. Bạn đã đánh dấu :) –

5
  1. Cho phép đối tượng của bạn di chuyển theo phân số pixel. Trong OpenGL, điều này có thể được thực hiện cho ví dụ của bạn về hình vuông bằng cách vẽ hình vuông lên kết cấu (tức là đường viền một pixel hoặc lớn hơn), thay vì để cho nó chỉ là cạnh đa giác. Nếu bạn đang vẽ đồ họa 2D sprite, thì bạn sẽ có được khá nhiều tự động (nhưng nếu bạn có 1: 1 pixel thì nó sẽ bị mờ/sắc nét/mờ khi nó vượt qua ranh giới pixel).

  2. Mịn (antialias) cạnh đa giác (GL_POLYGON_SMOOTH). Vấn đề với kỹ thuật này là nó không hoạt động với dựng hình dựa trên Z-buffer vì nó gây ra sự trong suốt, nhưng nếu bạn đang làm một cảnh 2D, bạn có thể đảm bảo luôn vẽ lại từ đầu đến trước.

  3. Bật tính năng khử răng cưa nhiều mẫu/siêu mẫu, tốn kém hơn nhưng không có vấn đề ở trên.

  4. Làm cho đối tượng của bạn có hình động đầy đủ mà các thay đổi pixel không dễ nhận thấy bởi vì có nhiều khả năng xảy ra hơn ở cạnh đó (nghĩa là nó di chuyển tại vị trí nhiều hơn 1 pixel/khung).

  5. Làm cho trò chơi của bạn đủ phức tạp và thu hút người chơi bị phân tâm khi nhìn vào pixel.:)

+0

Mẹo hay để làm mịn mọi thứ cho mắt :) –

+0

Cảm ơn bạn đã làm mịn các mẹo, nhưng tôi đã đánh dấu vào " B.Gen.Jack.O.Neill "để có câu trả lời toàn diện hơn. –

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