Canvas에서 크라우드소싱 프로젝트 만들기 - 페이지 17

 
o_O :

Create_resource (문자열 Resource_name

Resource_name - 얼마나 자주 변경됩니까? 메모리에 얼마나 많은 리소스가 있습니까?

말 그대로 몇 개. 열려 있는 창의 수에 따라 다릅니다. 현재 저는 1-2개의 창을 동시에 작업합니다. 각 창에는 3 - 4개의 비트맵 개체가 있습니다. 어딘가에 8 자원이 있습니다. (속도를 늦추는 것만으로는 부족하다고 생각합니다...)

Windows는 인터페이스 이벤트에서 업데이트됩니다(이제 클릭 시에만, 다른 이벤트는 비활성화됨). 동시에 잠시 후가 아니라 즉시 속도가 느려집니다. 첫 번째 클릭 시. 또한 "제동력"과 창 크기 사이의 관계를 명확하게 볼 수 있습니다. 창이 클수록 사진의 반응이 느려집니다.

동시에 ResourceCreate() 가 즉시 도달하지 않고 로컬 배열을 이미지로 "채운" 후, 즉 모든 색상 계산 및 이미지 배열 초기화 후에 도달한다는 점을 고려해야 합니다. 그게 문제인 것 같아요.

 

최종 결론을 내리기 위해 이미지를 정적 또는 전역 배열에 저장합니다. 인터페이스 이벤트에서 로컬 배열을 초기화하고 ColorToARGB()를 호출하지 않고 창을 ResourceCreate() 로 전송하여 즉시 창을 업데이트합니다.

이 후 제동 효과가 사라지면 요점은 내가 말한 것입니다. 그렇지 않다면 문제는 다른 데 있습니다 ...

나는 이것을 내일 확인하려고 노력할 것이다. 체험 후 결과를 포스팅하겠습니다.

 
프로파일러 로 실행하십시오.
 
o_O :
프로파일러로 실행합니다.
내일 할게요. 확인. )
 

@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?

순수 러시아어로 전환:

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart ()
{
        целочисленное номер = 0 ;
        пока ( номер < 10 )
        {
                Печатать( "номер = " , номер, "!" );
                номер ++;
        }
}
 
Andrey Khatimlianskii :

@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?

순수 러시아어로 전환:

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0 ;
        пока ( номер < 10 )
        {
                Печатать( "номер = " , номер, "!" );
                номер ++;
        }
}

그래서 더 좋은

 
Igor Volodin :

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0 ;
        пока ( номер < 10 )
        {
                Печатать( "номер = " , номер, "!" );
                номер ++;
        }
}

그래서 더 좋은

다음 - #define을 '#define'으로 변경

추가: '손실'을 '이익'으로 변경
등...
 
#define цл    int      // целое
#define цлк   short    // целое короткое
#define цлд   long      // целое длинное
#define плк   float   // плавающее короткое
#define пл    double   // плавающее
#define пст   void      // пустота
#define исток main
#define вывод Print
#define пока  while

пст исток()
{
   цл нмр = 0 ;             // сокращение от номер.
   пока ( нмр < 10 )
   {
      вывод( "номер = " , нмр, "!" );
      нмр ++;

   }

}
제 생각에는 조명이 있어야만 더 나빠지지 않을 것입니다.
 
Andrey Khatimlianskii :

@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?

순수 러시아어로 전환:

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart ()
{
        целочисленное номер = 0 ;
        пока ( номер < 10 )
        {
                Печатать( "номер = " , номер, "!" );
                номер ++;
        }
}

흥미로운 제안, 그것에 대해 생각했습니다. 그러나 두 언어를 결합하면 이점이 있습니다.

프로그램이 한 가지 언어로만 작성된 경우(모국어일지라도) 텍스트의 단조로움으로 인해 보기가 점차 "흐려집니다".

함수 및 변수의 러시아어 이름과 이벤트, 속성, 상수 및 연산자의 영어 식별자를 번갈아 사용하면 더 나은 읽기에 필요한 대비가 생성됩니다.

따라서 러시아어로 완전히 전환하지 않습니다. 그러나 러시아어가 여전히 지배적이며 이는 큰 코드를 탐색하는 데 많은 도움이 됩니다.

 

스타일 작업의 첫 번째 버전의 주도로.

스키마 구현은 다음과 같습니다.

