如果事件永远不会改变,将事件存储在调度程序上似乎更有效。是不是造成它们代价高昂?如果我发送一个已存储的事件,是否会丢失某些信息?
答案 0 :(得分:4)
基本上你的要求是对象池的特定用例,以及对象池与对象创建的性能。像Java这样的语言没有从对象池中获得太多好处,因为Java会为你做这件事。并且它比你自己做的更好。事实上,Java工程师已经明确表示不应该这样做,因为Java会比你更好地分配,扩展和处理数千个对象。这就是GC的重点。 Java中的对象分配已经在为您做池化,但是在较低级别,这就是为什么Java和其他语言中的内存分配比C更快的原因。在Java中分配的每个对象都来自JVM的现成内存池。
http://www.ibm.com/developerworks/java/library/j-jtp09275.html?ca=dgr-jw22JavaUrbanLegends
在调度时创建事件而不是缓存它们的另一个原因是它们携带的参数在每个调度之间发生变化。例如,键入了什么字符,点击了鼠标等等。回收事件听起来可能是一个好主意,直到你这样做,并且突然间你发送错误事件的旧信息。最好每次都重新启动该事件,并使用正确的数据正确初始化自己。它对作者来说更简单,更不容易出错。
如果重复使用事件,也可能会遇到技术问题。事件取消方案通常将该信息存储在由某个监听器发送后修改的事件中。在actionscript中,您可以说event.preventDefault()来影响事件侦听器的链接。如果在调用preventDefault之后开始重用该事件会发生什么?并且在什么时候可以安全地说这个事件没有被尚未触发的监听器使用(callLater / invokeLater使其变得困难)。 Java / Actionscript中没有回调说这个事件可以重用(没有回收语义将对象返回到池中)。
这并不是说你可以找到一个案例来抓住事件并重新使用它表现得更好。但是,仅仅因为它对于那些高性能案例来说更快,并不意味着它每次都是一个好主意。请记住,在知道存在问题之前不要进行优化。