优化与实战:《图形编程黑书》第二章探讨高级语言与汇编性能调优

需积分: 9 1 下载量 90 浏览量 更新于2024-11-26 收藏 2.71MB PDF 举报
在Michael Abrash的《图形编程黑书》第二章中,作者深入探讨了汇编语言优化在计算机图形编程中的重要性。章节标题"AWorldApart: Nature of Assembly Language Optimization"强调了在性能调优过程中,尽管高级语言如C/C++在许多情况下更为常用,但汇编语言的威力不容忽视。优化并非总是简单地降低高级代码的复杂性,而是需要在确保没有低效实现或拙劣编码拖累性能之后,才考虑转向汇编。 在性能瓶颈的挖掘中,作者指出,使用汇编语言时务必谨慎且正确。许多人对汇编代码可能带来的潜在慢速运行缺乏充分理解,但实际上,特别是在图形处理这类对性能要求极高的领域,汇编语言的效能提升是巨大的。例如, Doom 和 Quake 3D 游戏背后的图形技术,如纹理映射、隐藏表面去除等复杂问题,都需要精细的汇编语言技巧来解决,因为这些优化往往发生在低级别的硬件操作层面,与C/C++语言的执行环境截然不同。 作者举了一个实例,讲述了一次实际任务:对一个关键的汇编子程序进行优化,目标是使其运行速度达到极致。这个子程序负责构建一个 nibble(四分之一字节),在性能至关重要时,汇编语言的每一个细节都会影响最终结果。通过展示这种实战场景,读者可以学习到如何在实际项目中应用汇编语言优化,理解其独特的优势以及在何时何地选择正确的优化策略。 第二章引导读者深入了解汇编语言在图形编程中的特殊角色,强调了它在性能优化中的微妙之处,并通过具体例子展示了如何在必要时巧妙地利用汇编语言进行高级性能调整。对于想要在图形编程领域深入探索或者寻求极致性能的开发者来说,这一章提供了宝贵的实践经验和技术指导。

优化这段代码能产生不同的单元格宽度:public void myGraphicsGeneration(String name,String cellsValue[][], String path) { // 字体大小 int fontTitileSize = 15; // 横线的行数 int totalrow = cellsValue.length+1; // 竖线的行数 int totalcol = 0; if (cellsValue[0] != null) { totalcol = cellsValue[0].length; } // 图片宽度 int imageWidth = 1024; // 行高 int rowheight = 40; // 图片高度 int imageHeight = totalrow*rowheight+50; // 起始高度 int startHeight = 10; // 起始宽度 int startWidth = 10; // 单元格宽度 int colwidth = (int)((imageWidth-20)/totalcol); BufferedImage image = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB); Graphics graphics = image.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0,0, imageWidth, imageHeight); graphics.setColor(new Color(220,240,240)); //画横线 for(int j=0;j<totalrow; j++){ graphics.setColor(Color.black); graphics.drawLine(startWidth, startHeight + (j + 1) * rowheight, startWidth + colwidth * totalcol, startHeight + (j + 1) * rowheight); } //画竖线 for(int k=0;k<totalcol+1;k++){ graphics.setColor(Color.black); graphics.drawLine(startWidth + k * colwidth, startHeight + rowheight, startWidth + k * colwidth, startHeight + rowheight * totalrow); } //设置字体 Font font = new Font("微软雅黑",Font.BOLD,fontTitileSize); graphics.setFont(font); //写标题 String title = "【"+ name +"】"; graphics.drawString(title, startWidth, startHeight+rowheight-10); //写入内容 for(int n=0;n<cellsValue.length;n++){ for(int l=0;l<cellsValue[n].length;l++){ if (n == 0) { font = new Font("微软雅黑",Font.BOLD,fontTitileSize); graphics.setFont(font); }else if (n > 0 && l >0) { font = new Font("微软雅黑",Font.PLAIN,fontTitileSize); graphics.setFont(font); graphics.setColor(Color.RED); } else { font = new Font("微软雅黑",Font.PLAIN,fontTitileSize); graphics.setFont(font); graphics.setColor(Color.BLACK); } if(cellsValue[n][l]==null){ cellsValue[n][l] = ""; } graphics.drawString(cellsValue[n][l].toString(), startWidth + colwidth * l + 5, startHeight + rowheight * (n + 2) - 10); } } // 保存图片 createImage(image, path); }

2023-06-06 上传