Android 手指画四边形:如何避免奇怪的眨眼

Android 手指画四边形:如何避免奇怪的眨眼,android,opengl-es,Android,Opengl Es,我正在尝试通过GLSURFACHEVIEW实现手指绘画应用程序 但四边形闪烁太多,我不得不重新绘制好几次(参见PaintGL类中的onTouchEvent)。看起来我正在使用不同的帧缓冲区,但我不知道如何在它们之间切换或禁用它们以避免这种讨厌的闪烁 这是我的建议: public类PaintRenderer实现GLSurfaceView.Renderer { 私有浮动缓冲区顶点缓冲区; 公共阵列列表l; 公共布尔值isPressed=false; 公共图书馆( { 超级(); l=新的ArrayL

我正在尝试通过GLSURFACHEVIEW实现手指绘画应用程序

但四边形闪烁太多,我不得不重新绘制好几次(参见PaintGL类中的onTouchEvent)。看起来我正在使用不同的帧缓冲区,但我不知道如何在它们之间切换或禁用它们以避免这种讨厌的闪烁

这是我的建议:

public类PaintRenderer实现GLSurfaceView.Renderer
{
私有浮动缓冲区顶点缓冲区;
公共阵列列表l;
公共布尔值isPressed=false;
公共图书馆(
{
超级();
l=新的ArrayList();
}
公共框架(GL10 gl)
{
ArrayList n;
整数计数;
同步(l)
{
n=(ArrayList)l.clone();
}
如果(n.size()==0)
返回;
n、 添加(n.get(n.size()-1));
对于(int i=1;i
这是我的GLSURFACHEVIEW课程:

公共类PaintGL扩展了GLSurfaceView
{
私有上下文;
私人画家;
专用点F前位置、当前位置;
公共绘画GL(上下文){
超级(上下文);
mContext=上下文;
renderer=新的PaintRenderer();
设置渲染器(渲染器);
setRenderMode(脏时RENDERMODE_);
}
@凌驾
公共布尔onTouchEvent(运动事件)
{
if(event.getAction()==MotionEvent.ACTION\u向下)
{
同步(renderer.l)
{
renderer.l.add(0,新的硬点(event.getX(),this.getHeight()-event.getY(),true));
}
}
if(event.getAction()==MotionEvent.ACTION_MOVE | | event.getAction()==MotionEvent.ACTION_UP)
{
//修配室
整数计数=10;
同步(renderer.l){
renderer.l.add(0,新的硬点(event.getX(),this.getHeight()-event.getY(),
event.getAction()==MotionEvent.ACTION_UP?false:true));
while(renderer.l.size()>count)
{
l.移除(计数);
}
}
requestRender();
Log.d(“x”,renderer.l.size()+”);
}
返回true;
}
}
和硬点类:

公共类硬点扩展了PointF
{
布尔表示;
公共硬件点()
{
isPressed=false;
}
公共硬点(浮点x、浮点y、布尔值)
{
super(x,y);
isPressed=按下;
}
}
一些要点:

  • 见:
编写高效代码有两条基本规则:

  • 不要做你不需要做的工作
  • 如果可以避免,就不要分配内存
  • 创建一个浅拷贝。您必须为深度副本添加代码或使用类似的库

  • 在单个列表上消除UI和RenderRead之间的同步。使用第二个列表,其中UI线程仅添加
    硬点
    实例(已同步)。在
    onDrawFrame
    的开头,将
    硬点
    实例转移到“渲染”列表(已同步)。然后,您可以限制列表的大小。这将消除
    克隆

  • 与其每次重新创建四边形几何体,不如创建一次,然后将其平移到正确的位置

  • 为了避免创建
    硬点
    实例,可以应用一个池()来预先分配实例

一些要点:

  • 见:
编写高效代码有两条基本规则:

  • 不要做你不需要做的工作
  • 如果可以避免,就不要分配内存
  • 创建一个浅的