热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

DirectDraw高手请进:请教lock了surface之后怎样才能快速对其内容操作

一般在DirectDraw中,平常只要用BltFast就能搞定大部分情况,但是有时要做一些特殊效果的时候就不能用BltFast了,比如物体变白,淡入淡出等,这时就要用Lock来直接访问内存。我写了
一般在DirectDraw中,平常只要用BltFast就能搞定大部分情况,但是有时要做一些特殊效果的时候就不能用BltFast了,比如物体变白,淡入淡出等,这时就要用Lock来直接访问内存。
我写了一个物体变白的函数,用到了LOCK,可是不够快,之后我参考了某外国人的文章,把算法改进为按DWORD填充,可还是太慢。
我的问题是:怎样才能使直接访问内存的速度能比较接近BltFast的速度。最好能具体点,给出算法。
请高手指教。

11 个解决方案

#1


按我的经验,表面处理最大的瓶颈正是在Lock Surface的时候。
最有效的办法就是把特效放到最后一起作,只Lock一次表面。

#2


1,将所有的特效尽量的放到一起(尽量的放到最后)
2。尽量用汇编语言写你的函数,因为其调度非常的频繁
3。如果你的计算机支持MMX (通常都支持哦),使用这些多媒体指令
4,优化算法,注意流水线指令对寄存器的读写要求,尽量减少他由于指令的顺序引起的延时
5,所有的特效尽可能在后台surface上完成

#3


有道理,多谢。
不过我发现特效也很费时间,我曾试过只lock,并不慢。
我想问的就是lock后怎样才能更快?

#4


那么只能通过好的算法或硬件加速了.
ddraw特效可参考CDX的代码.

#5


你可以做一个比较硬件Blt和Lock surface后直接位块传输速度的测试看看,锁表面的那个速度会远远慢于Blt的那个。所以说关键不在于如何优化Lock和Unlock之间的代码,而在于减少Lock的次数。

#6


那完全要看你想实现的效果难度和你的算法如何了,比如说你想实现像 Pixel Shader 一样的像素级的光影效果,那么你一定要有一个简单的、近似的算法,否则 fps 受不了

#7


我曾试过用lock()得到显存地址,再直接在显存进行直接读取,我感觉不慢!

#8


我发现即使是简单的特效如反白,淡入淡出等用到我编的游戏中也会使游戏明显变慢。
那么请问,如果要少用lock(),那么怎么做才能实现这些特效?(事先画好似乎不太现实),如果用lock(),那末又需要什么技巧?

#9


我的方法是打开D3D的硬件加速功能,用D3DXDrawSpriteSimple()就可以了.速度爽及!反正现在的显示卡全都这么厉害.

#10


to
finalvictory:

请问D3DXDrawSpriteSimple()是什么函数?我在MSDN中没有找到(最新的,有dx8.1)。

#11


根据我的经验,Lock()Unlock()的开销看为常数,不要过多计较。

但要注意读显存的速度比写的速度慢一个数量级(在我的GF256上约为30:1),所以结论是不要读大块显存,只进行写操作,否则就不会有你所要的那种快了。

推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 在 Java 中,final 修饰符用于声明不可变的变量。然而,对于集合类型(如 List、Set 等),final 只是防止变量引用被重新赋值,但并不阻止集合内部元素的增删操作。本文将详细解释这一现象。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
author-avatar
天堂寨旅游2013_668
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有