2017-12-22 10 views
0

저는 2D 안드로이드 게임을 만들고 있습니다. 현재는 Canvas에서 그림을 그립니다.Android에서 OpenGL에 Canvas 이식하기

많은 원을 그리려고 할 때 프레임 속도가 많이 떨어집니다. 그래서 나는 더 강력한 무엇인가로 그림을 그리도록 노력해야한다고 생각했습니다.

캔버스 기반 게임을 OpenGL ES 또는 다른 게임 엔진으로 포팅하는 가장 쉬운 방법은 무엇입니까? 내 게임에 어떤 게임 엔진을 포팅해야합니까?

답변

1

내 자신의 2D 엔진으로 비슷한 포트/확장을 수행하는 중 일이 생겼습니다.이 정확한 질문을 직접 사용했습니다.

  1. 는 그것은 SurfaceView를 사용

    나는 당신의 엔진이 순간에 작동하는 방식은 다음과 같은 가정.

  2. 게임 루프 (별도 스레드)에서 lockCanvas()을 호출합니다.
  3. 그런 다음 drawCircle(), drawLine(), drawPath() 등의 일부 메소드 (Skia 라이브러리는 후드) 중 일부를 사용하여 Canvas을 그립니다.
  4. 그런 다음 unlockCanvasAndPost()을 호출합니다.
  5. 그런 다음 Thread.sleep()을 사용하여 잠시 기다려야 할 수 있습니다.

이 가정 한 다음, 올바른 경우 : 모든


첫째, 당신의 프레임 속도 (예를 들어 부족할 수 있습니다 이유 많은 이유, 따라서, 게임 루프의 모든 개체를 만드는이있다 쓰레기 수거가 시작됨). 당신이 그것을 측정 한 경우 (System.nanoTime() 사용)하고, 그 다음에, 너무 오래 걸리는 drawCircle() 방법의 소명 :

Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
Canvas c = new Canvas(b); 
c.drawCircle(...); 

당신은 그릴 수 :


당신은 비트 맵을 생성하려고 할 수 있습니다 게임 루프에서 비트 맵을 그립니다 (drawBitmap() 메서드 사용). 이것은 이미 서클을 그리는 것보다 훨씬 빠릅니다.


여전히 느린 경우 OpenGL ES 2.0을 사용해보십시오. 책 OpenGL ES 2 for Android by Kevin Borthaler과 같은 튜토리얼을 따르는 것이 좋습니다. 여기에는 2D와 텍스처링 모두에 대한 좋은 예가 있습니다. 자신의 질감 예제 소스 코드에서 시작하여 수정하는 것이 좋습니다.

OpenGL ES를 사용하여 점, 선 및 삼각형 이외의 모양을 그릴 수없고 텍스처로 렌더링 할 수 없다는 사실을 알게됩니다. 여기서 가장 쉬운 방법은 각 서클에 대해 2 개의 삼각형을 사용하여 직사각형을 만들고, 원을 그려 초기화하여 Bitmap에서 오는 텍스처를 적용하는 것입니다.


이것은 현재 도면을 "포팅"하는 가장 쉬운 방법이지만 여전히 복잡합니다. 먼저 Bitmap 기반 접근 방식을 시도해 보는 것이 좋습니다.

게임 엔진은 게임 엔진이 아닌 저수준 GPU API 인 OpenGL ES 자체를 기반으로합니다. 프로세스를 더 쉽게 만들 수 있지만 옵션은이 마지막 접근 방식과 비슷합니다.