BbaDdo :: 'cocos2d-x' 카테고리의 글 목록


'cocos2d-x'에 해당되는 글 3건

  1. 2015.06.01 vmware size 줄이기 - cleanup disk가 작동안할때
  2. 2015.05.11 cocos2d-x 2.2.4 & 3.x : false positive, memory leaks
  3. 2014.09.05 How to show the admob in cocos2d-x (android)?





VMware 가상디스크 실제 사용량과 하드디스크 용량 맞추기 

=> 용량줄이기


가상디스크는 데이타를 추가할수록 최초 설정한 크기까지 늘어난다.

또한 사용하면서 데이터를 삭제해도 디스크에서 차지하는 전체 크기를 친절하게 다시 줄여주지는 않는다.
아래와 같이 좀 까다로울 수도 있지만 확실한 방법으로 가상디스크를 

줄여서 작은 용량의 ssd에 설치했을 경우 필요이상으로 차지하는 용량에 대한 신경을 끄자.

사실, vmware 최신 버젼(10/11)에서 cleanup disk가 작동하지 않을때 

처리방법.


특히 OS X 나라별 언어패키지의 용량이 6기가 이상 되는듯 하기 때문에 (users(사용자)에 들어 있는듯)
이런 필요없는 파일을 지워서 용량을 최적화. ==> CleanMyMac 어플을 사용해서 디스크정리하면 된다.

ssd의 경우에도 시간이 제법 걸린다.


단, 반드시 백업하고 난뒤에 실행에 옮겨야 함. 책임 안짐. 필자의 놋북에서는 문제없음.

윈도우7의 경우 보통 사용자 폴더에 Vitual Machine 폴더.

해당 파일들은 어느 폴더에 위치하든지 버츄얼머신에서 open 할 수 있다.





***********************************방법************************************

가상디스크 os x 의 빈공간을 zerofile 로 만든후 삭제하고 
윈도우 VM에서 Defragment + Shrink
크기설정은 4096 MB * 10000000 = 40 GB ==> 자신의 가상디스크 크기에 맞게 count 설정


1. Start the virtual machine and open a Terminal shell.
버츄얼 머신을 실행하고 터미널을 연다. 맥에서 유틸리티 폴더내에 있다.


2. We need to write out a very large zero filled file to fill all sectors with zeros.
This is what VMware tools does during the "Preparing for shrink" phase. To do this use:
빈공간을 0로 채운 하나의 "zerofile"을 만든다. 처음 설정한 가상디스크의 크기에 맞게 count값을 정한다.
아래와 같이 입력.

sudo dd if=/dev/zero of=/zerofile bs=4096 count=10000000    ==>(40gb)

3. When the disk is full then use Ctrl-C to stop the command
OS X 10.10 인 경우 알림창이 뜨는데 확인을 누름.


4. Then delete the file with:
zerofile을 지움.아래와 같이 입력.

sudo rm /zerofile


5. Shutdown the guest and close Workstation or whatever VMware product you are using.
OS X를 닫고 버츄얼머신도 끔.

6. Open a command prompt in Windows
도스 프롬프트를 실행하고 해당폴더로 가거나 아래와 같이 입력.

여기서 잠깐, 윈도우7에서 해당 폴더에서 cmd 창 여는 방법은 윈도우탐색기를 열어서 해당 폴더로 간후에 폴더내용창에서

shift + 마우스 오른버튼 클릭하면 나오는 박스에서 '여기서 명령창 열기(w)'를 클릭.

7. Run this command replace the folder name with where VMware is installed on your machine:
디스크 조각모음은 아래와 같이 입력.

<vmware윈도우 폴더위치>\vmware-vdiskmanager -d "vmdk_name"

8. Then run this command:
가상디스크 축소 명령을 아래와 같이 입력.
<vmware윈도우 폴더위치>\vmware-vdiskmanager -k "vmdk_name"

ex)
"C:\Program Files <x86>\VMware\VMware Workstation\vmware-vdiskmanager" -k "d:\Virtual Machines\OSX10.vmdk"

VixDiskLib: Invalid configuration file parmeter. Failed to read configuration file.
   Shrink: 0% done