**************

enAttrName - 렌더링된 요소의 속성 목록(확장 가능)

//------------------------------------------------------------------    enum enAttrName
enum enAttrName // возможные аттрибутов контрола
{
         // шрифт
        anFontName, // имя
        anFontColor, // цвет
        anFontSize, // размер
        anFontWeight, // толщина
        anFontStyle, // стиль
         // фон
        anBackgroundColor, // цвет
        anBackgroundFill, // заливка
         // граница
        anBorderColor, // цвет
        anBorderWidth, // толщина
         // выравнивание
        anAlign,
        anVAlign

по мере необходимости добавлять нужные аттрибуты
};


속성은 GAttr 클래스에 저장됩니다.

class GAttr // класс для установки значения в конкретный аттрибут
{
        enAttrName m_attr; // имя аттрибута
         // его значение
         long lval;
         double dval;
         string sval;
};

MqlParam 과 다소 유사하지만 이와는 달리 유형 독립적입니다.

------

속성은 GAttrReflect 목록으로 추가로 그룹화됩니다. 이 목록은 특정 클래스의 특정 상태를 나타냅니다.

class GAttrReflect
{
        GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};

이 클래스의 작업의 중요한 특징은 m_list 목록에서 특정 속성이 두 번 반복될 수 없다는 것입니다. 속성 값은 업데이트 중에 덮어쓰여지거나 속성이 존재하지 않는 경우 생성됩니다.

-------

각 컨트롤에는 이러한 목록이 여러 개 있습니다. 각각은 컨트롤 상태의 반영을 나타냅니다. 이 반사(반사) 목록 은 확장 가능 합니다.

enum enAttrReflect // виды состояний - реакция контрола на своё состояние
{
        arDefault, // состояние по-умолчанию
        arDisable, // недоступен для ввода/неактивный
        arTransp, // должен стать прозрачным
        arSelect, // выбран
        arCheck, // отмечен
        arOver, // мышка над объектом
        arFocus, // получен фокус ввода

по мере необходимости добавлять новые рефлекты
};

따라서 각 컨트롤(클래스)은 각 리플렉션에 대해 정의된 속성을 가질 수 있습니다.

클래스 - GAttrClass - 특정 클래스의 반영 목록을 저장합니다.

class GAttrClass
{
         string m_class; // для какого класса составлен список
        GAttrReflect reflect[arLast]; // список рефлектов класса
};

-------

그리고 마지막으로 존재하는 전체 클래스 세트 처리하는 최종 클래스 GThema 입니다.

class GThema
{
        GAttrClass* m_list[]; // список классов
};

이 클래스에서는 속성 목록과 유사한 원칙이 적용됩니다. 동일한 이름을 가진 두 클래스는 목록에 존재할 수 없습니다.

operator[] 오버로드 덕분에 매개변수 이름을 편리하게 지정할 수 있습니다.

// задаём в классе GButton - цвет текста при наведении указателя мышки
g_thema[ "GButton" ][arOver][anFontColor]=XRGB( 255 , 255 , 255 );

// или можно так
GAttrClass* at = g_thema[ "GButton" ];
GAttrReflect* vl = at[arDefault];
vl[anFontColor] = XRGB( 255 , 255 , 255 );

----------

마지막으로 클래스 주제에서 관심 매개변수를 얻는 방법

1. 목록에서 필요한 클래스 m_class를 찾습니다.
2. 발견되면 그 안에 반영을 찾습니다.
3. 발견되면 속성을 찾고 있습니다.
4. 속성을 찾을 수 없으면 기본 반사와 속성을 찾습니다.
5. 속성이 기본 리플렉션에 없으면 모든 요소에 공통적인 기본 클래스 이름(m_class=NULL)에 대해 1-4단계를 반복합니다.

----------
접근 이점:
- 원칙적으로 생략할 수 있고 새로운 클래스를 생성할 수 없는 기본 클래스가 항상 있습니다.
- 반사를 생성할 수 없으며 기본 arDefault만 사용합니다.
- 각 컨트롤에서 속성을 설정할 필요가 없습니다. GThema에 클래스를 추가하고 데이터를 가져오는 것으로 충분합니다.
- 반사에서 클래스에 대해 설정되지 않은 모든 속성은 기본 반사 또는 기본 클래스에서 계층적으로 가져옵니다.


사유: