저는 SpriteKit과 게임 개발에있어 처음으로 완전히 새로운 사람입니다. 저는 공간에서 전략 게임을 만들기 위해 SpriteKit을 가지고 놀았습니다.SpriteKit으로 큰 그리드 렌더링하기
내 백엔드 아키텍처는 내가 빈 케이스와 케이스를 가지고 우주를 표현하기 위해 그리드 시스템을 사용하는 시스템/행성/등 ... 내 그리드 GameplayKit GKGridGraph
에 의해 백업됩니다, 나는 무작위로 노드를 생성하는 알고리즘을 사용 속성을 그리드의 각 노드에 적용하고이 고유 한 유니버스의 모든 속성 인 사용자 지정 엔터티를 하위 클래스에 추가했습니다.
렌더링하려면 단순히 다양한 색, 모양 및 질감의 SKShapeNode
및 SKPriteNode
을 사용하십시오.
나는, 내 GKGridGraph
인스턴스의 모든 노드 (GKGridGraphNode
)을 열거하고, 내가 해당 SKNode
생성 얻을하는 각 노드에 대해 (내 SKNode
세대를 각 GKGridGraphNode
개체 연결 개체의 구성 요소), 나는 그들에게 위치를 설정 내 주 노드에 자식으로 추가하십시오 (mapNode라고 부르 자). 간단한 SKNode
입니다. 결국 그리드처럼 보입니다.
30/30 그리드에서 잘 작동하며, 사용자 그리드 (사용자 정의 구현, 사용자가 손가락을 움직일 때 mapNode 위치를 수정 함)를 스크롤하는 동안 60FPS를 사용합니다. 그러나 50/50 또는 100/100 격자를 사용하자 마자 말 그대로 화면에 너무 많은 노드가있어서 스크롤이 작동합니다. 나는 화면에 내 노드의 모든를 추가하지 말아야 알고, 그래서 다양한 전략에 대해 생각 좀 그들에 입력 원 :
대신 내 mapNode 스크롤, 내가 볼 수있는 노드 만 렌더링 수를 화면에 표시 한 다음 사용자가 왼쪽/오른쪽/위/아래로 스크롤 할 때 노드를 추가/제거합니다. 이제는 더 이상 스크롤하지 않으므로 시뮬레이션합니다. 나는 그것을 생각할 수는 있지만 실제로 어떻게 그것을 실제로 구현해야하는지는 모른다. 올바른 해결책입니까?
아마 모든 노드를 하나의 큰 노드로 렌더링 할 수 있습니까? 그렇게 할 수있는 방법이 있습니까? 그런 다음
nodeAtPosition
과 같은 기능을 사용하지 않을 것입니다.이 기능은 내 노드와 관련된 엔터티 (사용자 지정 개체)를 가져 오는 데 광범위하게 사용됩니다.
편집 : 사실, 내 현재 코드는 오픈 소스가 여기에있다 내가 표현하고있어에서 장면이다 : 그 일을 다른 현명한 방법이 https://github.com/Dimillian/LittleOrion/blob/master/Little%20Orion/Little%20Orion/scenes/UniverseScene.swift
거기가?
이것이 실제 장치로는 느린 것을 확인 했습니까? – hamobi
예, 시뮬레이터에서 17 FPS, 장치에서 정적 노드로 40 FPS,하지만 손가락을 움직이자 마자 1 FPS 미만으로 실속합니다. 효과적으로 스크롤 할 수 없습니다. – Dimillian
내용이 스크롤되면서 스프라이트 키트 노드에 데이터를 동적으로로드하고 언로드해야합니다. 미리 모든 데이터를로드 할 수는 없으며로드 및 렌더링 할 노드를 결정하기 위해 사각형 중복을 동적으로 테스트하도록 코드를 변경하십시오. 이는 기본적으로 타일링과 동일하므로 iOS 10의 새로운 타일 지원을 살펴보고이를 기반으로 할 수 있습니다. – MoDJ