- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 GLSurfaceView 实现手指绘画应用。
但四边形闪烁太多,我不得不重新绘制它们几次(请参阅 PaintGL 类中的 onTouchEvent)。看来我正在使用不同的帧缓冲区,但我不知道如何在它们之间切换或禁用它们以避免这种讨厌的闪烁。
这是我的渲染器:
public class PaintRenderer implements GLSurfaceView.Renderer
{
private FloatBuffer vertexBuffer;
public ArrayList<HardPoint> l;
public boolean isPressed = false;
public PaintRenderer()
{
super ();
l = new ArrayList<HardPoint>();
}
public void onDrawFrame(GL10 gl)
{
ArrayList<HardPoint> n;
int count;
synchronized (l)
{
n = (ArrayList<HardPoint>) l.clone();
}
if (n.size() == 0)
return;
n.add(n.get(n.size() - 1));
for (int i = 1; i < n.size(); i++) {
HardPoint start = n.get(i-1);
HardPoint end = n.get(i);
if (!end.isPressed)
continue;
float dx = end.x - start.x;
float dy = end.y - start.y;
count = (int) Math.ceil(Math.max(Math.sqrt(dx * dx + dy * dy), 1));
for (int j = 0; j < count; j++)
{
drawQuad(gl, new PointF(start.x + dx * (float)j/count , start.y + dy * (float)j/count), 40.0f);
}
}
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0.0f, width, 0.0f, height, -1.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_DEPTH_TEST);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
}
public void drawQuad(GL10 gl_main, PointF center, float side)
{
int VERTEX_COUNT = 4;
float vertices[] =
{
// Вершины квадрата
center.x - side/2, center.y + side/2, // 0. левая нижняя
center.x + side/2, center.y + side/2, // 1. правая нижняя
center.x - side/2, center.y - side/2, // 2. левая верхняя
center.x + side/2, center.y - side/2, // 3. правая верхняя
};
ByteBuffer vbb = ByteBuffer.allocateDirect(VERTEX_COUNT * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
gl_main.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
gl_main.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
gl_main.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
这是我的 GLSurfaceView 类:
public class PaintGL extends GLSurfaceView
{
private Context mContext;
private PaintRenderer renderer;
private PointF prev_loc, cur_loc;
public PaintGL(Context context) {
super(context);
mContext = context;
renderer = new PaintRenderer();
setRenderer(renderer);
setRenderMode(RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
synchronized (renderer.l)
{
renderer.l.add(0, new HardPoint(event.getX(), this.getHeight() - event.getY(), true));
}
}
if (event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_UP)
{
//FIXME Мерцание первого quad'a при достаточно большом количестве точек
int count = 10;
synchronized (renderer.l) {
renderer.l.add(0, new HardPoint(event.getX(), this.getHeight() - event.getY(),
event.getAction() == MotionEvent.ACTION_UP ? false : true));
while (renderer.l.size() > count)
{
renderer.l.remove(count);
}
}
requestRender();
Log.d("x", renderer.l.size()+" ");
}
return true;
}
}
和 HardPoint 类:
public class HardPoint extends PointF
{
boolean isPressed;
public HardPoint()
{
isPressed = false;
}
public HardPoint (float x, float y, boolean pressed)
{
super(x, y);
isPressed = pressed;
}
}
最佳答案
几点:
There are two basic rules for writing efficient code:
- Don't do work that you don't need to do.
- Don't allocate memory if you can avoid it.
ArrayList.clone创建一个浅拷贝。您必须为深拷贝添加代码或使用像 cloning 这样的库.
摆脱单列表上 UI- 和 Renderthread 之间的同步。使用第二个列表,其中 UI-Thread 仅添加 HardPoint
实例(同步)。在onDrawFrame
开始时,将HardPoint
实例传输到“render”列表(同步)。然后,您可以限制列表的大小。这消除了克隆
。
与其每次都重新创建四边形几何体,不如创建一次,然后将其平移到正确的位置。
要消除 HardPoint
实例的创建,您可以应用池 (here's the AndEngine one) 预分配实例。
关于android - 带四边形的手指画 : how to avoid strange blinking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10547044/
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 9 年前。 所以我运行了这段代码 String line =
此代码适用于我的网站: $(function(){ $('.link-follow-stop').on('click', function(event){ console.lo
private synchronized Map calculateStanding() { System.out.println("Calculate standing for
下面的程序 (prog1) 抛出 OutOfMemoryError 错误。确实如此。但如果我在第 5 行(prog2)下方添加 sysout,它不会抛出错误。这种奇怪的行为有什么原因吗? 程序1: p
class Foo(object): def __init__(self,x): self.x = x self.is_bar = False def
好的,我有一个设置了高度和宽度的简单 div。前后也设置了高度和宽度。它们都设置为显示为 block ,伪元素的内容为“”。 :before 在内容里面,而不是在它之前。:after 之前有一大堆奇怪
我无法解释 Scala 集合的这种行为。 让我们从一些定义开始。 import scala.collection.mutable.Set case class Item(name: String, c
在阅读我遇到的代码时,结构的以下定义和初始化: // header file struct foo{ char* name; int value; }; //Implementation file s
我正在尝试用 c 操作二进制数。我用下面的最小代码发现了一个奇怪的事情。谁能告诉我“+”和“|”有什么区别这里?谢谢! char next_byte1 = 0b11111111; char next_
我是德尔福的新手。在 TStrem 类的文档中,我读到它是一个抽象类。所以我认为当我尝试使用 创建它时编译器会出错 stream := TStream.Create(); 为什么不呢? 最佳答案 De
我有 2 个简单的表单,Form1 和 Form2 (Delphi 7)。 Form1 打开 Form2,我在那里等待特定的组合键 (Ctrl + F2)。一旦我关闭 Form2 并返回到 Form1
我有很多建立TCP网络的类-使用boost::asio,使用Packet进行传输。 (Packet的基类是std::vector) 我以为我已经解决了所有可能的内存泄漏,但是后来我在关闭客户端之前只是
我对以下声明有一些疑问: SELECT 1 FROM dual WHERE DECODE(1, 0, (SELECT COUNT(*) from tbl
我已经在 symfony 2.1 上安装了最新的 Sonata 管理包,但遇到了以下问题: 配置文件: services: app.geo.admin.city: class: App
我必须输出一系列先前保存在数据库中的随机图像。在输出的那一刻,而不是打印一张图片,代码打印一个奇怪的字符串(meaby dumpfile?): (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(
我刚刚在从 Code Project 下载的项目中看到了这个: base.DialogResult = this.Result != null; 我不认为自己是 C# 新手,但这个对我来说是新手。谁能
看看这个...今天晚上我试图将一些 primiteves 转换到 wrapper 上时发现: Integer i = (Integer)4; Integer i = (Integer)4f; // D
我很少使用 Python,所以我不清楚为什么允许这样的行为:没有 w 对象,因此它没有 s 属性,那为什么 f 允许进行 w.s 赋值? >>> def f(): w.s="ads" #al
在 Jsfiddle 上:http://jsfiddle.net/jhzux/ 我在这个简单的脚本上浪费了很多时间。我想做的是在 jQuery 中启用克隆表单,然后使它们正常工作。 首先,当我在 Js
这是我的代码: .specific_tag_cases a:after{ position: absolute; font-family: Arial; background-
我是一名优秀的程序员,十分优秀!