Obrigado por este tipo de solução para o problema. De fato, a velocidade de renderização melhorou. Parece que vou ter que aprender a biblioteca.
Gostaria também de esclarecer a seguinte nuance. Ela se compila com esta formulação com um aviso:
E se compila com este sem um aviso, mas a velocidade é um pouco mais lenta.
O que é mais correto?)
Ah, sim, eu esqueci de colocar int. A biblioteca está voltada para coordenadas duplas. A velocidade não pode cair. (int) é praticamente gratuito. Menos de nanossegundo. Você pode definir isso:
y = Round(Canvas.Y(price));
Também não afetará a velocidade (+ ~1 ns), mas posicionará com um pouco mais de precisão.
A função Round integrada no iCanvas retorna int e é muito mais rápida que a função round() normal, mas o argumento duplo x deve estar dentro int (-2 147 483 648 <= x <= 2 147 483 647)
int Ceil (double x) { return (x-(int)x>0)?(int)x+1:(int)x; }
int Round(double x) { return (x>0)?(int)(x+0.5):(int)(x-0.5);}
int Floor(double x) { return (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x; }
int Fabs(int x) {if (x<0) return -x; elsereturn x;}
double X(double bar){return((double)W.Left_bar-bar)*W.dx_pix;}; //The X coordinate by the bar number. The bar number must be of type double, otherwise, the bar will be interpreted as time.double X(datetime Time) //The X coordinate by the time.
{ if(tester) return X((double)iBarShift(_Symbol,_Period,Time));
elsereturn X(wBarShift(Time,W.time,_Period));}
double Y(double Price) {if(W.dy_pix==0) W.dy_pix=1; return((W.Y_max-Price)/W.dy_pix); }; //The Y coordinate by the price.double Price(int y) {return (W.Y_max-y*(W.Y_max-W.Y_min)/W.Height);}; // Price by the Y coordinatedouble Bar(double x) {return((double)W.Left_bar+1-x/(double)W.dx_pix);}; // bar number by coordinate X datetime TimePos(double x) // time by coordinate X
{
double B=Bar(x);
if (tester || W.BarsInWind == 0) iT[0]=iTime(_Symbol,_Period,(int)B);
else {if(B<0 ) iT[0]=datetime(W.time[W.BarsInWind-1]-(long)B*PeriodSeconds());
elseif(B<W.Right_bar || B>W.Left_bar) iT[0]=iTime(_Symbol,_Period,(int)B);
else iT[0]=W.time[W.BarsInWind-Floor(B)-1+(int)W.Right_bar];}
return iT[0]+int((double)PeriodSeconds()*(1-B+(int)B));
};
Tire este código do laço e ligue para ele uma vez antes de cada evento de redesenho:
É realmente mais complicado do que aprender alguma biblioteca?
Era isso que eu estava dizendo. Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho? dois deles são fáceis de produzir... Código, em resumo. Se você não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))
Isso foi o que eu disse. Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho? dois deles são fáceis de produzir... Código, por favor. Se não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))
Incrivelmente impressionado por suas idéias a meu respeito))
Obrigado por este tipo de solução para o problema. De fato, a velocidade de renderização melhorou. Parece que vou ter que aprender a biblioteca.
Gostaria também de esclarecer a seguinte nuance. Ela se compila com esta formulação com um aviso:
E se compila com este sem um aviso, mas a velocidade é um pouco mais lenta.
O que é mais correto?)
Ah, sim, eu esqueci de colocar int. A biblioteca está voltada para coordenadas duplas.
A velocidade não pode cair. (int) é praticamente gratuito. Menos de nanossegundo.
Você pode definir isso:
Também não afetará a velocidade (+ ~1 ns), mas posicionará com um pouco mais de precisão.
A função Round integrada no iCanvas retorna int e é muito mais rápida que a função round() normal, mas o argumento duplo x deve estar dentro int (-2 147 483 648 <= x <= 2 147 483 647)
Olhe dentro do iCanvas e a pergunta vai embora:
Mas Kanvas é muito mais agradável de se trabalhar, você pode aplicar transparência, é mais rápido e o código ocupa menos espaço)):
Obrigado por este tipo de solução para o problema. De fato, a velocidade de renderização aumentou. Parece que vou ter que aprender a biblioteca.
Gostaria também de esclarecer a seguinte nuance. Ela se compila com esta formulação com um aviso:
E se compila com este sem um aviso, mas a velocidade é um pouco mais lenta.
O que é mais correto?)
Tire este seu código do laço e chame-o uma vez antes do laço em cada evento de repintura:
É mais complicado do que aprender alguma biblioteca?
Como um peixe na água :)
PNB2))
Tire este código do laço e ligue para ele uma vez antes de cada evento de redesenho:
É realmente mais complicado do que aprender alguma biblioteca?
Era isso que eu estava dizendo.
Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho?
dois deles são fáceis de produzir...
Código, em resumo.
Se você não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))
Isso foi o que eu disse.
Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho?
dois deles são fáceis de produzir...
Código, por favor.
Se não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))
Incrivelmente impressionado por suas idéias a meu respeito))
Estou incrivelmente impressionado com suas percepções de mim))
Menos palavras, mais ação
Obrigado pelos exemplos! Muito claro e informativo, e não menos rápido.
Todos os gráficos do exemplo nas listas de objetos parecem ser um único objeto.
É possível obter diferentes pontas de ferramentas (pontas de ferramentas) quando se passa o mouse sobre itens gráficos individuais?
Ou posso criar um objeto de lona separado para cada retângulo? Isso não afetará a velocidade?
Se você tiver tempo, estou esperando por uma resposta, e talvez um exemplo de código.