100% 될때까지 기다린 뒤 차지하는 실제 가상디스크 크기가 줄어든 것을 볼 수 있다.



끝. 

사용하고 있는 가상디스크 파일들은 늘, 꼭, 언제나, 항상, 미리 여벌로 백업해 둘것!!!

저작자 표시 비영리 변경 금지
신고




결국 이제서야 코코스투디크로스 3.5 를 설치하고 설정하려니...

오래 전에 다 설치해놓고서 지금 다시보면 까마득.... 휘발성 대가리라 이렇게라도 기록해놓아야.

그리고 3.x 버젼은 렌더링을 새로 구현해서 기존 2.2 버젼보다 10배이상 빠르다고 한다.

spritebatchnode를 더 이상 쓸 필요가 없다고 함... 편해질 듯...

http://cocos2d-x.org/news/216


그런데 내부적으로 텍스쳐를 합쳐 새로 생성하는 기능이 없어졌다고 하는 듯 하는데 아직 확인을 못했다.

아직 안해봐서 그게 그건지 모름. 설마 아니겠지.

그래서 가장 안정적인듯한 2.2.3을 필요에 따라 번갈아 써야 할 듯. 공짜엔진이니까 아무래도 좋아요. 쐐쐐~


cocos2d-x 2.2.4 이상, 3.x에서 발생되는 메모리릭...

같은 코드인데도 2.2.3에서는 전혀 생기지 않았는데 발생된 기억이 난다.

4 byte 릭은 원래 생긴다는데 엔진코드를 살짝 바꾸면 없어짐.

기본 helloworld에서도 우루루 쏟아지는 메모리릭들이 vs에서 잘못 찾은 것이라고들 한다.


가양성 false positive...

  _CrtDumpMemoryLeaks can give false indications of memory leaks." data-guid="c58c57db8b6accd93a89a674a63ef875"><sentencetext style='font-family: "Malgun Gothic", Gulim, "Segoe UI", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif !important;' xmlns="http://www.w3.org/1999/xhtml">간혹 _CrtDumpMemoryLeaks가 메모리 누수를 잘못 표시하는 경우도 있습니다.</sentencetext>  _CRT_BLOCKs or _CLIENT_BLOCKs." data-guid="d05cd00ff2d5e636da4397a2f7e83f46"><sentencetext style='font-family: "Malgun Gothic", Gulim, "Segoe UI", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif !important;' xmlns="http://www.w3.org/1999/xhtml">이러한 오류는 내부 할당을 _CRT_BLOCK이나 _CLIENT_BLOCK 대신 _NORMAL_BLOCK으로 표시하는 라이브러리를 사용할 때 발생할 수 있습니다.</sentencetext>  _CrtDumpMemoryLeaks is unable to tell the difference between user allocations and internal library allocations." data-guid="309a37b28f5798b796144f756b6ae2df"><sentencetext style='font-family: "Malgun Gothic", Gulim, "Segoe UI", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif !important;' xmlns="http://www.w3.org/1999/xhtml">이 경우 _CrtDumpMemoryLeaks가 사용자 할당과 내부 라이브러리 할당을 구별할 수 없게 됩니다.</sentencetext>  _CrtDumpMemoryLeaks, every internal library allocation is reported as a memory leak." data-guid="68e43a7af600c5b0e4135934898a4992"><sentencetext style='font-family: "Malgun Gothic", Gulim, "Segoe UI", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif !important;' xmlns="http://www.w3.org/1999/xhtml">_CrtDumpMemoryLeaks를 호출한 이후에 라이브러리 할당을 위한 전역 소멸자가 실행되면 모든 내부 라이브러리 할당이 메모리 누수로 보고됩니다.</sentencetext>  _CrtDumpMemoryLeaks to report such false positives, but this has been fixed in recent releases." data-guid="cf7710ded385efefa5cd9a5292c36b5b"><sentencetext style='font-family: "Malgun Gothic", Gulim, "Segoe UI", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif !important;' xmlns="http://www.w3.org/1999/xhtml">Visual Studio .NET 이전 버전의 표준 템플릿 라이브러리에서는 _CrtDumpMemoryLeaks가 이러한 가양성(false positive)을 보고했지만, 최신 릴리스에서는 이 문제가 해결되었습니다.</sentencetext>

 

 

