Java Libgdx Pixmap drawCircle现在正在绘制
我想在屏幕上画一个空心圆。我得到了一个类Java Libgdx Pixmap drawCircle现在正在绘制,java,android,libgdx,desktop,Java,Android,Libgdx,Desktop,我想在屏幕上画一个空心圆。我得到了一个类实现屏幕,这是它的渲染方法: @Override public void render(float delta) { update(delta); Gdx.gl.glClearColor(1,0,0,1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); myGame.batch.setProjectionMatrix(gamecam.combined); myGame.batch
实现
屏幕,这是它的渲染
方法:
@Override
public void render(float delta) {
update(delta);
Gdx.gl.glClearColor(1,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
myGame.batch.setProjectionMatrix(gamecam.combined);
myGame.batch.begin();
Pixmap pixmap = new Pixmap(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Pixmap.Format.RGBA8888);
pixmap.setColor(Color.BLACK);
pixmap.drawCircle(100, 100, 15);
Texture texture = new Texture(pixmap);
myGame.batch.draw(texture, 0, 0);
myGame.batch.end();
}
但由于某种原因,我得到了一个红色屏幕,一个Pixmap将其数据存储在本机堆内存中,不要在
render()
方法中创建。不要在render
方法中也创建纹理
private Pixmap pixmap;
private Texture texture;
@Override
public void show() {
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
gamecam = new OrthographicCamera(30, 30 * (h / w));
gamecam.position.set(gamecam.viewportWidth / 2f, gamecam.viewportHeight / 2f, 0);
gamecam.update();
pixmap= getPixmapCircle(10, Color.WHITE,false);
texture=new Texture(pixmap);
texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
}
@Override
public void render() {
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
myGame.batch.setProjectionMatrix(gamecam.combined);
myGame.batch.begin();
myGame.batch.draw(texture,100,100);
myGame.batch.end();
}
public static Pixmap getPixmapCircle(int radius, Color color, boolean isFilled) {
Pixmap pixmap=new Pixmap(2*radius+1, 2*radius+1, Pixmap.Format.RGBA8888);
pixmap.setColor(color);
if(isFilled)
pixmap.fillCircle(radius, radius, radius);
else
pixmap.drawCircle(radius, radius, radius);
pixmap.drawLine(radius, radius, 2*radius, radius);
Pixmap.setFilter(Pixmap.Filter.NearestNeighbour);
return pixmap;
}
@Override
public void dispose() {
pixmap.dispose();
texture.dispose();
}
当不再需要pixmap或纹理时,必须调用dispose(),否则将导致内存泄漏pixmap将其数据存储在本机堆内存中,不要在
render()方法中创建。不要在render
方法中也创建纹理
private Pixmap pixmap;
private Texture texture;
@Override
public void show() {
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
gamecam = new OrthographicCamera(30, 30 * (h / w));
gamecam.position.set(gamecam.viewportWidth / 2f, gamecam.viewportHeight / 2f, 0);
gamecam.update();
pixmap= getPixmapCircle(10, Color.WHITE,false);
texture=new Texture(pixmap);
texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
}
@Override
public void render() {
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
myGame.batch.setProjectionMatrix(gamecam.combined);
myGame.batch.begin();
myGame.batch.draw(texture,100,100);
myGame.batch.end();
}
public static Pixmap getPixmapCircle(int radius, Color color, boolean isFilled) {
Pixmap pixmap=new Pixmap(2*radius+1, 2*radius+1, Pixmap.Format.RGBA8888);
pixmap.setColor(color);
if(isFilled)
pixmap.fillCircle(radius, radius, radius);
else
pixmap.drawCircle(radius, radius, radius);
pixmap.drawLine(radius, radius, 2*radius, radius);
Pixmap.setFilter(Pixmap.Filter.NearestNeighbour);
return pixmap;
}
@Override
public void dispose() {
pixmap.dispose();
texture.dispose();
}
当不再需要pixmap或纹理时,必须调用dispose(),否则将导致内存泄漏ismyGame.batch
aSpriteBatch
?我已将您的代码(withoud setProjectionMatrix)添加到我的项目中,并且所有内容都已正确渲染。我认为使用setProjectionMatrix
可以使0,0周围的区域(圆圈所在的位置)不可见,因此不会进行渲染。myGame.batch
aSpriteBatch
?我将您的代码(不使用setProjectionMatrix)添加到我的项目中,并且每个元素都可以正确渲染。我认为使用setprojectomatrix
可以使0,0周围的区域(圆圈所在的位置)不可见,因此不进行渲染。请解释一下为什么不在每次执行渲染时应用程序调用的游戏循环调用的render()
render中创建它。每次它都会在代码中创建一个单独的新纹理和像素贴图。Pixmap和纹理是加载到GPU内存中的相当重的对象。即使是纹理/Pixmap,也不应在渲染中创建任何对象,直到出现适当的条件。请您解释一下,为什么不在每次执行渲染时,在应用程序的游戏循环调用的render()
render中创建它。每次它都会在代码中创建一个单独的新纹理和像素贴图。Pixmap和纹理是加载到GPU内存中的相当重的对象。即使是纹理/像素贴图,也不应在渲染中创建任何对象,直到出现适当的条件。