2016-11-28 19 views
2

저는 SpriteKit과 게임 개발에있어 처음으로 완전히 새로운 사람입니다. 저는 공간에서 전략 게임을 만들기 위해 SpriteKit을 가지고 놀았습니다.SpriteKit으로 큰 그리드 렌더링하기

내 백엔드 아키텍처는 내가 빈 케이스와 케이스를 가지고 우주를 표현하기 위해 그리드 시스템을 사용하는 시스템/행성/등 ... 내 그리드 GameplayKit GKGridGraph에 의해 백업됩니다, 나는 무작위로 노드를 생성하는 알고리즘을 사용 속성을 그리드의 각 노드에 적용하고이 고유 한 유니버스의 모든 속성 인 사용자 지정 엔터티를 하위 클래스에 추가했습니다.

렌더링하려면 단순히 다양한 색, 모양 및 질감의 SKShapeNodeSKPriteNode을 사용하십시오.

나는, 내 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

거기가?

+1

이것이 실제 장치로는 느린 것을 확인 했습니까? – hamobi

+0

예, 시뮬레이터에서 17 FPS, 장치에서 정적 노드로 40 FPS,하지만 손가락을 움직이자 마자 1 FPS 미만으로 실속합니다. 효과적으로 스크롤 할 수 없습니다. – Dimillian

+1

내용이 스크롤되면서 스프라이트 키트 노드에 데이터를 동적으로로드하고 언로드해야합니다. 미리 모든 데이터를로드 할 수는 없으며로드 및 렌더링 할 노드를 결정하기 위해 사각형 중복을 동적으로 테스트하도록 코드를 변경하십시오. 이는 기본적으로 타일링과 동일하므로 iOS 10의 새로운 타일 지원을 살펴보고이를 기반으로 할 수 있습니다. – MoDJ

답변

2

SKTileMapNode는 다른 방법으로, 당신은 단지와 현재보기 근처에 노드를로드 할 것 https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps

엑스 코드 8 단이 만들어졌다. 이 작업을 수행하는 알고리즘이 필요하며 tilemaps와 비교할 때 큰 두통이됩니다.

은 내가 너 한테 그것은이 생각을 최적화하기 위해 노력하고 털이 얻을 것 더 이상 볼 수 없다면 노드가 뷰의 .frame' and then using 'addChild' on them--concurrently, add a reference to them to an array, which you would check against next 갱신() and removeFromParent`에 검사 .. 을 포함 할 생각한다. 목표는 양 끝마다 노드를 몇 개만로드하여 카메라를 이동하는 데 약간의 버퍼가 생기는 것입니다 (업데이트가 적음).

수학 함수를 만들어 현재 프레임 좌표와 관련하여 어떤 노드가 있는지 미리 결정할 수 있습니다. 따라서 노드를 반복 할 필요가 없지만 더 많은 작업이 필요합니다. 두통 - 콘솔 등으로 개발하는 사람들이 하이 엔드 게임 및 제한된 파워와 관련이 있어야합니다.

Direct3D/DirectX/OpenGL 게임 개발 서적을 건너 뛰고, 모든 것에 들어간다는 아이디어를 얻는 것이 좋습니다 ... 그들은 찾기가 어렵지 않습니다. 서점에 들어가서 가장 두꺼운/무거운 것을 찾으십시오. 책 - DirectX 게임 개발 도서가 될 것입니다.

SK에서 30 줄로 할 수있는 일은 C++ 및 저수준 AV 프레임 워크에서 수천 줄의 벡터 및 미적분을 필요로합니다. 그것은 당신에게 당신의 SK 여행에서 당신을 도울 게임 개발에 대한 이해, 이해 및 전망을 줄 것입니다 :

+1

나는 백엔드 물건이 어떻게 작동하는지에 대한 (아주) 기본적인 지식을 가지고있다. 게임 개발자와 게임 엔진을 연구 해 보았 기 때문에 처음부터 모든 노드를 추가하는 것이 비효율적이라는 것을 알았다 (SK가 마술을하지 않는 한). 라 UITableView/UICollectionView 재사용),하지만 난 그 SKTilMapNode 그 일을 이해 : D 조. 사실 나는 책상에 hehe 1 OpenGL 도서가 있지만, 모든 횡설계의 경우, 나는 그것을 읽고 사랑 :)하지만 그래, 코딩 엔진 VS 코딩은 나를 위해 거래 차단기입니다, 나는 이동할 시간이 없어 완전히 낮은 수준의 코드를 원한다고해도 : ( – Dimillian

+0

확실히, 당신은 당신이 게임 개발자에게 새로운 사람이라고 언급했기 때문에 나는 그것을 가져 왔습니다.) 그리고 네, 실제로 횡설수설합니다! – Fluidity

+0

그래, 나는 어쨌든, 새로운 일을하고, "가장 쉬운"방법을 택했기 때문에 싸다 : D 그러나 그것은 앱 개발, 매우 다른 사고 방식에서 오는 재미이다. (나는 당신이 루프를보고있다.). – Dimillian