2013-09-21 33 views
5

Tôi đang cố gắng ra SpriteKit với các thiết lập sau:Làm thế nào để áp dụng toàn màn hình SKEffectNode cho post-processing trong SpriteKit

  1. Một SKScene với hai nút con sử dụng chỉ cho nhóm nút khác: foreground và background .
  2. nền thực sự trống vào lúc này, nhưng cuối cùng sẽ giữ một số loại hình nền/lớp nền .
  3. tiền cảnh là SKEffectNode và bất cứ khi nào người dùng chạm vào màn hình , ý định mới của lớp con SKnode đại diện cho phần tử trò chơi được thêm vào dưới dạng con.
  4. Lớp con SKNode này về cơ bản tạo ra 3 SKShapeNodes và hai nhãn: một chu vi ngoài, chu vi bên trong, 2 nhãn và chu vi quý bên trong. Chu vi quý bên trong có một SKAction rằng làm cho nó xoay vòng mãi mãi về nguồn gốc/trung tâm của nó.

Bây giờ, đây là vấn đề, miễn là tiền cảnh không có bất kỳ CIFilter hoặc có shouldEnableEffects = NO, mọi thứ đều ổn. Đó là, tôi có thể chạm vào màn hình và các yếu tố trò chơi của tôi được khởi tạo và thêm vào cảnh chính. Nhưng phút tôi thử thêm CIGaussianBlur hoặc CIBloom vào nền trước, tôi nhận thấy hai điều:

  1. Tốc độ khung hình giảm xuống khoảng 2fps. Tâm trí bạn, điều này xảy ra ngay cả với ít nhất là 6 nút còn lại trong cảnh.
  2. Hiệu ứng dường như không ngừng cắt nội dung của nó hoặc điều chỉnh khung hình của nó. Tức là, nếu tôi có một nút, hiệu ứng "toàn màn hình" dường như cố gắng và liên tục cắt hoặc điều chỉnh giới hạn của nó thành khu vực tối thiểu cần thiết để giữ tất cả các nút. Đây là một nút:

    enter image description here

Và đây là 2 nút:

enter image description here

Trong OpenGL ES 2, người ta sẽ làm một bài mờ/nở bởi về cơ bản render toàn bộ framebuffer (tất cả các đối tượng) để kết cấu, sau đó thực hiện thêm ít nhất một pass để làm mờ, vv trên texture đó và sau đó hiển thị trong framebuffer gắn vào màn hình hoặc soạn nó với bản gốc render trở lại framebuffer. Tôi mong đợi SKEffectNode hoạt động theo cách tương tự. Tuy nhiên việc cắt xén và hiệu suất kém khiến tôi nghĩ rằng tôi có thể đang sử dụng nút hiệu ứng theo cách sai. Có suy nghĩ gì không?

Trả lời

2

Dường như có lỗi với SKEffectNode đang cố áp dụng bộ lọc cho trẻ em SKShapeNodes theo như tôi có thể biết. Tôi đã chơi với điều này và đạt được kết quả của bạn, nhưng khi tôi chuyển SKShapeNodes cho SKSpriteNodes (sử dụng một png đơn giản của một vòng tròn) thì việc cắt xén không còn xuất hiện nữa. Đó là một lỗi trong đó SKEffectNode không xử lý đột quỵ của SKShapeNode rất tốt. Nếu bạn loại bỏ stroke (lineWidth = 0) và tô màu nó, bạn sẽ thấy rằng không có crop.

Đối với tốc độ khung hình, SKShapeNodes hoạt động kém. Việc chuyển sang SKSpriteNodes mà tôi đã đề cập trước đó đã tăng fps của tôi từ 40 lên 50 khi tôi có 35 nút trên màn hình (iPhone 5) với bộ lọc được áp dụng.

+1

Bây giờ tôi nghĩ về nó, có thể có một cách giải quyết khác: SKView được hỗ trợ bởi CAEAGLLayer và thậm chí có thuộc tính -textureFromNode trả về SKTexture. Nếu tôi thiết lập GL shader của riêng mình để làm mờ/nở, tôi có thể lấy từng khung hình (thông qua thuộc tính hoặc thậm chí bằng cách chạm vào chính lớp đó bằng ngữ cảnh OpenGL của riêng tôi), sau đó xử lý nó và hiển thị lại trong lớp của SKView hoặc một CAEAGLLayer mới. – SaldaVonSchwartz

+1

Bạn có thể nhận xét về việc liệu công việc này có hiệu quả không? Tôi đang cố gắng tìm hiểu xem bạn có thể thực hiện các hiệu ứng xử lý bài đăng của riêng mình bằng Bộ Sprite không? – Oscar

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