https://msdn.microsoft.com/ko-kr/library/x98tx3cf.aspx





1. 일반적인 메모리릭 검사방법

win32/main.cpp 


#if defined( DEBUG ) || defined( _DEBUG )

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#endif // DEBUG

 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int nCmdShow)
{

#if defined( DEBUG ) || defined( _DEBUG )
 //_CrtSetBreakAlloc(95832); //중단점
 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);


 // int *nData = new int;   //메모리릭 테스트
 // int *nData =(int*) malloc(16);
 // _CrtDumpMemoryLeaks(); //실시간 콘솔출력
#endif // DEBUG

 

// UNREFERENCED_PARAMETER( hInstance ) ;
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);
 // UNREFERENCED_PARAMETER( nCmdShow ) ;


 // create the application instance
 AppDelegate app;
 return Application::getInstance()->run();


}


2. Visual Leak Detector를 이용한 메모리릭 검사방법

다운로드 홈페이지: https://vld.codeplex.com/releases

단점은 컴파일 속도가 조금 느려짐.

현재 최신버젼인 2.4rc2만 vs2013, 2012에서 작동확인.

RC버젼이라 아직 정식이 아니지만 잘 돌아가니 그냥 씀.


설정방법은 아래와 같이 간단.

main.cpp



#if defined( DEBUG ) || defined( _DEBUG )


#include <vld.h> 


#endif // DEBUG


최신버젼을 설치하면 자동으로 윈도우 환경변수와 vs 라입 링크를 걸어줌.

다만, include 경로는 수동으로 설정해주어야 함.

프록젝트 오른쪽클릭> 속성 > c/c++> 일반> 추가포함디렉터리>편집>c:\Program Files (x86)\Visual Leak Detector\include 추가


검사가 잘되는지 확인방법은

char *p = (char *)malloc(sizeof(char)* 1000);

이런 코드를 클래스내 아무곳에나 추가해서 확인.


vld를 제거하고 싶은 경우는 설치된 폴더로 가서 uninstall 하면 됨. 누구신지 모르지만 잘 만들었다. 


설치 참고 사이트 : http://choorucode.com/2010/09/11/visual-leak-detector-investigate-memory-leaks-in-visual-c/







끝.

저작자 표시 비영리 변경 금지
신고

 

 

ODIN SISA??


 

 

It seems to be taken a lot of memory and the cpu usage with admob.

Usually, I load the admob banner with static member variable.

 

If load it when admob should be and remove it?

This is a good idea, I think. Well, not sure.

 

<cocos2d-x  & Android code>

1.Android : Cocos2dxActivity.java

 

.........................

.........................

........................

 

 //admob=======================================================
 private AdView adView = null;
 private final String MY_AD_UNIT_ID = "ca-app-pub-***************** ;
 private LinearLayout adLayout = null;
 private static Cocos2dxActivity  coAct;
 //=============================================================

 

 

 // ===========================================================
 // Constructors
 // ===========================================================
 
 @Override
 protected void onCreate(final Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       sContext = this;
       this.mHandler = new Cocos2dxHandler(this);

       this.init();

 Cocos2dxHelper.init(this, this);
 
  
 
 // ===========================================================
 // Getter & Setter
 // ===========================================================

 // ===========================================================
 // Methods for/from SuperClass/Interfaces
 // ===========================================================

 

.......................

......................

......................

 

 // ===========================================================
 // Methods
 // ===========================================================
 @SuppressLint("NewApi")
 public void init() {
      setContentView(R.layout.game_demo); 
      ViewGroup framelayout = (ViewGroup)findViewById(R.id.gamePlace); 
         
       // Cocos2dxGLSurfaceView 
       this.mGLSurfaceView = this.onCreateView(); 

 

// ...add to FrameLayout   
framelayout.addView(this.mGLSurfaceView);

 

// Switch to supported OpenGL (ARGB888) mode on emulator
if (isAndroidEmulator()) {
           this.mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
 }

 this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());

 

       

//=========================================
// admob layout
//=========================================
coAct = this;
adLayout = (LinearLayout)findViewById(R.id.admob);
adLayout.setVisibility(View.INVISIBLE);
//=========================================

 

}

  

