首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图形绘制策略(性能)

图形绘制策略(性能)
EN

Stack Overflow用户
提问于 2013-12-19 18:49:01
回答 2查看 146关注 0票数 2

在我的游戏中,我有一个游戏面板,它画我的地图层:‘地面/建筑物/物体层’,然后是玩家精灵,然后是敌人/npcs/暴徒,然后是‘上层(在玩家上面画瓷砖)’。它运行得很好,运行也很顺利。

然后,我开始编写一个JInternalFrame地图。这看起来很适合我需要的东西,但我关心的是表现。在添加了地图之后,我注意到绘画的速度有所放缓。我最大的决议是支持一张地图:

代码语言:javascript
复制
else if (scrnsize.width >= 1440 && scrnsize.height >= 1024){ //large&wide
    //45x29(32x32px tiles)
    //1440, 1024

基本上,我的问题是,我是否有更好的方法(比下面的代码)或方法,我可以调用屏幕外的缓冲区或其他什么?

这是地图代码。如您所见,我在paintComponent中有逻辑不重新绘制,除非refreshMinimap ==真(播放机移动或死亡)。这帮助消除了大多数明显的滞后,但我仍然注意到一些。任何帮助都是非常感谢的。

代码语言:javascript
复制
public MinimapGamePanel() {
    super();
    logger.addAppender(GUILog4JFileHelper.fileAppender);
    gamePanelImage = new BufferedImage(32 * MyClient.xTiles, 32 * MyClient.yTiles, BufferedImage.TYPE_INT_ARGB);
    setLayout(new BorderLayout());
    setBorder(BorderFactory.createLineBorder(Color.black));
}

public void paintComponent(Graphics g) {
    logger.trace("begin: REPAINTNG...");
    g2 = (Graphics2D)g;
    //map

    if (refreshMinimap){
        RefreshMinimap();
        refreshMinimap = false;
    }
    g2.drawImage(gamePanelImage, 0, 0, null);

    g2.dispose();

    logger.trace("end: REPAINTNG...");
}

private void RefreshMinimap() {
    logger.trace("Map drawing started.");
    int count = (int) ((MyClient.characterX - (MyClient.xTiles*1.5)) + ((MyClient.characterY - (MyClient.yTiles*2)) * MyClient.mapWidth));
    for (int x = 0; x < MyClient.xTiles*3; x++){
        for (int y = 0; y < MyClient.yTiles*4; y++){
            if (count > -1  && count < (MyClient.mapWidth * MyClient.mapHeight)){
                if (!MyClient.groundLayer[count].equals("0")){ //don't draw full transparent tiles
                    //SpriteStore.get().getSprite("images/tiles/" + MyClient.groundLayer[count] + ".png").draw(gamePanelImage, x, y);
                    SpriteStore.get().getSprite("images/tiles/" + MyClient.groundLayer[count] + ".png").drawFirstPixel(gamePanelImage, x, y);   
                }
                if (!MyClient.buildingLayer[count].equals("0")){ //don't draw full transparent tiles
                    SpriteStore.get().getSprite("images/tiles/" + MyClient.buildingLayer[count] + ".png").drawFirstPixel(gamePanelImage, x, y);
                }
                if (!MyClient.objectLayer[count].equals("0")){ //don't draw full transparent tiles
                    SpriteStore.get().getSprite("images/tiles/" + MyClient.objectLayer[count] + ".png").drawFirstPixel(gamePanelImage, x, y);
                }
            } else {
                SpriteStore.get().getSprite("images/tiles/" + MyClient.groundLayer[0] + ".png").drawFirstPixel(gamePanelImage, x, y);
            }
            count += MyClient.mapWidth;
        }
        count -= MyClient.yTiles * 4 * MyClient.mapWidth;
        count++;
    }
    logger.trace("Map drawing done.");
}

这是绘制像素0,0的绘图代码。

代码语言:javascript
复制
public void drawFirstPixel(BufferedImage gamePanelImage, int xDraw, int yDraw) {
    BufferedImage bufferedVersion = (BufferedImage) image;
    gamePanelImage.getGraphics().drawImage(bufferedVersion.getSubimage(0, 0, 1, 1), xDraw, yDraw, null);    
}

实际上,我对只取0,0像素的外观非常满意。抱歉,质量不好,手机照片不稳定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-19 20:08:57

这和你们建议我做的一致吗?

代码语言:javascript
复制
public class MinimapGamePanel extends JPanel {
    ...
    private static Thread t;

    public MinimapGamePanel() {
        super();
        logger.addAppender(GUILog4JFileHelper.fileAppender);
        gamePanelImage = new BufferedImage(320, 320, BufferedImage.TYPE_INT_ARGB);
        //TODO:: change values above upon picking minimap size
        setLayout(new BorderLayout());
        setBorder(BorderFactory.createLineBorder(Color.black));
        t = new Thread(new RefreshMinimapThread());
    }

    public void paintComponent(Graphics g) {
        logger.trace("begin: REPAINTNG...");
        g2 = (Graphics2D)g;

        if (refreshMinimap){

            t.start();
            //RefreshMinimap();
            refreshMinimap = false;
        }
        g2.drawImage(gamePanelImage, 0, 0, null);

        g2.dispose();

        logger.trace("end: REPAINTNG...");
    }

    private class RefreshMinimapThread implements Runnable {
        @Override
        public void run() {
            RefreshMinimap();
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2013-12-19 19:25:45

在添加了地图之后,我注意到绘画的速度有所放缓。

代码语言:javascript
复制
SpriteStore.get().getSprite("images/tiles/" + MyClient.buildingLayer

不要用绘画的方法做I/O。创建类时,应将所有图像读入内存。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20689411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档