public Cocos2dxGLSurfaceView onCreateView() {
     return new Cocos2dxGLSurfaceView(this);
}

....................

....................

....................

  

 @Override
 protected void onResume() {
      super.onResume();
      if (adView != null) {
            adView.resume();
      }
  
      Cocos2dxHelper.onResume();
      this.mGLSurfaceView.onResume();
 }

 

 

 @Override
 protected void onPause() {
      if (adView != null) {
            adView.pause();
      }
      super.onPause();

      Cocos2dxHelper.onPause();
      this.mGLSurfaceView.onPause();
 }

 

@Override
protected void onDestroy() { 
     // Destroy the AdView.
     if (adView != null) {
          adView.destroyDrawingCache();
          adView.destroy();
          adView = null;

          RecycleUtils.recursiveRecycle(((AdView)adView));
          System.gc();
     }
    
     adLayout.destroyDrawingCache();
     adLayout = null;
     super.onDestroy();
 } 
  

 

 


 //====================================================
 //admob show or not  <=== > cocos2d-x native jni
 //====================================================
 static void showAD(final boolean b){
    coAct.runOnUiThread(new Runnable(){
       @SuppressLint("NewApi")
       @Override
       public void run() {
           if(b && coAct.adView == null){ //.getVisibility()== View.INVISIBLE){
               coAct.adLayout.setVisibility(View.VISIBLE);
               try{
                      //adView     
                     coAct.adView = new AdView(coAct);
                     coAct.adView.setAdSize(AdSize.MEDIUM_RECTANGLE);
                     coAct.adView.setAdUnitId(coAct.MY_AD_UNIT_ID); 
                     coAct.adView.setAlwaysDrawnWithCacheEnabled(true);
            
                      //add   adView    
                     coAct.adView.loadAd(new AdRequest.Builder().build()); 
                     coAct.adLayout.addView(coAct.adView); 
               }catch (Exception e) { };
      }
      else if(!b && coAct.adView != null && coAct.adView instanceof AdView)    

{

   coAct.adLayout.removeView(coAct.adView);

               coAct.adView.setVisibility(View.GONE);
               coAct.adView.setEnabled(false);
               coAct.adView.destroyDrawingCache();
               coAct.adView.removeAllViews();
               ((AdView)coAct.adView).destroy();
               coAct.adView = null;
     
               //RecycleUtils.recursiveRecycle(((AdView)coAct.adView));
               System.gc();
               coAct.adLayout.setVisibility(View.INVISIBLE);
        }
   }
  });

 }  

 //=========================================================

 

.......................

.......................

.......................

 

 

 

 

 

 

2. game_demo.xml

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/gamePlace"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/admob"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="#00000000"
        android:clickable="false"
        android:visibility="visible" >
    </LinearLayout>

</RelativeLayout>

 

 

 

 

 

3. AdJni.h   AdJni.cpp

AdJni.h  ===================

===========================

#ifndef __ANDROID_ADM_JNI_H__
#define __ANDROID_ADM_JNI_H__

extern "C" 
{
         extern void showADJNI(const bool b);
}

#endif

 

 

AdJni.cpp=======================

================================

#include "AdJni.h"
#include "JniHelper.h"
#include <jni.h>

using namespace cocos2d;

extern "C"
{
     void showADJNI(const bool b)
     {
          JniMethodInfo t;
          if (JniHelper::getStaticMethodInfo(t, "org/cocos2dx/lib/Cocos2dxActivity",

                       "showAD", "(Z)V"))
        {
               t.env->CallStaticVoidMethod(t.classID,t.methodID, b);
               t.env->DeleteLocalRef(t.classID);
        }
 }

}

 

 

 

 

 

 

저작자 표시 비영리 변경 금지
신고
1 

카운터

Total : 14,639 / Today : 0 / Yesterday : 13
get rsstistory!